C# log4net GlobalContext.Properties仅设置一次

C# log4net GlobalContext.Properties仅设置一次,c#,log4net,C#,Log4net,我想用静态信息扩展日志文件,比如我的软件运行的操作系统 是否有一种方法可以在创建的每个文件中只注入一次此信息,而不是针对每个日志条目 我现在就是这样做的(但这会导致信息一次又一次地输出——这是不必要的,因为它是静态信息) 此代码用于C#.Net 4.5 WPF环境 希望您能提供帮助。如果您使用的是RollingFileAppender,请看一看-本质上,您希望创建一个从RollingFileAppender继承的类,并重写WriteHeader方法,只将头写入每个文件一次 通过子类化log4ne

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

是否有一种方法可以在创建的每个文件中只注入一次此信息,而不是针对每个日志条目

我现在就是这样做的(但这会导致信息一次又一次地输出——这是不必要的,因为它是静态信息)

此代码用于C#.Net 4.5 WPF环境


希望您能提供帮助。

如果您使用的是RollingFileAppender,请看一看-本质上,您希望创建一个从RollingFileAppender继承的类,并重写
WriteHeader
方法,只将头写入每个文件一次

通过子类化
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();
            }
        }
    }
}
给定如下配置(您需要将程序集名称设置为正确的名称):

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...
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