如何在WCF中配置Serilog?配置后无法生成日志求排查
问题分析与修复方案
核心错误点
- 容器构建顺序错误:你在注册
ILogger之前就调用builder.Build()并赋值给AutofacHostFactory.Container,导致WCF实际使用的容器中没有Logger的注册信息,服务无法获取Logger实例。 - Serilog静态日志未初始化:你创建了Logger实例,但未将其赋值给
Log.Logger,调用Log.Information时使用的是默认空Logger,不会输出任何日志。 - 路径适配问题:
ApplicationData.Current.LocalFolder是UWP/桌面应用的路径,ASP.NET托管的WCF环境应使用服务器端路径(如HttpRuntime.AppDomainAppPath),否则可能出现权限或路径不存在问题。
修正后的Global.asax代码
public class Global : System.Web.HttpApplication { protected void Application_Start(object sender, EventArgs e) { // 1. 初始化Serilog静态Logger var logFilePath = Path.Combine(HttpRuntime.AppDomainAppPath, "Logs/Log.txt"); Log.Logger = new LoggerConfiguration() .WriteTo.File(logFilePath, rollingInterval: RollingInterval.Day, createDirs: true) .CreateLogger(); // 2. 构建Autofac容器,确保Logger先注册 var builder = new ContainerBuilder(); builder.RegisterInstance(Log.Logger).As<ILogger>().SingleInstance(); builder.RegisterType<TestService.Service1>(); AutofacHostFactory.Container = builder.Build(); // 测试日志输出 Log.Information("Application Startup..."); } protected void Application_End() { // 关闭Serilog并刷新日志缓存 Log.CloseAndFlush(); } }
额外注意事项
- 确保WCF服务构造函数接收
ILogger参数,让Autofac完成注入:public class Service1 : IService1 { private readonly ILogger _logger; public Service1(ILogger logger) { _logger = logger; } public string GetData(int value) { _logger.Information("GetData called with value: {Value}", value); return $"You entered: {value}"; } } - 关于
this.Request引发的System.Web.HttpException:需确保在WCF服务中访问HttpContext.Current.Request时,当前请求上下文处于有效状态,避免在非请求线程中调用该属性。
内容的提问来源于stack exchange,提问作者CodingNeeded
相关产品推荐
相关产品推荐

