基本上,我需要生成多个日志文件。 在我的例子中,我有2个记录器{logger-A,logger-B}。 我发现为每个记录器创建另一个fileappender很繁琐。 如何为多个记录器重复使用1个appender?
在配置
中<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="log\all.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.Format("{0}", loggerName); var logger = LogManager.GetLogger(loggerName);
答案 0 :(得分:3)
如果要进行配置,可以使用旧的合成来执行此操作并添加更多属性。如下图所示。
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>
答案 1 :(得分:0)
我不完全理解你的要求,根据我的理解,我试图回答你。
所以你在配置中指定了多个记录器,如
<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的appender,如下所示
<param name="File" type="log4net.Util.PatternString" value="log\%property{LogName}.txt" />
正在寻找一个替换{LogName}的字符串。
您可以使用下面的c#代码获取记录器名称,
GlobalContext.Properties["LogName"] = string.Format("{0}", loggerName);
var logger = LogManager.GetLogger(loggerName);
如果我的上述理解是正确的,那么您可以参考link。我不知道这实际有多远,但至少它会为你提供我相信的信息。