gpt4 book ai didi

c# - log4net GlobalContext.Properties 只设置一次

转载 作者:太空狗 更新时间:2023-10-29 23:46:14 25 4
gpt4 key购买 nike

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

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

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

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 环境。

希望你能帮到你。

最佳答案

如果您使用的是 RollingFileAppender,请查看 this question - 本质上,您想创建一个继承自 RollingFileAppender 的类,并重写 WriteHeader 方法,以便只将 header 写入每个文件一次。

This answer显示设置 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

关于c# - log4net GlobalContext.Properties 只设置一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19399693/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com