Ответ 1
В списке рассылки log4net-user есть ответ, который работает с RollingFileAppender. Добавьте следующую строку в приложение в log4net.config:
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
У меня есть приложение, которое инициализирует log4net из одного приложения и должно использовать его в другом приложении. Поддерживается ли это?
Если нет, следует ли инициализировать log4net из каждого appdomain? Есть ли риск в нескольких инициализациях в одном приложении? Должен ли я использовать тот же log4net.config?
В списке рассылки log4net-user есть ответ, который работает с RollingFileAppender. Добавьте следующую строку в приложение в log4net.config:
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
Хотя вопрос несколько лет - может быть, это кому-то помогает:
Можно использовать регистраторы, настроенные в родительском AppDomain.
Что нужно сделать, это маршрут LoggingEvent
из дочернего AppDomain в родительский AppDomain. Для этого вам нужно создать пользовательский Appender, который пересылает записи из дочернего домена...
/// <summary>
/// Represents an <see cref="IAppender"/> implementation that forwards a <see cref="LoggingEvent"/> to a given Receiver.
/// Instances of this class should be created in the child domain.
/// </summary>
public class CrossDomainOutboundAppender : AppenderSkeleton
{
private readonly CrossDomainParentAppender crossDomainParentAppender;
public CrossDomainOutboundAppender(CrossDomainParentAppender crossDomainParentAppender)
{
if (crossDomainParentAppender == null)
{
throw new ArgumentNullException("crossDomainParentAppender");
}
this.crossDomainParentAppender = crossDomainParentAppender;
}
protected override void Append(LoggingEvent loggingEvent)
{
LoggingEvent copied = new LoggingEvent(loggingEvent.GetLoggingEventData());
crossDomainParentAppender.Append(copied);
}
}
настраиваемый класс, который получает перенаправленный LoggingEvent и добавляет их в доступный IAppender
...
/// <summary>
/// Represents a Receiver that sends Log4Nets <see cref="LoggingEvent"/> to all available <see cref="IAppender"/>s.
/// Instances of this class should be created in the ParentDomain.
/// </summary>
[Serializable]
public class CrossDomainParentAppender : MarshalByRefObject
{
public void Append(LoggingEvent loggingEvent)
{
foreach (IAppender usedAppender in LogManager.GetRepository().GetAppenders())
{
usedAppender.DoAppend(loggingEvent);
}
}
}
и, наконец, установочный класс, который связывает два и настраивает log4net:
public class CrossDomainChildLoggingSetup : MarshalByRefObject
{
private CrossDomainParentAppender parentAppender;
public void ConfigureAppender(CrossDomainParentAppender crossDomainParentAppender)
{
parentAppender = crossDomainParentAppender;
CrossDomainOutboundAppender outboundAppender = new CrossDomainOutboundAppender(parentAppender);
log4net.Config.BasicConfigurator.Configure(outboundAppender);
}
}
Теперь - при настройке AppDomain вы можете добавить следующий код...
CrossDomainParentAppender crossDomainParentAppender = new CrossDomainParentAppender();
Type crossDomainType = typeof(CrossDomainChildLoggingSetup);
CrossDomainChildLoggingSetup crossDomainChildLoggingSetup = (CrossDomainChildLoggingSetup)domain.CreateInstanceFrom(crossDomainType.Assembly.Location, crossDomainType.FullName).Unwrap();
crossDomainChildLoggingSetup.ConfigureAppender(crossDomainParentAppender);
... и все записи в дочернем домене отображаются в журнале родительских доменов.
(Обратите внимание: я использовал CreateInstaceFrom(assemblyFilePath,...)
- в зависимости от вашей настройки, которую вы не можете требовать загрузки файловым файлом)
Хотя я не обнаружил ошибок или проблем: если вы видите какие-либо недостатки или проблемы, которые могут возникнуть, сообщите мне.
Логгер должен быть инициализирован один раз для домена приложения.
Согласитесь с дарином, один раз за домен приложения. Если вы хотите, чтобы эти приложения использовали консолидированное ведение журнала, вам нужно выбрать цель ведения журнала, которая не будет подвержена конфликтам (т.е. Не FileAppender или RollingFileAppender).