log4net GlobalContext.属性仅设置一次

本文关键字:一次 设置 GlobalContext 属性 log4net | 更新日期: 2023-09-27 18:35:30

我想用静态信息扩展我的日志文件,比如我的软件正在运行什么操作系统。

有没有办法为每个创建的文件只注入一次此信息,而不是为每个日志条目注入一次?

这就是我目前的做法(但这会导致一遍又一遍地输出信息 - 这不是必需的,因为它是静态信息)

GlobalContext.Properties["**evInfoOsPlatform**"] = string.Format("OS Platform: {0}", Environment.OSVersion.Platform);
<layout type="log4net.Layout.PatternLayout">
  <conversionPattern value="%date{ABSOLUTE} [%thread] %level 
                        %logger - %message%newlineOperating System Version: %property{
                        **evInfoOsPlatform**}%newline%exception"/>
</layout>

我想要的效果是看起来像这样的日志文件:

Static information:
OS Version: Windows 8.1.0101934 32-bit
Culture Info: en-US
Domainname: RandomDomain
Username: Emil
Userrights: Admin      
Messages:
//now all the messages should be printed...

此代码在 C# .Net 4.5 WPF 环境中使用。

希望你能帮到忙。

log4net GlobalContext.属性仅设置一次

如果你使用的是 RollingFileAppender,看看这个问题 - 本质上你想创建一个继承自 RollingFileAppender 的类,并重写 WriteHeader 方法,只将标头写入每个文件一次。

此答案显示了通过子类化来设置 Header 属性的最佳方法log4net.Layout.PatternLayout

将它们放在一个示例中:

namespace MyAssembly.log4net.Header.Example
{
    public class HeaderAppender : RollingFileAppender
    {
        protected override void WriteHeader()
        {
            if (LockingModel.AcquireLock().Length == 0)
            {
                base.WriteHeader();
            }
        }
    }
    public class HeaderPatternLayout : PatternLayout
    {
        public override string Header
        {
            get
            {
                StringBuilder headerBuilder = new StringBuilder();
                headerBuilder.AppendLine("Static information");
                headerBuilder.AppendLine("OS Version: "
                          + Environment.OSVersion);
                headerBuilder.AppendLine("Culture Info: "
                          + CultureInfo.CurrentCulture);
                headerBuilder.AppendLine("[Etc] ");
                headerBuilder.AppendLine();
                headerBuilder.AppendLine("Messages:");    
                return headerBuilder.ToString();
            }
        }
    }
}

给定这样的配置(您需要将程序集名称设置为正确的名称):

<configuration>
  <configSections>
    <section name="log4net"
        type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
  </configSections>
  <log4net debug="false">
    <appender name="HeaderAppender" 
              type="MyAssembly.log4net.Header.Example.HeaderAppender,MyAssembly">
      <file value="c:'temp'Test.log"/>
      <layout 
         type="MyAssembly.log4net.Header.Example.HeaderPatternLayout,MyAssembly">
        <conversionPattern value="%message%newline" />
      </layout>
      <lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
      <maximumFileSize value="5MB"/>
      <rollingStyle value="Size"/>
      <maxSizeRollBackups value="-1"/>
      <countDirection value="1"/>
    </appender>
    <root>
      <level value="ALL" />
      <appender-ref ref="HeaderAppender" />
    </root>
  </log4net>
</configuration>

然后这是生成的日志文件,并带有标头:

Static information
OS Version: Microsoft Windows NT 6.1.7601 Service Pack 1
Culture Info: en-GB
[Etc] 
Messages:
Info Message
Debug Message
Etc