[英]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
運算符,我們可以按類的層次結構進行過濾: OperationCanceledException
、 TaskCanceledException
等。
我正在使用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.