簡體   English   中英

如何從 Serilog 中排除特定的異常類型?

[英]How to exclude specific exception types from Serilog?

我正在使用 Serilog 記錄有關托管在 IIS 上的asp.net core 2.1應用程序的信息。 當發生異常時,我會收到 email 的通知。 問題是,一些例外情況的發生根本不會損害應用程序,我不想在每次發生時都被注意到。

Serilog 中有沒有辦法從記錄中排除特定的異常類型?

編輯:

以下是我在 Program.cs 中配置 Serilog 的方式:

using System;
using System.Data;
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Serilog;
using Serilog.Sinks.MSSqlServer;

namespace Some_App
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var configuration = new ConfigurationBuilder()
                .AddJsonFile(Environment.CurrentDirectory + "/appsettings.json")
                .Build();

            var columnOptions = new ColumnOptions {
                AdditionalDataColumns = new System.Collections.ObjectModel.Collection<DataColumn>
                {
                    new DataColumn {DataType = typeof (string), ColumnName = "email", DefaultValue = "myemail@myemail.com", MaxLength = 4000},
                    new DataColumn {DataType = typeof (string), ColumnName = "subject", DefaultValue = "Application error", MaxLength = 4000},
                }
            };
            columnOptions.Store.Remove(StandardColumn.Level);
            columnOptions.Store.Remove(StandardColumn.LogEvent);
            columnOptions.Store.Remove(StandardColumn.Message);
            columnOptions.Store.Remove(StandardColumn.MessageTemplate);
            columnOptions.Store.Remove(StandardColumn.Properties);
            columnOptions.Store.Remove(StandardColumn.TimeStamp);
            columnOptions.Exception.ColumnName = "message";
            columnOptions.Id.ColumnName = "id";
            columnOptions.DisableTriggers = true;

            Log.Logger = new LoggerConfiguration()
                .MinimumLevel.Debug()
                .MinimumLevel.Override("Microsoft", Serilog.Events.LogEventLevel.Information)
                .Enrich.FromLogContext()
                .Filter.ByExcluding(ObjectDisposedException) //What is the right way to tell Serilog to ignore this type of exception?
                .WriteTo.RollingFile("logs\\log-{Hour}.txt", retainedFileCountLimit: 168)
                .WriteTo.MSSqlServer(
                connectionString: configuration.GetConnectionString("DefaultConnection"),
                tableName: "emailtosend",
                columnOptions: columnOptions,
                restrictedToMinimumLevel: Serilog.Events.LogEventLevel.Error
                )
                .CreateLogger();

            CreateWebHostBuilder(args).Build().Run();
        }

        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>()
                .UseSerilog();
    }
}

編輯2:

@reza baiat、@GoldenAge 和 @Alessandro Di Cicco:當然,您的回答可以讓我處理異常,但僅限於在 Serilog 記錄器之外發生的異常。 Serilog 是一個日志庫,它取代了 Microsoft 的默認庫,使我能夠省略代碼的 rest 中的所有 Try/Catch,因為它會將它們全部記錄在(在我的情況下)一個日志文件和一個 SQL 表中。 我想做的事情是告訴 Serilog 不要記錄,例如,在關鍵代碼中發生的ObjectDisposedException異常。 我猜 Try/Catch 在我的代碼中令人困惑,所以我將從我的示例中刪除它,因為它不相關。 一旦應用程序構建並運行,Serilog 將捕獲任何引發的異常。 我在想的可能是這樣的額外 Serilog 配置行: .Filter.ByExcluding(ObjectDisposedException)或類似的東西。 可能嗎?

謝謝

我正在使用 Serilog 記錄有關托管在 IIS 上的asp.net core 2.1應用程序的信息。 當發生異常時,我會收到電子郵件通知。 問題是,一些異常的發生根本不會損害應用程序,我不想每次發生時都被注意到。

Serilog 中有沒有辦法從記錄中排除特定的異常類型?

編輯 :

這是我在 Program.cs 中配置 Serilog 的方式:

using System;
using System.Data;
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Serilog;
using Serilog.Sinks.MSSqlServer;

