Log4net生成(null)文件问题求助:配置与代码排查
问题分析与解决方案
让我们一步步拆解你遇到的日志文件命名异常问题:
核心问题点
过早获取默认仓库的Logger:你在设置
ThreadContext.Properties["ReportName"]和初始化自定义日志仓库之前,就先调用了LogManager.GetLogger("ReportLogger")——这个Logger属于log4net的默认全局仓库,而非后续创建的自定义仓库。此时ReportName属性还未赋值,导致默认仓库的Appender初始化时读取到null值,最终生成(null).log文件。属性设置与配置加载顺序颠倒:你先创建仓库,再设置
ThreadContext.Properties["ReportName"],最后加载配置。但log4net在加载配置初始化Appender时,会立即解析PatternString中的属性值——此时属性还未设置,自然无法读取到正确的文件名。冗余的Logger赋值操作:一开始获取默认仓库Logger的操作完全没必要,反而会提前触发默认仓库的Appender初始化,直接导致无效日志文件生成。
修正后的代码
public void LogReport(object msg, string filename, string date) { string AppLogFileName = GetTextReportFileName(filename, date); try { if (!String.IsNullOrEmpty(AppLogFileName)) { // 1. 先设置ThreadContext属性,确保配置加载时能读取到有效值 ThreadContext.Properties["ReportName"] = AppLogFileName; // 2. 创建自定义日志仓库 log4net.Repository.ILoggerRepository loggerRepository2 = LogManager.CreateRepository(AppLogFileName + "Repository"); // 3. 加载配置到自定义仓库 log4net.Config.XmlConfigurator.Configure(loggerRepository2); // 4. 从自定义仓库获取目标Logger var ReportMsglogger = LogManager.GetLogger(AppLogFileName + "Repository", "ReportLogger"); // 5. 执行日志记录 ReportMsglogger.Info(msg); } } catch (Exception ex) { // 不要吞掉异常,建议用默认仓库记录错误方便排查 LogManager.GetLogger(typeof(YourCurrentClassName)).Error("日志初始化失败", ex); } }
额外优化建议
- 避免吞掉异常:空
catch块会掩盖日志初始化过程中的错误,建议添加基础的异常日志记录。 - 校验文件名合法性:确认
GetTextReportFileName返回的文件名不含特殊字符、路径有效,避免因文件名非法导致的写入失败。 - 指定配置文件路径(可选):如果你的配置文件不是默认的
app.config,需要在XmlConfigurator.Configure中明确指定文件路径,例如:XmlConfigurator.Configure(loggerRepository2, new FileInfo("你的配置文件路径"))。
内容的提问来源于stack exchange,提问作者Cherylaksh
相关产品推荐
相关产品推荐

