あるアプリケーション ドメインから log4net を初期化するアプリケーションがあり、それを別のアプリケーション ドメインで使用する必要があります。サポートされていますか?
そうでない場合、各 appdomain から log4net を初期化する必要がありますか? 同じアプリケーションで複数の初期化にリスクはありますか? 同じ log4net.config を使用する必要がありますか?
log4net-userメーリング リストには、RollingFileAppender で動作する回答があります。log4net.config のアペンダーに次の行を追加します。
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
質問は数年前のものですが、誰かに役立つかもしれません:
親 AppDomain で構成されたロガーを使用することができます。行う必要があるのは、 LoggingEvent
s を子 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
s に追加するカスタム クラス ...
/// <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);
}
}
}
最後に、2 つを結び付けて 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,...)
しました-セットアップによっては、filePathによるロードが必要ない場合があります)
バグや問題はまだ見つかっていませんが、何か欠陥や問題が発生する可能性がある場合はお知らせください。
ロガーは、アプリ ドメインごとに 1 回初期化する必要があります。
アプリ ドメインごとに 1 回、darin に同意します。これらのアプリケーションで統合ログを使用する場合は、競合の影響を受けない (つまり、FileAppender または RollingFileAppender ではない) ログ ターゲットを選択する必要があります。