2009-02-18 5 views
38

Tôi đang cố gắng tùy chỉnh đường dẫn tệp log4net để sử dụng thuộc tính tôi đã đặt trong từ điển log4net.GlobalContext.Properties.Làm cách nào để sử dụng thuộc tính GlobalContext trong tên người dùng log4net?

log4net.GlobalContext.Properties["LogPathModifier"] = "SomeValue"; 

Tôi có thể thấy rằng giá trị này được đặt chính xác khi gỡ lỗi thông qua nó. và sau đó trong cấu hình của tôi

<file type="log4net.Util.PatternString" 
     value="Logs\%appdomain_%property{LogPathModifier}.log" /> 

Tuy nhiên, đầu ra của điều này mang lại cho tôi "_ (null) .log" ở cuối đường dẫn. Đưa cái gì?

Trả lời

54

Tôi chạy vào hành vi tương tự và giải quyết nó bằng cách thiết lập các biến toàn cầu trước khi gọi các XmlConfigurator ... Dưới đây là những gì tôi đang sử dụng thành công:

chi tiết log4net.config:

<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender,log4net"> 
    <File type="log4net.Util.PatternString" value="App_Data/%property{LogName}" /> 
    ... 
</appender> 

toàn cầu chi tiết .asax:

private static readonly log4net.ILog log = log4net.LogManager.GetLogger("Global.asax"); 
void Application_Start(object sender, EventArgs e) 
{ 
    // Set logfile name and application name variables 
    log4net.GlobalContext.Properties["LogName"] = GetType().Assembly.GetName().Name + ".log"; 
    log4net.GlobalContext.Properties["ApplicationName"] = GetType().Assembly.GetName().Name; 

    // Load log4net configuration 
    System.IO.FileInfo logfile = new System.IO.FileInfo(Server.MapPath("log4net.config")); 
    log4net.Config.XmlConfigurator.ConfigureAndWatch(logfile); 

    // Record application startup 
    log.Debug("Application startup"); 
} 

Hope this helps ...

+0

Tôi đã gặp vấn đề chính xác, trong trường hợp của tôi, tôi đã cố gắng đăng nhập vào cùng một tệp từ 2 quy trình khác nhau. Nó đã nhận được trong 2 tập tin riêng biệt, nhưng thiết lập các biến toàn cầu trước khi gọi XmlConfigurator trong ứng dụng thứ hai giải quyết được vấn đề. Cảm ơn nhiều. +1 –

+1

tôi đã sử dụng 'System.Reflection.Assembly.GetExecutingAssembly(). GetName(). Name' cho tên ứng dụng –

+0

@Dscoduc Lớp nào chứa Server.MapPath bạn có thể chia sẻ chi tiết không – Venkat

1

Trình ghi nhật ký đã được khởi tạo thông qua phương pháp toàn cầu hoặc chính trong ứng dụng? Có thể là GlobalContext vẫn chưa được khởi tạo.

+0

tôi đã gọi LogManager.GetLogger() trước khi đặt thuộc tính. Ngoài ra, ghi nhật ký đang hoạt động chính xác, chỉ cần tên tệp không chọn giá trị tùy chỉnh. –

13

Thêm type = log4net.Util.PatternString vào yếu tố tập tin

4

Vấn đề (tôi nghĩ) là bạn GET (GetLogger) logger trước khi bạn đặt tên và tải cấu hình ...

Cố gắng làm bố logger như : private static log4net.ILog _pLog và sau đó trong Application_Start làm:

void Application_Start(object sender, EventArgs e) 
{ 
    // Set logfile name and application name variables 
    log4net.GlobalContext.Properties["LogName"] = GetType().Assembly.GetName().Name + ".log"; 
    log4net.GlobalContext.Properties["ApplicationName"] = GetType().Assembly.GetName().Name; 

    // Load log4net configuration 
    System.IO.FileInfo logfile = new System.IO.FileInfo(Server.MapPath("log4net.config")); 
    log4net.Config.XmlConfigurator.ConfigureAndWatch(logfile); 

    //Get the loger 
    _pLog = log4net.LogManager.GetLogger("Global.asax"); 

    // Record application startup 
    pLog .Debug("Application startup"); 
} 

Vì vậy, trình tự là:

// Set logfile name and application name variables 
// Load log4net configuration 
// get the logger 
// Record application startup