基本上,我需要生成多个日志文件。在我的示例中,我有 2 个记录器 {logger-A, logger-B}。我发现为每个记录器创建另一个文件追加器很乏味。如何为多个记录器重复使用 1 个追加器?
在配置中
<log4net>
<root>
<level value="ALL" />
<appender-ref ref="LogFileAppender" />
</root>
<logger additivity="false" name="logger-A">
<level value="All"/>
<appender-ref ref="FileAppender" />
</logger>
<logger additivity="false" name="logger-B">
<level value="All"/>
<appender-ref ref="FileAppender" />
</logger>
<appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender" >
<param name="File" type="log4net.Util.PatternString" value="logall.txt" />
<param name="AppendToFile" value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="10" />
<maximumFileSize value="2MB" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%-5p%d{yyyy-MM-dd hh:mm:ss} – %m%n" />
</layout>
<filter type="log4net.Filter.PropertyFilter">
<Key value="Version" />
<StringToMatch value="1" />
</filter>
</appender>
<appender name="FileAppender" type="log4net.Appender.RollingFileAppender" >
<param name="File" type="log4net.Util.PatternString" value="log%property{LogName}.txt" />
<param name="AppendToFile" value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="10" />
<maximumFileSize value="2MB" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%-5p%d{yyyy-MM-dd hh:mm:ss} – %m%n" />
</layout>
</appender>
</log4net>
在 C# 中
GlobalContext.Properties["LogName"] = string。格式("{0}", 记录器名称(;var logger = LogManager.GetLogger(loggerName(;
如果需要配置
,您可以使用良好的旧组合来执行此操作并添加更多属性。如下图所示。
public class FileAppenderX2 : AppenderSkeleton
{
private FileAppender _output1;
private FileAppender _output2;
public string Output1 { get; set; }
public string Output2 { get; set; }
public override void ActivateOptions()
{
base.ActivateOptions();
_output1 = new FileAppender() { Layout = this.Layout, File = Output1 };
_output2 = new FileAppender() { Layout = this.Layout, File = Output2 };
_output1.ActivateOptions();
_output2.ActivateOptions();
}
public FileAppenderX2()
{
}
protected override void Append(LoggingEvent loggingEvent)
{
_output1.DoAppend(loggingEvent);
_output2.DoAppend(loggingEvent);
}
}
配置文件编辑在这里...
<appender name="FileX2Appender" type="{Fully Qualified Namespace}.FileAppenderX2, {Assembly Name}">
<Output1 value="C:output1.log"/>
<Output2 value="C:output2.log"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="[%date]-[%thread]-[%level]-[%logger] - %message%newline" />
</layout>
</appender>
我不完全理解你的要求,无论如何根据我的理解,我试图回答你。
所以你在配置中指定了多个记录器,比如
<logger additivity="false" name="logger-A">
<level value="All"/>
<appender-ref ref="FileAppender" />
</logger>
<logger additivity="false" name="logger-B">
<level value="All"/>
<appender-ref ref="FileAppender" />
</logger>
然后你有一个带有参数的附加器,如下所示
<param name="File" type="log4net.Util.PatternString" value="log%property{LogName}.txt" />
它正在寻找一个字符串来替换 {日志名称}。
并且您可以使用下面的 c# 代码获取记录器名称,
GlobalContext.Properties["LogName"] = string.Format("{0}", loggerName);
var logger = LogManager.GetLogger(loggerName);
如果我的上述理解是正确的,那么您可以参考链接。我不知道这有多实用,但至少它会为你提供我相信的信息。