Serilog:记录到不同的文件
本文关键字:文件 记录 Serilog | 更新日期: 2023-09-27 17:57:55
无论LogLevel如何,我都会将所有类型的事件记录到单个Json文件中。现在我需要将一些自定义性能计数器记录到一个单独的Json文件中。如何在Serilog中做到这一点。我是否应该创建不同的Logger实例,并在记录性能计数器时使用该实例?想要将其与LibLog 一起使用
您可以首先确保性能计数器事件标记有特定的属性值(LibLog中的OpenMappedContext()
)或来自特定类型/命名空间。
var log = LogProvider.For<MyApp.Performance.SomeCounter>()
log.Info(...);
配置Serilog时,应用了筛选器的子记录器可以将所需的事件仅发送到第二个文件。
Log.Logger = new LoggerConfiguration()
.WriteTo.Logger(lc => lc
.Filter.ByExcluding(Matching.FromSource("MyApp.Performance"))
.WriteTo.File("first.json", new JsonFormatter()))
.WriteTo.Logger(lc => lc
.Filter.ByIncludingOnly(Matching.FromSource("MyApp.Performance"))
.WriteTo.File("second.json", new JsonFormatter()))
.CreateLogger();
我们也可以在配置文件中设置它。以下是appsettings.json
中的一个示例,用于根据级别拆分日志滚动文件
{
"Serilog": {
"MinimumLevel": {
"Default": "Debug",
"Override": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"WriteTo": [
{
"Name": "Logger",
"Args": {
"configureLogger": {
"Filter": [
{
"Name": "ByIncludingOnly",
"Args": {
"expression": "(@Level = 'Error' or @Level = 'Fatal' or @Level = 'Warning')"
}
}
],
"WriteTo": [
{
"Name": "File",
"Args": {
"path": "Logs/ex_.log",
"outputTemplate": "{Timestamp:o} [{Level:u3}] ({SourceContext}) {Message}{NewLine}{Exception}",
"rollingInterval": "Day",
"retainedFileCountLimit": 7
}
}
]
}
}
},
{
"Name": "Logger",
"Args": {
"configureLogger": {
"Filter": [
{
"Name": "ByIncludingOnly",
"Args": {
"expression": "(@Level = 'Information' or @Level = 'Debug')"
}
}
],
"WriteTo": [
{
"Name": "File",
"Args": {
"path": "Logs/cp_.log",
"outputTemplate": "{Timestamp:o} [{Level:u3}] ({SourceContext}) {Message}{NewLine}{Exception}",
"rollingInterval": "Day",
"retainedFileCountLimit": 7
}
}
]
}
}
}
],
"Enrich": [
"FromLogContext",
"WithMachineName"
],
"Properties": {
"Application": "MultipleLogFilesSample"
}
}
}
然后,您只需要修改Program.cs
文件中的CreateHostBuilder
方法即可从配置文件中读取
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
})
.UseSerilog((hostingContext, loggerConfig) =>
loggerConfig.ReadFrom.Configuration(hostingContext.Configuration)
);
有关更多详细信息,请参阅此处的文章
如果您想拥有一个独立的日志记录管道,只需创建另一个实例即可。这是从https://github.com/serilog/serilog/wiki/Lifecycle-of-Loggers:
using (var performanceCounters = new LoggerConfiguration()
.WriteTo.File(@"myapp'log.txt")
.CreateLogger())
{
performanceCounters.Information("Performance is really good today ;-)");
// Your app runs, then disposal of `performanceCounters` flushes any buffers
}
我使用以下代码将不同级别的日志记录到不同的文件中。
var conn = configuration.GetSection("ConnectionStrings:SqlConn").Value;
var serilogLogger = new LoggerConfiguration()
.MinimumLevel.Information()
.WriteTo.Console()
.WriteTo.MSSqlServer(conn, new MSSqlServerSinkOptions { TableName = "ErrorLogs", AutoCreateSqlTable = true }, restrictedToMinimumLevel: Serilog.Events.LogEventLevel.Warning)
.WriteTo.MSSqlServer(conn, new MSSqlServerSinkOptions { TableName = "InfoLogs", AutoCreateSqlTable = true }, restrictedToMinimumLevel: Serilog.Events.LogEventLevel.Information)
.CreateLogger();