在 C# 项目中,log4net 和 Serilog 都是成熟、灵活的日志框架,但 Serilog 更现代、配置更简洁、结构化日志支持更好;log4net 功能稳定但 XML 配置繁琐、扩展性略弱。推荐新项目优先选 Serilog,老项目维护可继续用 log4net。
Serilog:轻量配置 + 结构化日志
Serilog 的核心优势是“结构化日志”——日志消息可带命名参数,便于后续查询和分析(比如写入 Elasticsearch 或 Seq)。
安装 NuGet 包:Serilog、
Serilog.Sinks.Console(控制台)、
Serilog.Sinks.File(文件)、
Serilog.AspNetCore(ASP.NET Core 集成) 在
Program.cs(.NET 6+)中配置:
using Serilog;
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug()
.WriteTo.Console()
.WriteTo.File("logs/log-.txt", rollingInterval: RollingInterval.Day)
.CreateLogger();
<p>var builder = WebApplication.CreateBuilder(args);
builder.Host.UseSerilog(); // 启用 Serilog 全局日志
使用时直接注入
ILogger<t></t>或调用
Log.Information("User {Id} logged in at {Time}", userId, DateTime.Now) —— {Id} 和 {Time} 会作为结构化字段被记录,不只是字符串插值。
log4net:XML 驱动 + 成熟生态
log4net 依赖外部配置文件(如
log4net.config),适合已有 XML 管理习惯或需精细控制追加器(Appender)的老系统。 安装
log4netNuGet 包 添加
log4net.config到项目,设“复制到输出目录=始终复制” 在
Program.cs或
Startup.cs中初始化:
XmlConfigurator.Configure(new FileInfo("log4net.config"));
典型配置片段(输出到文件 + 控制台):
<log4net>
<appender name="FileAppender" type="log4net.Appender.FileAppender">
<file value="logs/app.log" />
<appendToFile value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
</layout>
</appender>
<root>
<level value="INFO" />
<appender-ref ref="FileAppender" />
</root>
</log4net>
代码中使用:
private static readonly ILog log = LogManager.GetLogger(typeof(Program));,然后
log.Info("Request processed");
关键差异与选型建议
结构化日志:Serilog 原生支持;log4net 需借助LogEventInfo.Properties手动附加,不直观 配置方式:Serilog 支持代码、JSON、环境变量等多种方式;log4net 几乎只靠 XML 异步写入:Serilog 默认支持(
Asyncsink 包);log4net 需自行包装或使用第三方 Appender ASP.NET Core 集成:Serilog 提供
UseSerilog()一键接管所有内置日志;log4net 需手动桥接
ILoggerFactory
小技巧:快速启用 JSON 日志(Serilog)
若对接 ELK 或 Datadog,只需换一个 Sink:
.WriteTo.File(new JsonFormatter(), "logs/log-.json", rollingInterval: RollingInterval.Day)
每条日志自动转为 JSON 行格式,含时间、级别、消息、属性字段,开箱即用。
基本上就这些。Serilog 上手快、维护省心,log4net 胜在稳定和文档全。不复杂但容易忽略的是:无论选哪个,记得在应用退出前调用
Log.CloseAndFlush()(Serilog)或
LogManager.Shutdown()(log4net),确保缓冲日志落盘。
