Serilog 是一个用于.NET应用程序的日志记录开源库, 以功能强大的结构化事件数据为基础构建的,支持将日志输出到控制台、文件、数据库和其它更多的方式。
Serilog 六神装
也可以根据不用的需求进行包的修改删除, 其中Serilog.Settings.Configuration
是读取配置文件的,Serilog.Sinks.Console
是打印到控制台的,Serilog.Sinks.File
是写入文件的,Serilog.Sinks.Async
是用来异步写入的,一般都需要引入用。
示例
直接先上能复制粘贴了就能用的的demo:
using Microsoft.Extensions.Logging;
using Serilog;
public static class LoggerFactory
{
public static ILoggerFactory Instance { get; }
public static ILogger<T> GetLogger<T>() => Instance.CreateLogger<T>();
static LoggerFactory()
{
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Information()
.WriteTo.Async(a => a.Console())
.WriteTo.Async(a => a.File("Logs/log-.txt", rollingInterval: RollingInterval.Day))
.CreateLogger();
Instance = new Microsoft.Extensions.Logging.LoggerFactory().AddSerilog();
}
}
使用 WriteTo.Async() 方法为控制台和文件日志记录创建了异步管道。通过这种方式,写入文件和控制台的日志记录操作将不会阻塞主线程。
public class WebServerManager
{
private readonly ILogger<WebServerManager> _logger = LoggerFactory.GetLogger<WebServerManager>();
public void LogExamples()
{
_logger.LogTrace("This is a trace level log.");
_logger.LogDebug("This is a debug level log.");
_logger.LogInformation("This is an information level log.");
_logger.LogWarning("This is a warning level log.");
_logger.LogError("This is an error level log.");
_logger.LogCritical("This is a critical level log.");
}
// ...其他代码...
}
在应用程序中的合适位置调用这些方法以记录相应级别的日志。此外,还可以根据需要在 Serilog
配置中设置最小日志级别。
例如,要将最小日志级别设置为 Warning
,可以在 LoggerFactory
类中的 LoggerConfiguration
中添加 .MinimumLevel.Warning()
。这将确保只有 Warning
、Error
和 Critical
级别的日志被记录。
特性
Serilog
的一些关键特性:
- 结构化日志记录:
Serilog
支持将日志消息中的数据捕获为结构化数据。这使得日志更易于查询和分析,因为每个日志条目都可以包含丰富的元数据。 - 多种接收器(Sinks):
Serilog
提供了多种接收器(Sinks)选项,包括控制台
、文件
、数据库
、Elasticsearch
、Seq
等。接收器用于将日志输出到不同的目标。 - 配置灵活性:
Serilog
提供了高度灵活的配置选项,包括设置日志级别、过滤日志消息、格式化输出等。 - 异步日志记录:
Serilog
支持异步日志记录,以提高应用程序性能。异步日志记录允许应用程序在不等待日志操作完成的情况下继续执行。 - 可扩展性:
Serilog
提供了丰富的扩展点,允许开发者创建自定义接收器、过滤器和格式化程序。 - 跨平台:
Serilog
支持跨平台,可以在不同的操作系统(如Windows
、Linux
和macOS
)上运行的.NET Core
和.NET 5/6
应用程序中使用。
日志配置
Serilog
的 LoggerConfiguration
类提供了灵活的日志配置选项。下面是一些常见的使用案例:
- 配置日志最小级别:
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Information() // 设置最小日志级别为 Information
.WriteTo.Console()
.CreateLogger();
- 针对特定来源设置日志级别:
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug()
.MinimumLevel.Override("Microsoft", LogEventLevel.Information) // 为 Microsoft 名称空间设置 Information 级别
.WriteTo.Console()
.CreateLogger();
- 将日志记录到多个接收器:
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug()
.WriteTo.Console()
.WriteTo.File("logs/log.txt", rollingInterval: RollingInterval.Day) // 将日志记录到文件中
.CreateLogger();
- 使用 JSON 格式记录日志:
using Serilog.Formatting.Json;
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug()
.WriteTo.Console(new JsonFormatter()) // 使用 JSON 格式输出日志
.CreateLogger();
- 使用环境变量配置日志:
Log.Logger = new LoggerConfiguration()
.ReadFrom.AppSettings() // 从 AppSettings(app.config 或 web.config)中读取日志配置
.CreateLogger();
要使用此功能,需要安装 Serilog.Settings.AppSettings
包并添加配置:
<appSettings>
<add key="serilog:minimum-level" value="Debug" />
<add key="serilog:write-to:Console" />
</appSettings>
- 使用 appsettings.json 文件配置日志(针对 .NET Core):
using Microsoft.Extensions.Configuration;
var configuration = new ConfigurationBuilder()
.AddJsonFile("appsettings.json")
.Build();
Log.Logger = new LoggerConfiguration()
.ReadFrom.Configuration(configuration) // 从 appsettings.json 中读取日志配置
.CreateLogger();
要使用此功能,需要安装 Serilog.Settings.Configuration
包:
然后在 appsettings.json
文件中添加配置:
{
"Serilog": {
"MinimumLevel": "Debug",
"WriteTo": [
{ "Name": "Console" }
]
}
}
打印控制台和写入文件
Serilog
中 Serilog.Sinks.Console
和 Serilog.Sinks.File
分别是打印日志和写入日志文件的包,在应用程序的启动代码中,配置 Serilog 使用控制台和文件接收器:
using Serilog;
class Program
{
static void Main(string[] args)
{
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug()
.WriteTo.Console() // 配置控制台接收器
.WriteTo.File("logs/log-.txt", rollingInterval: RollingInterval.Day) // 配置文件接收器,每天创建一个新文件
.CreateLogger();
// 实例化 MyClass 并调用 MyMethod
var myClass = new MyClass();
myClass.MyMethod();
// 关闭 Serilog,释放资源
Log.CloseAndFlush();
}
}
使用:
using Serilog;
class MyClass
{
public void MyMethod()
{
Log.Information("这是一条信息日志");
Log.Warning("这是一条警告日志");
Log.Error("这是一条错误日志");
}
}
示例中,我们配置了 Serilog
使用控制台接收器和文件接收器。文件接收器每天创建一个新文件。文件名格式为 "log-.txt"
,其中 ‘-‘ 会被日期替换。例如,2023-04-17 的日志文件名为 "log-2023-04-17.txt"
。文件将保存在应用程序所在目录下的 "logs"
文件夹中。如果文件夹不存在,Serilog 会自动创建该文件夹。
异步使用
Serilog
使用 Serilog.Sinks.Async
异步日志记录可以提高应用程序性能,因为它允许应用程序在不等待日志操作完成的情况下继续执行:
using Serilog;
using Serilog.Events;
class Program
{
static void Main(string[] args)
{
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug()
.WriteTo.Async(a => a.Console()) // 异步控制台接收器
.WriteTo.Async(a => a.File("logs/log-.txt", rollingInterval: RollingInterval.Day)) // 异步文件接收器,每天创建一个新文件
.CreateLogger();
// 应用程序代码
// 关闭 Serilog,释放资源
Log.CloseAndFlush();
}
}
示例中,我们使用 .WriteTo.Async()
方法启用了异步日志记录。请注意,由于异步操作,日志记录的顺序可能与执行顺序略有不同。