代码之家  ›  专栏  ›  技术社区  ›  Aamir

如果服务连续运行数天,如何每天创建新的log4net

  •  0
  • Aamir  · 技术社区  · 7 年前

    我已实施 log4net 在我的windows服务中,它按预期工作,并根据配置设置以当前日期创建了新文件。

    <configSections>
        <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,Log4net" />
      </configSections>
      <log4net>
        <appender name="file" type="log4net.Appender.RollingFileAppender">
          <file type="log4net.Util.PatternString" value="Logs\log-%utcdate{yyyy-MM-dd}.txt" />
          <staticLogFileName value="false" />
          <appendToFile value="true" />
          <rollingStyle value="Composite" />
          <maxSizeRollBackups value="5" />
          <maximumFileSize value="5MB" />
          <staticLogFileName value="true" />
          <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%date [%thread] %level %logger - %message%newline" />
          </layout>
          <param name="DatePattern" value="dd.MM.yyyy'.log'" />
        </appender>
        <root>
          <level value="ALL" />
          <appender-ref ref="file" />
        </root>
      </log4net>  
    

    这里的问题是,如果我的服务是从最近2天开始运行的,所以它不会使用当前日期创建新文件,它会保留对旧文件的引用,并将日志添加到旧文件中,而不是为当天创建新文件。
    记录器代码如下

    public static class Logger
        {
            public static log4net.ILog Log { get; set; }
    
            static Logger()
            {
                Log = log4net.LogManager.GetLogger(typeof(System.Reflection.MethodBase));
            }
    
            public static void Trace(string message)
            {
                Log.Info(message);
            }
    
            public static void LogException(Exception ex)
            {
                StringBuilder builer = new StringBuilder();
                builer.AppendLine("=============Exception===========");
                builer.AppendLine("Exception: {0}");
                builer.AppendLine("StackTrack: {1}");
                Log.ErrorFormat(builer.ToString(), ex.Message, ex.StackTrace);
            }
        }  
    

    要将信息记录到日志文件中,我正在使用代码

    Logger.Trace("Hello");  
    

    代码级别的更改要求我每天创建新的日志文件,即使服务/桌面应用程序从过去几天开始一直在运行?

    1 回复  |  直到 7 年前
        1
  •  5
  •   Iridium    7 年前

    您的配置同时具有 <staticLogFileName value="false" /> <staticLogFileName value="true" /> ,这可能解释了它滚动不正确的原因。

    我建议您删除 <staticLogFileName值=“true”/> 并按如下方式更改文件和日期模式:

    <file value="Logs\log-" />
    ...
    <param name="DatePattern" value="yyyy-MM-dd'.log'" />
    

    如果staticLogFileName为false,则日期字符串将附加到基本文件名,例如:

    Logs\log-2018-01-30.log
    

    然而,我要指出的是,log4net将 只有 检查在您实际记录消息时是否需要滚动日志文件,因此如果您不经常记录,它可能不会在第二天开始时滚动。