Log4Net生成空日志文件的解决方法


1、根据网上的配置说明,该配置将记录Error 级别的错误,按照月份分文件夹,按照天来分文件进行日志的记录,

完成了配置如下:

<configuration>  
  <configSections>  
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net, Version=1.2.11.0, Culture=neutral, PublicKeyToken=1B44E1D426115821" />  
  </configSections>  
  <log4net>  
    <root>  
      <!--<level value="DEBUG"/>-->  
      <level value="ERROR"/>  
      <!--根据log级别记录到不同的日志文件-->  
      <!--<appender-ref ref="DebugLog" />-->  
      <appender-ref ref="ErrorLog" />  
    </root>  
    <appender name="ErrorLog" type="log4net.Appender.RollingFileAppender">  
      <!-- 最后放开注释--><span style="font-family: Arial, Helvetica, sans-serif;"> <!--<lockingModel type="命名空间.MinimalLockDeleteEmpty" />--></span>  
<param name="File" value="Log\" />  
    <param name="AppendToFile" value="true" />  
    <param name="RollingStyle" value="Date" />  
    <param name="DatePattern" value="yyyy-MM\\yyyy-MM-dd.'log'" />  
    <param name="StaticLogFileName" value="false" />  
    <layout type="log4net.Layout.PatternLayout">  
      <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />  
    </layout>  
    <securityContext type="log4net.Util.WindowsSecurityContext">  
      <credentials value="Process" />  
    </securityContext>  
    <filter type="log4net.Filter.LevelRangeFilter">  
      <levelMin value="ERROR" />  
      <levelMax value="ERROR" />  
    </filter>  
  </appender>  
</log4net>  
</configuration>

2、运行上面的(除红色)的设置后,发现就算没有抛出异常,log4net每天同样会创建一个空的日志文件。


3、查找搜索了下国内网站,未发现解决的方法,只是想到如果log4net不支持的化,可以在网站运行后

创建一个定时器,每隔一天检查一下对应的日志文件是否有空,有则删除;

4、google搜索到国外的网站,发现可以继承

FileAppender.MinimalLock 类 重写ReleaseLock 方法 来实现写日志完成后检查空文件并删除的功能


网址(http://stackoverflow.com/questions/2533403/how-to-disable-creation-of-empty-log-file-on-app-start)

using log4net.Appender;  
using System;  
using System.Collections.Generic;  
using System.IO;  
using System.Linq;  
using System.Text;  
  
namespace 命名空间  
{  
    public class MinimalLockDeleteEmpty : FileAppender.MinimalLock  
    {  
        public override void ReleaseLock()  
        {  
            base.ReleaseLock();  
  
            var logFile = new FileInfo(CurrentAppender.File);  
            if (logFile.Exists && logFile.Length <= 0)  
            {  
                logFile.Delete();  
            }  
        }  
    }  
}

5、最后在配置文件中将类插入完成调用

<lockingModel type="命名空间.MinimalLockDeleteEmpty" />


注:本文转载自网摘,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如有侵权行为,请联系我们,我们会及时删除。
上一篇 下一篇

分享

最新加入

最新评论