C# Windows Forms项目使用独立log4net.config无法生成日志文件
问题根因
你改用独立配置文件后不生效是存在3处遗漏配置/操作:
- 没有显式告知log4net加载独立的log4net.config文件,放在app.config中时框架会自动读取配置节,独立文件需要手动指定加载逻辑
- 没有设置log4net.config文件的复制属性,导致编译后程序运行目录下不存在该配置文件
- 独立log4net.config保留了仅适用于app.config的
<configuration>、<configSections>外层节点,格式不符合独立配置文件要求
解决步骤
1. 修正log4net.config文件结构
删掉外层的<configuration>和<configSections>节点,直接以<log4net>作为根节点,修正后内容如下:
<?xml version="1.0" encoding="utf-8" ?> <log4net> <appender name="FileAppender" type="log4net.Appender.FileAppender"> <staticLogFileName value="true"/> <file type="log4net.Util.PatternString" value="Logs\%date{MMddHH}\%property{LogName}.log" /> <appendToFile value="true" /> <encoding value="utf-8" /> <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date [%thread] %-5level %logger > %method > %message%newline" /> </layout> </appender> <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender"> <file value="log.txt" /> <!--<file type="log4net.Util.PatternString" value="Logs\%date{MMddHH}\%property{LogName}" />--> <appendToFile value="true" /> <rollingStyle value="Date" /> <datePattern value="_yyyyMMdd HH'.log'"/> <maxSizeRollBackups value="1" /> <maximumFileSize value="2KB" /> <staticLogFileName value="true" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> </layout> </appender> <root> <level value="ALL" /> <appender-ref ref="RollingFileAppender" /> </root> </log4net>
2. 设置配置文件属性
在解决方案资源管理器中右键log4net.config文件,选择「属性」,修改两个属性:
- 生成操作:选择「无」
- 复制到输出目录:选择「如果较新则复制」
3. 新增配置加载逻辑
两种方式二选一即可:
方式1:添加程序集特性
打开项目下Properties文件夹中的AssemblyInfo.cs,在末尾添加一行特性:
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]
Watch = true代表运行时修改配置文件会自动重载,无需重启程序。
方式2:启动时显式加载
在程序入口最开始的位置加载配置,比如在Program.cs的Main方法第一行添加:
log4net.Config.XmlConfigurator.Configure(new System.IO.FileInfo("log4net.config"));
也可以放在Form1构造函数InitializeComponent();之前添加。
额外检查项
- 运行后到
bin\Debug或bin\Release目录下确认存在log4net.config文件 - 如果你后续取消注释带
%property{LogName}的路径配置,需要在日志写入前给该属性赋值:log4net.GlobalContext.Properties["LogName"] = "自定义日志名"; - 确认程序对运行目录有写入权限
内容的提问来源于stack exchange,提问作者Mario Luigi Vibal
相关产品推荐
相关产品推荐

