複数の Web サービスを備えた Web アプリケーションがあります。この Web アプリケーションには、ビジネス レイヤーと永続レイヤーがあります。Web サービスごとに個別のログ アペンダー (ログ ファイル) を使用することは可能ですか?
これは Web ページにも当てはまります。基本的に、ログをクラスまたはレイヤー/名前空間に基づいてではなく、Web サービスまたは Web ページであるエントリ ポイントから分離したいと考えています。
各 Web サービスで取得するロガーを定義できます。
namespace log4net
{
public class LogManager
{
public static ILog GetLogger(string name);
public static ILog GetLogger(Type type);
}
}
次に、アプリで各ロガーを適切に呼び出すことができます。
public class MyApp
{
// Define a static logger variable so that it references the
// Logger instance named "MyApp".
private static readonly ILog log = LogManager.GetLogger(typeof(MyApp));
static void Main(string[] args)
{
// Set up a simple configuration that logs on the console.
BasicConfigurator.Configure();
log.Info("Entering application.");
Bar bar = new Bar();
bar.DoIt();
log.Info("Exiting application.");
}
}
を正しい Web サービスに変更してくださいtypeof
。
ソースと詳細情報はこちら.
各ページでネストされた診断コンテキスト(NDC) を使用し、NDC に基づいてログ出力をフィルター処理することをお勧めします。
NDC 情報は、現在のスレッド コンテキストからログに記録されたイベントに含まれます。これには、ページ コード、サービス コード、リポジトリ コードなどが含まれます。
NDC コンテンツのフィルタリングを使用すると、ログ出力をさまざまなサービスから分離できます。
これは、PropertyFilter を使用して行うことができます。構成ファイルで次のアペンダーを定義しました。
<appender name="UiFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="Log1.log" />
<appendToFile value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="10" />
<maximumFileSize value="5MB" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
</layout>
<filter type="log4net.Filter.PropertyFilter">
<Key value="channel"/>
<StringToMatch value="ui" />
<AcceptOnMatch value="true" />
</filter>
<filter type="log4net.Filter.DenyAllFilter" />
</appender>
<appender name="WsFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="Log1.log" />
<appendToFile value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="10" />
<maximumFileSize value="5MB" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
</layout>
<filter type="log4net.Filter.PropertyFilter">
<Key value="channel"/>
<StringToMatch value="ws" />
<AcceptOnMatch value="true" />
</filter>
<filter type="log4net.Filter.DenyAllFilter" />
</appender>
上記のアペンダーの重要な部分はタグです。ユーザーが UI を使用している場合、次のコードのように「channel」プロパティを「ui」に設定します。
log4net.GlobalContext.Properties["channel"] = "ui";
ユーザーがWebサービスを使用するときは、次のコードを使用します。
log4net.GlobalContext.Properties["channel"] = "ws";
リクエストが開始されたときに、エントリの最上位レベルで「チャネル」プロパティを設定する必要があります。