namespace WindZone_Warehouse_Mobile_App
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var configuration = new ConfigurationBuilder()
                .AddJsonFile(Environment.CurrentDirectory + "/appsettings.json")
                .Build();

            var columnOptions = new ColumnOptions {
                AdditionalDataColumns = new System.Collections.ObjectModel.Collection<DataColumn>
                {
                    new DataColumn {DataType = typeof (string), ColumnName = "email", DefaultValue = "myemail@myemail.com", MaxLength = 4000},
                    new DataColumn {DataType = typeof (string), ColumnName = "subject", DefaultValue = "Application error", MaxLength = 4000},
                }
            };
            columnOptions.Store.Remove(StandardColumn.Level);
            columnOptions.Store.Remove(StandardColumn.LogEvent);
            columnOptions.Store.Remove(StandardColumn.Message);
            columnOptions.Store.Remove(StandardColumn.MessageTemplate);
            columnOptions.Store.Remove(StandardColumn.Properties);
            columnOptions.Store.Remove(StandardColumn.TimeStamp);
            columnOptions.Exception.ColumnName = "message";
            columnOptions.Id.ColumnName = "id";
            columnOptions.DisableTriggers = true;

            Log.Logger = new LoggerConfiguration()
                .MinimumLevel.Debug()
                .MinimumLevel.Override("Microsoft", Serilog.Events.LogEventLevel.Information)
                .Enrich.FromLogContext()
                .Filter.ByExcluding(ObjectDisposedException) //What is the right way to tell Serilog to ignore this type of exception?
                .WriteTo.RollingFile("logs\\log-{Hour}.txt", retainedFileCountLimit: 168)
                .WriteTo.MSSqlServer(
                connectionString: configuration.GetConnectionString("DefaultConnection"),
                tableName: "emailtosend",
                columnOptions: columnOptions,
                restrictedToMinimumLevel: Serilog.Events.LogEventLevel.Error
                )
                .CreateLogger();

            CreateWebHostBuilder(args).Build().Run();
        }

        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>()
                .UseSerilog();
    }
}

編輯2:

@reza baiat、@GoldenAge 和 @Alessandro Di Cicco:當然,您的回答將允許我處理異常,但僅限於發生在 Serilog 記錄器之外的異常。 Serilog 是一個日志庫,它取代了 Microsoft 的默認庫,使我能夠省略其余代碼中的所有 Try/Catch,因為它將全部記錄在(在我的情況下)日志文件和 SQL 表中。 我想做的事情是告訴 Serilog 不要記錄,例如,在關鍵代碼中發生的ObjectDisposedException異常。 我猜我的代碼中的 Try/Catch 令人困惑,所以我將從我的示例中刪除它,因為它不相關。 一旦應用程序構建並運行,Serilog 將捕獲拋出的任何異常。 我在想的可能是像這樣的額外 Serilog 配置行: .Filter.ByExcluding(ObjectDisposedException)或類似的東西。 是否可以?

謝謝

我正在使用 Serilog 記錄有關托管在 IIS 上的asp.net core 2.1應用程序的信息。 當發生異常時,我會收到電子郵件通知。 問題是,一些異常的發生根本不會損害應用程序,我不想每次發生時都被注意到。

Serilog 中有沒有辦法從記錄中排除特定的異常類型?

編輯 :

這是我在 Program.cs 中配置 Serilog 的方式:

using System;
using System.Data;
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Serilog;
using Serilog.Sinks.MSSqlServer;

namespace WindZone_Warehouse_Mobile_App
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var configuration = new ConfigurationBuilder()
                .AddJsonFile(Environment.CurrentDirectory + "/appsettings.json")
                .Build();

            var columnOptions = new ColumnOptions {
                AdditionalDataColumns = new System.Collections.ObjectModel.Collection<DataColumn>
                {
                    new DataColumn {DataType = typeof (string), ColumnName = "email", DefaultValue = "myemail@myemail.com", MaxLength = 4000},
                    new DataColumn {DataType = typeof (string), ColumnName = "subject", DefaultValue = "Application error", MaxLength = 4000},
                }
            };
            columnOptions.Store.Remove(StandardColumn.Level);
            columnOptions.Store.Remove(StandardColumn.LogEvent);
            columnOptions.Store.Remove(StandardColumn.Message);
            columnOptions.Store.Remove(StandardColumn.MessageTemplate);
            columnOptions.Store.Remove(StandardColumn.Properties);
            columnOptions.Store.Remove(StandardColumn.TimeStamp);
            columnOptions.Exception.ColumnName = "message";
            columnOptions.Id.ColumnName = "id";
            columnOptions.DisableTriggers = true;

            Log.Logger = new LoggerConfiguration()
                .MinimumLevel.Debug()
                .MinimumLevel.Override("Microsoft", Serilog.Events.LogEventLevel.Information)
                .Enrich.FromLogContext()
                .Filter.ByExcluding(ObjectDisposedException) //What is the right way to tell Serilog to ignore this type of exception?
                .WriteTo.RollingFile("logs\\log-{Hour}.txt", retainedFileCountLimit: 168)
                .WriteTo.MSSqlServer(
                connectionString: configuration.GetConnectionString("DefaultConnection"),
                tableName: "emailtosend",
                columnOptions: columnOptions,
                restrictedToMinimumLevel: Serilog.Events.LogEventLevel.Error
                )
                .CreateLogger();

            CreateWebHostBuilder(args).Build().Run();
        }

        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>()
                .UseSerilog();
    }
}

