我有一個包含多個Web服務的Web應用程序。該Web應用程序具有業務和持久性層。每個Web服務可以使用單獨的日誌appender(日誌文件)嗎?每個Web服務使用單獨的log4net /頁面
這也適用於網頁。本質上,我想根據類或圖層/名稱空間來分開日誌,但是從入口點(可以是Web服務或網頁)來分離日誌。
我有一個包含多個Web服務的Web應用程序。該Web應用程序具有業務和持久性層。每個Web服務可以使用單獨的日誌appender(日誌文件)嗎?每個Web服務使用單獨的log4net /頁面
這也適用於網頁。本質上,我想根據類或圖層/名稱空間來分開日誌,但是從入口點(可以是Web服務或網頁)來分離日誌。
我可以使用PropertyFilter來做到這一點。我在配置文件中定義了以下appender:
<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>
上面appender的重要部分是標籤。當用戶使用UI我設置的「通道」屬性「UI」像下面的代碼:
log4net.GlobalContext.Properties["channel"] = "ui";
,當用戶使用我使用下面的代碼的Web服務:
log4net.GlobalContext.Properties["channel"] = "ws";
我需要設置發起請求時,最高級別的「通道」屬性。
您可以定義每個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.");
}
}
確保您更改typeof
到正確的web服務。
來源和更多信息here。
Gortok, 這是我們處理日誌的典型方式。不過,我的意思是不同的,我想我的問題還不夠清楚。
這裏有一個假設的例子:我們有一個有一定聯繫的網頁和一些客戶頁面的Web應用程序,我們希望有兩個不同的admin.log和customer.log文件每套頁面。這兩組頁面都使用業務層(包括CustomerService,OrderService等)和存儲層CustomerRepository,OrderRepository等)。應用程序中的所有圖層和類都在兩組頁面中使用,但我們希望將日誌分開。當管理頁面中發生異常時,這可以讓您更輕鬆,並且可以查看與跟蹤問題相關的日誌。您提到的解決方案是記錄事物的典型方法,因爲當您使用typeof(MyApp)(MyApp是類或名稱空間的名稱)時,將不會指出基於哪些頁面用戶使用什麼appender發起了他的要求。
也許處理這種情況的一種方法是在應用程序中使用域值對象,並在用戶在UI級別啓動請求時將其值設置爲適當的記錄器,並在定義時將該值用作構造器參數你在每個班的記錄器。但是我想知道在log4net中是否有更好的方法來處理這種我不知道的方法。
我的問題現在更清楚了嗎?
我建議在每個頁面上,使用Nested Diagnostic Contexts(國家數據中心),然後過濾日誌基礎上,NDC輸出。
NDC的信息將包括在從當前線程上下文記錄的事件,其中包括網頁代碼,服務代碼,庫代碼等
使用filtering on the NDC content你可以單獨地從各個服務日誌輸出。