ASP.NET WebForm 4.8中如何配置唯一Serilog Logger以复用日志文件?
解决ASP.NET WebForm 4.8中Serilog重复创建日志文件的问题
问题根源在于你每次页面加载(Page_Load)都会重新初始化Log.Logger,导致Serilog重复创建日志文件实例,甚至可能引发资源冲突。要实现全局唯一Logger并统一写入同一个日志文件,按以下步骤修改:
1. 全局初始化Logger(仅执行一次)
将Logger的初始化逻辑移到应用启动时执行,也就是Global.asax的Application_Start方法中,确保整个应用生命周期只初始化一次Logger。
修改Global.asax.cs代码:
public class Global : HttpApplication { protected void Application_Start(object sender, EventArgs e) { // 替换为你的实际日志文件路径 var logFilePath = @"C:\Logs\WebAppLogs.log"; Log.Logger = new LoggerConfiguration() .MinimumLevel.Debug() .WriteTo.File( logFilePath, rollingInterval: RollingInterval.Day, rollOnFileSizeLimit: true ) // 可选:添加页面名称上下文,方便区分不同页面的日志 .Enrich.WithProperty("Application", "WebFormDemo") .CreateLogger(); } protected void Application_End(object sender, EventArgs e) { // 应用关闭时刷新并释放Logger资源,确保所有日志写入文件 Log.CloseAndFlush(); } }
2. 页面中直接使用全局Logger
移除页面Page_Load中的Logger初始化代码,直接引用全局的Log.Logger即可:
修改页面代码:
public partial class TransferForm : System.Web.UI.Page { private ILogger _logger => Log.Logger; protected void Page_Load(object sender, EventArgs e) { // 直接使用全局Logger记录日志 _logger.Information("TransferForm页面加载完成"); } }
关键注意事项
- 权限配置:确保日志文件所在目录有应用程序池账户的读写权限,否则会出现日志写入失败的情况。
- 资源释放:务必在
Application_End中调用Log.CloseAndFlush(),避免应用关闭时丢失未写入的日志,同时释放文件资源。 - 日志区分:如果需要区分不同页面或模块的日志,可以通过
Enrich.WithProperty添加自定义上下文属性,比如页面名称、模块名等。
内容的提问来源于stack exchange,提问作者Totoblo
相关产品推荐
相关产品推荐