編輯2:

@reza baiat、@GoldenAge 和 @Alessandro Di Cicco:當然,您的回答將允許我處理異常,但僅限於發生在 Serilog 記錄器之外的異常。 Serilog 是一個日志庫,它取代了 Microsoft 的默認庫,使我能夠省略其余代碼中的所有 Try/Catch,因為它將全部記錄在(在我的情況下)日志文件和 SQL 表中。 我想做的事情是告訴 Serilog 不要記錄,例如,在關鍵代碼中發生的ObjectDisposedException異常。 我猜我的代碼中的 Try/Catch 令人困惑,所以我將從我的示例中刪除它,因為它不相關。 一旦應用程序構建並運行,Serilog 將捕獲拋出的任何異常。 我在想的可能是像這樣的額外 Serilog 配置行: .Filter.ByExcluding(ObjectDisposedException)或類似的東西。 是否可以?

謝謝

我正在使用 Serilog 記錄有關托管在 IIS 上的asp.net core 2.1應用程序的信息。 當發生異常時,我會收到電子郵件通知。 問題是,一些異常的發生根本不會損害應用程序,我不想每次發生時都被注意到。

Serilog 中有沒有辦法從記錄中排除特定的異常類型?

編輯 :

這是我在 Program.cs 中配置 Serilog 的方式:

using System;
using System.Data;
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Serilog;
using Serilog.Sinks.MSSqlServer;

namespace WindZone_Warehouse_Mobile_App
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var configuration = new ConfigurationBuilder()
                .AddJsonFile(Environment.CurrentDirectory + "/appsettings.json")
                .Build();

            var columnOptions = new ColumnOptions {
                AdditionalDataColumns = new System.Collections.ObjectModel.Collection<DataColumn>
                {
                    new DataColumn {DataType = typeof (string), ColumnName = "email", DefaultValue = "myemail@myemail.com", MaxLength = 4000},
                    new DataColumn {DataType = typeof (string), ColumnName = "subject", DefaultValue = "Application error", MaxLength = 4000},
                }
            };
            columnOptions.Store.Remove(StandardColumn.Level);
            columnOptions.Store.Remove(StandardColumn.LogEvent);
            columnOptions.Store.Remove(StandardColumn.Message);
            columnOptions.Store.Remove(StandardColumn.MessageTemplate);
            columnOptions.Store.Remove(StandardColumn.Properties);
            columnOptions.Store.Remove(StandardColumn.TimeStamp);
            columnOptions.Exception.ColumnName = "message";
            columnOptions.Id.ColumnName = "id";
            columnOptions.DisableTriggers = true;

            Log.Logger = new LoggerConfiguration()
                .MinimumLevel.Debug()
                .MinimumLevel.Override("Microsoft", Serilog.Events.LogEventLevel.Information)
                .Enrich.FromLogContext()
                .Filter.ByExcluding(ObjectDisposedException) //What is the right way to tell Serilog to ignore this type of exception?
                .WriteTo.RollingFile("logs\\log-{Hour}.txt", retainedFileCountLimit: 168)
                .WriteTo.MSSqlServer(
                connectionString: configuration.GetConnectionString("DefaultConnection"),
                tableName: "emailtosend",
                columnOptions: columnOptions,
                restrictedToMinimumLevel: Serilog.Events.LogEventLevel.Error
                )
                .CreateLogger();

            CreateWebHostBuilder(args).Build().Run();
        }

        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>()
                .UseSerilog();
    }
}

編輯2:

