我正在使用log4net根据从SSO获得的实例名称写入不同的文件。该文件名不是静态的,我无法在配置文件中定义。
我已经有很多包含日志指令的文件,所以我必须使用现有的附加程序。
问题是:我发现日志行属于文件Foo_B.txt中的实例A。
也许问题是SetLog4NetAppenderOptions()
函数是静态的?还是使用log4net存在多线程问题?例如,也许我需要创建一个追加程序?
Global.asax:
XmlConfigurator.ConfigureAndWatch(new FileInfo("log4net.xml");
配置:
<log4net>
<appender name="RollingFile" type="log4net.Appender.RollingFileAppender">
<lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
<file type="log4net.Util.PatternString" value="Log\Foo_log.txt"/><!-- used to log before finding instance -->
<appendToFile value="true"/>
<maximumFileSize value="5120KB"/>
<maxSizeRollBackups value="5"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [${COMPUTERNAME}-%thread] %-5level %logger - (%method) - %message%newline" />
</layout>
</appender>
<root>
<level value="debug"/>
<appender-ref ref="RollingFile" />
</root>
</log4net>
在代码文件svc.cs
中:
Foo()
{
Logger.Debug… //Log to generic file
string instance = LoginSso();
Logger.Debug //Log to specific file
}
然后:
LogUtils.SetLog4NetAppenderOptions(instance);
并在静态实用程序文件中:
public static void SetLog4NetAppenderOptions(string instanceName)
{
Hierarchy hierarchy = LogManager.GetRepository() as Hierarchy;
if (hierarchy != null)
{
RollingFileAppender fileAppender = (RollingFileAppender)hierarchy.GetAppenders().Where(x => x.GetType() == typeof(RollingFileAppender)).FirstOrDefault();
if (fileAppender != null)
{
fileAppender.File = fileAppender.File.Replace("_log", "_" + instanceName);
fileAppender.ActivateOptions();
}
}
}