net中Serilog 使用json配置输出日志
配置说明:
-
Using: 指定要使用的 Serilog 接收器(Sinks)。在这里,它使用了以下三个接收器:
Serilog.Sinks.Console
: 将日志输出到控制台。Serilog.Sinks.File
: 将日志写入文件。Elastic.Serilog.Sinks
: 将日志发送到 Elasticsearch。
-
MinimumLevel: 配置日志记录的最低级别。
Default
: 设置默认日志级别为Information
。Override
: 可以重写特定命名空间的日志级别,例如:Microsoft
: 设置为Information
。Microsoft.EntityFrameworkCore
: 设置为Warning
,以减少 Entity Framework Core 的日志记录。
-
WriteTo: 定义日志输出的位置和格式。
- Console:
- 输出模板:
"[{Timestamp:yyyy-MM-dd HH:mm:ss} {Level:u3}] [{CorrelationId}] {Message}{NewLine}{Exception}"
,这表示日志的格式将包括时间戳、日志级别、相关 ID、消息和异常信息。
- 输出模板:
- File:
- 日志文件路径:
Logs/log.txt
。 rollingInterval
: 日志文件按天滚动。retainedFileCountLimit
: 保留的日志文件数量限制为 7。fileSizeLimitBytes
: 设置单个日志文件的大小限制为 10 MB。- 输出模板同样与控制台的格式一致。
- 日志文件路径:
- Elasticsearch:
bootstrapMethod
: 设置为Silent
,表示在启动时不输出任何信息。nodes
: Elasticsearch 节点的地址,这里是http://127.16.34.25:9200
。username
和password
: 连接 Elasticsearch 的凭据。dataStream
: 指定要发送到的日志数据流名称,设置为logs-spc.authservice-prod
。
- Console:
-
Enrich: 用于增强日志信息,这里使用了
FromLogContext
,可以将上下文信息(如请求 ID 或用户 ID)自动添加到日志中。
"Serilog": {"Using": [ "Serilog.Sinks.Console", "Serilog.Sinks.File", "Elastic.Serilog.Sinks" ],"MinimumLevel": {"Default": "Information","Override": {"Microsoft": "Information","Microsoft.EntityFrameworkCore": "Warning"}},"WriteTo": [{"Name": "Console","Args": {"outputTemplate": "[{Timestamp:yyyy-MM-dd HH:mm:ss} {Level:u3}] [{CorrelationId}] {Message}{NewLine}{Exception}"}},{"Name": "File","Args": {"path": "Logs/log.txt","rollingInterval": "Day","retainedFileCountLimit": 7,"fileSizeLimitBytes": 104857600, // 100 MB (以字节为单位)"outputTemplate": "[{Timestamp:yyyy-MM-dd HH:mm:ss} {Level:u3}] [{CorrelationId}] {Message}{NewLine}{Exception}"}},{"Name": "Elasticsearch","Args": {"bootstrapMethod": "Silent","nodes": [ "http://127.16.34.25:9200" ],"username": "elastic","password": "123456","dataStream": "logs-spc.authservice-prod"}}],"Enrich": [ "FromLogContext" ]}
Program代码如下:
using System;
using System.IO;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Serilog;namespace SPC.Environment;public class Program
{public async static Task<int> Main(string[] args){var configuration = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile("appsettings.json").AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Production"}.json", true).Build();Log.Logger = new LoggerConfiguration().ReadFrom.Configuration(configuration).CreateLogger();try{Log.Information("Starting web host.");var builder = WebApplication.CreateBuilder(args);builder.Host.AddAppSettingsSecretsJson().UseAutofac().UseSerilog();await builder.AddApplicationAsync<EnvironmentServiceHttpApiHostModule>();var app = builder.Build();await app.InitializeApplicationAsync();await app.RunAsync();return 0;}catch (Exception ex){if (ex is HostAbortedException){throw;}Log.Fatal(ex, "Host terminated unexpectedly!");return 1;}finally{Log.CloseAndFlush();}}
}
dotnet add package Serilog
dotnet add package Serilog.Sinks.Console
dotnet add package Serilog.Sinks.File
dotnet add package Elastic.Serilog.Sinks
dotnet add package Serilog.Extensions.Logging
dotnet add package Serilog.Enrichers.Context