@reza baiat、@GoldenAge 和 @Alessandro Di Cicco:當然,您的回答將允許我處理異常,但僅限於發生在 Serilog 記錄器之外的異常。 Serilog 是一個日志庫,它取代了 Microsoft 的默認庫,使我能夠省略其余代碼中的所有 Try/Catch,因為它將全部記錄在(在我的情況下)日志文件和 SQL 表中。 我想做的事情是告訴 Serilog 不要記錄,例如,在關鍵代碼中發生的ObjectDisposedException異常。 我猜我的代碼中的 Try/Catch 令人困惑,所以我將從我的示例中刪除它,因為它不相關。 一旦應用程序構建並運行,Serilog 將捕獲拋出的任何異常。 我在想的可能是像這樣的額外 Serilog 配置行: .Filter.ByExcluding(ObjectDisposedException)或類似的東西。 是否可以?

謝謝

不幸的是,我沒有業力在 Grzegorz Smulko 的回答下面寫評論,所以我將復制並更正它:

Log.Logger = new LoggerConfiguration()
    .MinimumLevel.Debug()
    ...
    .Filter
      .ByExcluding(logEvent => logEvent.Exception is OperationCanceledException)
    ...
    .CreateLogger();

使用is運算符,我們可以按類的層次結構進行過濾: OperationCanceledExceptionTaskCanceledException等。

我正在使用Serilog來記錄有關IIS上托管的asp.net core 2.1應用程序的信息。 發生例外情況時,會通過電子郵件通知我。 問題是,發生了一些異常情況,而絲毫沒有損害應用程序,因此我不想每次發生時都被注意。

Serilog中是否有一種方法可以排除特定的異常類型?

編輯 :

這是我在Program.cs中配置Serilog的方法:

using System;
using System.Data;
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Serilog;
using Serilog.Sinks.MSSqlServer;

namespace WindZone_Warehouse_Mobile_App
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var configuration = new ConfigurationBuilder()
                .AddJsonFile(Environment.CurrentDirectory + "/appsettings.json")
                .Build();

            var columnOptions = new ColumnOptions {
                AdditionalDataColumns = new System.Collections.ObjectModel.Collection<DataColumn>
                {
                    new DataColumn {DataType = typeof (string), ColumnName = "email", DefaultValue = "myemail@myemail.com", MaxLength = 4000},
                    new DataColumn {DataType = typeof (string), ColumnName = "subject", DefaultValue = "Application error", MaxLength = 4000},
                }
            };
            columnOptions.Store.Remove(StandardColumn.Level);
            columnOptions.Store.Remove(StandardColumn.LogEvent);
            columnOptions.Store.Remove(StandardColumn.Message);
            columnOptions.Store.Remove(StandardColumn.MessageTemplate);
            columnOptions.Store.Remove(StandardColumn.Properties);
            columnOptions.Store.Remove(StandardColumn.TimeStamp);
            columnOptions.Exception.ColumnName = "message";
            columnOptions.Id.ColumnName = "id";
            columnOptions.DisableTriggers = true;

            Log.Logger = new LoggerConfiguration()
                .MinimumLevel.Debug()
                .MinimumLevel.Override("Microsoft", Serilog.Events.LogEventLevel.Information)
                .Enrich.FromLogContext()
                .Filter.ByExcluding(ObjectDisposedException) //What is the right way to tell Serilog to ignore this type of exception?
                .WriteTo.RollingFile("logs\\log-{Hour}.txt", retainedFileCountLimit: 168)
                .WriteTo.MSSqlServer(
                connectionString: configuration.GetConnectionString("DefaultConnection"),
                tableName: "emailtosend",
                columnOptions: columnOptions,
                restrictedToMinimumLevel: Serilog.Events.LogEventLevel.Error
                )
                .CreateLogger();

            CreateWebHostBuilder(args).Build().Run();
        }

        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>()
                .UseSerilog();
    }
}

編輯2:

@reza baiat,@ GoldenAge和@Alessandro Di Cicco:當然,您的回答將使我能夠處理異常,但僅發生在Serilog記錄器之外的異常。 Serilog是一個日志記錄庫,它代替了Microsoft的默認庫,使我能夠省略其余代碼中的所有Try / Catch,因為它將全部記錄在一個日志文件和一個SQL表中(在我的情況下)。 我要嘗試做的是告訴Serilog不要記錄日志,例如,關鍵代碼內發生的ObjectDisposedException異常。 我猜Try / Catch在我的代碼中令人困惑,因此我將其從示例中刪除,因為它不相關。 一旦構建並運行應用程序,Serilog將捕獲任何引發的異常。 我在想的可能是另外的Serilog配置行,例如: .Filter.ByExcluding(ObjectDisposedException)或類似的東西。 可能嗎?

謝謝

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM