.NET Core 配置 Serilog 日志记录完整教程

在.NET开发中,log4net是经典的日志记录工具,而Serilog更适配.NET Core与微服务架构,原生支持依赖注入,配置灵活、扩展性强,是现代化.NET项目日志记录的优选方案。本文详细讲解两种.NET Core项目配置Serilog记录文件日志的完整方法,开箱即用。

前置准备:安装NuGet依赖包

两种配置方式均需先安装核心依赖,打开NuGet包管理器控制台,执行以下命令:

1
2
Install-Package Serilog.AspNetCore
Install-Package Serilog.Sinks.File

其中:

  1. Serilog.AspNetCore:适配ASP.NET Core的核心集成包,支持依赖注入与项目托管
  2. Serilog.Sinks.File:文件日志输出插件,实现日志写入本地文件

方法一:代码方式配置Serilog(直观易懂)

通过代码直接定义日志规则,无需修改配置文件,适合简单项目、快速部署场景。

1. 配置 Program.cs 核心日志规则

在项目Program.cs中初始化Serilog,配置控制台输出、文件滚动日志,同时捕获程序启动异常:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
using System;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Hosting;
using Serilog;

public class Program
{
public static void Main(string[] args)
{
// 初始化Serilog配置
Log.Logger = new LoggerConfiguration()
.WriteTo.Console() // 日志输出到控制台
.WriteTo.File("logs/log-.txt", rollingInterval: RollingInterval.Day) // 按天滚动生成日志文件
.CreateLogger();

try
{
Log.Information("程序启动成功");
CreateHostBuilder(args).Build().Run();
}
catch (Exception ex)
{
Log.Fatal(ex, "程序启动失败");
}
finally
{
// 刷新并释放日志资源
Log.CloseAndFlush();
}
}

public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseSerilog() // 启用Serilog替换默认日志
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}

2. Startup.cs 依赖注入配置

无需额外注册日志服务,只需保留基础项目配置,Serilog已全局生效:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
// 注册控制器、视图服务
services.AddControllersWithViews();
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();

// 配置默认路由
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
}
}

方法二:appsettings.json 配置(推荐、灵活可维护)

将日志规则写入配置文件,无需修改代码即可调整日志级别、输出方式,适合正式项目、微服务项目。

1. 安装依赖包

与代码配置方式一致,安装上述两个NuGet包。

2. 修改 Program.cs 读取配置

从appsettings.json配置文件中加载Serilog规则:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
using System;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Hosting;
using Serilog;

public class Program
{
public static void Main(string[] args)
{
// 从配置文件读取Serilog配置
var config = Host.CreateDefaultBuilder(args).Build().Configuration;
Log.Logger = new LoggerConfiguration()
.ReadFrom.Configuration(config)
.CreateLogger();

try
{
Log.Information("程序启动成功");
CreateHostBuilder(args).Build().Run();
}
catch (Exception ex)
{
Log.Fatal(ex, "程序启动失败");
}
finally
{
Log.CloseAndFlush();
}
}

public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseSerilog()
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}

3. appsettings.json 完整日志配置

在配置文件中新增Serilog节点,定义日志级别、输出方式、日志附加信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
{
"Serilog": {
"MinimumLevel": {
"Default": "Information",
"Override": {
"Microsoft": "Warning",
"System": "Warning"
}
},
"WriteTo": [
{
"Name": "Console"
},
{
"Name": "File",
"Args": {
"path": "logs/log-.txt",
"rollingInterval": "Day"
}
}
],
"Enrich": ["FromLogContext", "WithMachineName", "WithThreadId"],
"Properties": {
"Application": "SampleApp"
}
}
}

配置说明与注意事项

  • 日志滚动规则rollingInterval: Day 表示按天生成独立日志文件,避免单日志文件过大,方便日志排查

  • 日志级别过滤:默认记录Information及以上级别日志,屏蔽Microsoft、System框架的冗余Info日志,精简日志内容

  • 日志增强信息:Enrich配置自动记录机器名、线程ID、上下文信息,方便线上问题排查

  • 权限注意:部署项目时,需确保程序运行目录拥有读写权限,否则无法生成日志文件

  • 资源释放Log.CloseAndFlush() 确保程序退出时,缓存日志全部写入文件,避免日志丢失

运行效果

项目启动后,会自动在根目录生成 logs 文件夹,按日期生成日志文件,同时控制台实时输出日志,完整记录程序启动、运行、异常等全流程信息。