C# Serilog 日志
- Serilog 的基本概念
- 日志级别
- 日志输出目标(`Sink`)
- 安装 `Serilog`
- 配置 `Serilog`
- 程序代码中配置
- 通过配置文件配置
- 常见配置选项
- 日志级别
- 文件日志
- 控制台日志
- 数据库日志
- 使用 `Serilog` 在 `ASP.NET Core` 中
- 安装 `NuGet` 包
- 配置 `Serilog`
- 日志上下文
- 总结
Serilog
是一个流行的
.NET
日志库,用于记录应用程序的运行日志。它提供了灵活的配置方式和丰富的日志输出选项,支持将日志输出到控制台、文件、数据库、云存储等多种目标。以下是关于
Serilog
在
C#
中的使用方法和一些常见配置的介绍。
Serilog 的基本概念
日志级别
Serilog
支持多种日志级别,从低到高依次是:
Verbose
(详细):记录最详细的信息,通常用于调试。Debug
(调试):记录调试信息,比Verbose
稍低。Information
(信息):记录正常运行时的信息。Warning
(警告):记录可能影响正常运行的警告信息。Error
(错误):记录运行时的错误。Fatal
(致命):记录导致应用程序崩溃的致命错误。
日志输出目标(Sink
)
Serilog
支持多种日志输出目标,例如:
- 控制台(
Console
) - 文件(
File
) - 数据库(如
SQL Server
、MySQL
) - 云存储(如
Azure Blob Storage
、AWS S3
) - 日志聚合工具(如
Elasticsearch
、Seq
)
安装 Serilog
在 C#
项目中使用 Serilog
,首先需要安装相关的 NuGet
包。以下是一些常用的 Serilog
包:
Serilog
:核心日志库。Serilog.Sinks.Console
:将日志输出到控制台。Serilog.Sinks.File
:将日志输出到文件。Serilog.Sinks.MSSqlServer
:将日志输出到SQL Server
数据库。Serilog.Settings.Configuration
:通过配置文件(如appsettings.json
)配置Serilog
。
可以通过NuGet
包管理器安装这些包。
配置 Serilog
程序代码中配置
在代码中直接配置 Serilog
是最直接的方式。以下是一个简单的示例:
using Serilog;
using Serilog.Sinks.File;class Program
{static void Main(string[] args){// 配置日志Log.Logger = new LoggerConfiguration().MinimumLevel.Debug() // 设置最低日志级别.WriteTo.Console() // 输出到控制台.WriteTo.File("logs/log.txt", rollingInterval: RollingInterval.Day) // 输出到文件,按天滚动.CreateLogger();// 写入日志Log.Information("This is an information message.");Log.Warning("This is a warning message.");Log.Error("This is an error message.");// 关闭日志Log.CloseAndFlush();}
}
通过配置文件配置
Serilog
也支持通过配置文件(如 appsettings.json
)进行配置,这种方式更加灵活。首先需要安装 Serilog.Settings.Configuration
包:
然后在 appsettings.json
文件中配置 Serilog
:
{"Serilog": {"MinimumLevel": "Debug","WriteTo": [{"Name": "Console"},{"Name": "File","Args": {"path": "logs/log.txt","rollingInterval": "Day"}}]}
}
在程序中加载配置文件并初始化 Serilog
:
using Microsoft.Extensions.Configuration;
using Serilog;class Program
{static void Main(string[] args){// 加载配置文件var configuration = new ConfigurationBuilder().AddJsonFile("appsettings.json").Build();// 配置 SerilogLog.Logger = new LoggerConfiguration().ReadFrom.Configuration(configuration).CreateLogger();// 写入日志Log.Information("This is an information message.");Log.Warning("This is a warning message.");Log.Error("This is an error message.");// 关闭日志Log.CloseAndFlush();}
}
常见配置选项
日志级别
可以通过 MinimumLevel
设置最低日志级别,低于该级别的日志将不会被记录。例如:
Log.Logger = new LoggerConfiguration().MinimumLevel.Warning() // 只记录 Warning 及以上级别的日志.CreateLogger();
文件日志
文件日志是常用的日志输出方式。Serilog
提供了丰富的文件日志配置选项,例如:
- 文件路径:指定日志文件的存储路径。
- 滚动策略:按时间(如按天、按小时)或大小滚动日志文件。
- 保留策略:设置保留的日志文件数量或天数。
Log.Logger = new LoggerConfiguration().WriteTo.File("logs/log.txt", rollingInterval: RollingInterval.Day, retainedFileCountLimit: 7).CreateLogger();
控制台日志
控制台日志可以实时显示日志信息,方便调试。可以通过以下方式配置控制台日志:
Log.Logger = new LoggerConfiguration().WriteTo.Console(outputTemplate: "[{Timestamp:HH:mm:ss} {Level}] {Message}{NewLine}{Exception}").CreateLogger();
其中,outputTemplate
可以自定义日志的输出格式。
数据库日志
Serilog
支持将日志输出到多种数据库,例如 SQL Server
、MySQL
等。以下是将日志输出到 SQL Server
数据库的示例:
Log.Logger = new LoggerConfiguration().WriteTo.MSSqlServer(connectionString: "Server=your_server;Database=your_database;User Id=your_user;Password=your_password;",tableName: "Logs",autoCreateSqlTable: true).CreateLogger();
在数据库中,Serilog
会自动创建一个日志表(如 Logs
),并存储日志信息。
使用 Serilog
在 ASP.NET Core
中
Serilog
也可以与 ASP.NET Core
集成,为 Web
应用程序提供日志功能。以下是一个集成的示例:
安装 NuGet
包
安装以下 NuGet
包:
Serilog.AspNetCore
Serilog.Sinks.Console
Serilog.Sinks.File
配置 Serilog
在 Program.cs
文件中配置 Serilog
using Serilog;var builder = WebApplication.CreateBuilder(args);// 配置 Serilog
Log.Logger = new LoggerConfiguration().MinimumLevel.Debug().WriteTo.Console().WriteTo.File("logs/log.txt", rollingInterval: RollingInterval.Day).CreateLogger();builder.Host.UseSerilog();var app = builder.Build();app.MapGet("/", () => "Hello World!");app.Run();
在 ASP.NET Core
中,Serilog
会自动记录应用程序的生命周期事件(如启动、停止)以及中间件的日志。
日志上下文
Serilog
支持日志上下文,可以在日志中添加上下文信息,例如用户 ID、请求 ID 等。以下是一个示例:
using Serilog;
using Serilog.Context;Log.Logger = new LoggerConfiguration().WriteTo.Console().CreateLogger();using (LogContext.PushProperty("UserId", 12345))
{Log.Information("User {UserId} performed an action.", 12345);
}
在日志中,UserId
将作为上下文信息被记录。
总结
Serilog
是一个功能强大且灵活的日志库,适用于各种 .NET
应用程序。它支持多种日志输出目标和丰富的配置选项,可以满足不同的日志需求。通过合理配置 Serilog
,可以方便地记录应用程序的运行日志,帮助开发人员进行调试和问题排查。