Я использую log4net для записи в разные файлы в зависимости от имени экземпляра, полученного из SSO.Имя файла не является статическим, и я не могу определить его в файле конфигурации.
У меня уже есть много файлов, содержащих инструкции журнала, поэтому я должен использовать существующие приложения.
Проблема заключается в следующем: Iнахожу записи журнала, принадлежащие экземпляру A в файле Foo_B.txt.
Может быть, проблема в том, что функция SetLog4NetAppenderOptions()
является статической?Или есть проблема многопоточности с использованием log4net?Может быть, мне нужно создать один appender, например?
Global.asax:
XmlConfigurator.ConfigureAndWatch(new FileInfo("log4net.xml");
Config :
<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();
}
}
}