2008-12-11 46 views
3

我有一個包含多個Web服務的Web應用程序。該Web應用程序具有業務和持久性層。每個Web服務可以使用單獨的日誌appender(日誌文件)嗎?每個Web服務使用單獨的log4net /頁面

這也適用於網頁。本質上,我想根據類或圖層/名稱空間來分開日誌,但是從入口點(可以是Web服務或網頁)來分離日誌。

回答

0

我可以使用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"; 

我需要設置發起請求時,最高級別的「通道」屬性。

1

您可以定義每個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

0

Gortok, 這是我們處理日誌的典型方式。不過,我的意思是不同的,我想我的問題還不夠清楚。

這裏有一個假設的例子:我們有一個有一定聯繫的網頁和一些客戶頁面的Web應用程序,我們希望有兩個不同的admin.log和customer.log文件每套頁面。這兩組頁面都使用業務層(包括CustomerService,OrderService等)和存儲層CustomerRepository,OrderRepository等)。應用程序中的所有圖層和類都在兩組頁面中使用,但我們希望將日誌分開。當管理頁面中發生異常時,這可以讓您更輕鬆,並且可以查看與跟蹤問題相關的日誌。您提到的解決方案是記錄事物的典型方法,因爲當您使用typeof(MyApp)(MyApp是類或名稱空間的名稱)時,將不會指出基於哪些頁面用戶使用什麼appender發起了他的要求。

也許處理這種情況的一種方法是在應用程序中使用域值對象,並在用戶在UI級別啓動請求時將其值設置爲適當的記錄器,並在定義時將該值用作構造器參數你在每個班的記錄器。但是我想知道在log4net中是否有更好的方法來處理這種我不知道的方法。

我的問題現在更清楚了嗎?

1

我建議在每個頁面上,使用Nested Diagnostic Contexts(國家數據中心),然後過濾日誌基礎上,NDC輸出。

NDC的信息將包括在從當前線程上下文記錄的事件,其中包括網頁代碼,服務代碼,庫代碼等

使用filtering on the NDC content你可以單獨地從各個服務日誌輸出。