2009-02-21 21 views
34

Tôi đang cố tìm ai đó thông minh hơn tôi để xác thực một số cú pháp tôi đã viết. Ý tưởng là định cấu hình tên tệp của RollingFileAppender của tôi thành tên của hội đồng để làm cho nó có thể sử dụng lại nhiều hơn cho các dự án của tôi.Cách tốt nhất để tự động đặt đường dẫn tệp của người gắn thêm

Tôi đã nhìn thấy this previous SO article nhưng nó là không chính xác có thể trả lời câu hỏi của tôi ...

Tôi đã có một Dickens của một thời gian cố gắng tìm hiểu các thành phần bên trong của Log4net và đây là những gì tôi đã với (cư trú trong tập tin Global.asax - Phương pháp Application_Start):

// Bind to the root hierarchy of log4net 
log4net.Repository.Hierarchy.Hierarchy root = 
    log4net.LogManager.GetRepository() 
    as log4net.Repository.Hierarchy.Hierarchy; 

if (root != null) 
{ 
    // Bind to the RollingFileAppender 
    log4net.Appender.RollingFileAppender rfa = 
    (log4net.Appender.RollingFileAppender)root.Root.GetAppender("RollingLogFileAppender"); 

    if (rfa != null) 
    { 
    // Set the file name based on the assembly name 
    string filePath = 
     string.Format("~/App_Data/{0}.log", GetType().Assembly.GetName().Name); 

    // Assign the value to the appender 
    rfa.File = Server.MapPath(filePath); 

    // Apply changes to the appender 
    rfa.ActivateOptions(); 
    } 
} 

Bất cứ ai có thể cho tôi biết, 'điều này thật ghê tởm', hay 'điều này sẽ làm việc tốt'? Ngoài ra, nếu tôi đặt tập tin tự động tôi có thể vẫn mong đợi hành vi log4net để xoay các tập tin dựa trên các thiết lập tập tin log4net.config?

Được đánh giá cao!

Trả lời

82

Bạn đang làm điều này một cách khó khăn! Xác định cấu hình log4net của bạn như XML trong tập tin cấu hình ứng dụng của bạn và sử dụng %property{} để lợi thế:

<appender name="YourAppender" type="log4net.Appender.RollingFileAppender"> 
    <file type="log4net.Util.PatternString" value="~/App_Data/%property{LogName}" /> 
    .... 
</appender> 

Đây là năng động - bạn chỉ cần thiết lập thuộc tính log4net "LogName" trước bạn khởi tạo log4net. Do đó, trong mã của bạn bất kỳ lúc nào trước khi bạn định cấu hình log4net, hãy đặt giá trị mong muốn của thuộc tính này:

string LogName = GetType().Assembly.GetName().Name + ".log"; 
log4net.GlobalContext.Properties["LogName"] = LogName; 

Tất nhiên, bạn có thể sử dụng bất kỳ tên thuộc tính nào. Tôi đã chọn "LogName" cho một ví dụ đơn giản, nhưng bạn có thể có một ứng dụng cho mỗi ứng dụng nếu bạn muốn, miễn là mã của bạn biết tên thuộc tính chính xác là gì và giá trị chính xác sẽ là gì.

+2

Ah, chính xác lý do tại sao tôi đăng này ... Dường như khó khăn hơn nó cần phải có được. Cảm ơn bạn ... – Dscoduc

+2

Bạn có biết nếu có một phương pháp tương đương hoặc cách để làm điều này khi sử dụng log4netfactoryadapter? Tôi đang sử dụng common.logging trong tất cả các mã của tôi và khai báo định nghĩa cấu hình (app.config). Tôi đã thử phương pháp GlobalContext nhưng kết thúc bằng (null) trong tên tệp của tôi và tôi biết biến tôi đang sử dụng không phải là rỗng. –

+0

Thật không may, tôi không quen thuộc với log4netfactoryadapter. Bạn có chắc chắn bạn đang sử dụng GlobalContext ** trước khi ** log4net được khởi tạo hoặc sử dụng không? Nếu log4net được sử dụng hoặc được khởi tạo trước khi bạn xác định các thuộc tính của bạn, chúng sẽ bị vô hiệu. – Eddie

0

Tôi đã làm tương tự bằng cách sử dụng% property {}, nhưng tệp được tạo dưới dạng "(nul) .log". Dưới đây là các mã:

log4net.GlobalContext.Properties["service"] = _servicename.ToString(); 
_flatFileLogger = LogManager.GetLogger("FlatFileLogger"); 
_flatFileLogger.Debug(logData.ToString()); 

Tôi đã khai báo trong file XML như

<file type="log4net.Util.PatternString" value="C:\MY_Log\%property{Service}.log" /> 
+2

Tôi nghĩ như ông đã nói ở trên, bạn cần phải cấu hình ứng dụng sau khi bạn đặt thuộc tính dịch vụ của mình. 'log4net.Config.BasicConfigurator.Configure ();' –

7

Trong năm 2015, chúng tôi làm điều đó như thế này:

<file type="log4net.Util.PatternString"> 
    <conversionPattern value="%appdomain.log" /> 
</file> 

Không có mã khác theo yêu cầu.

Miền ứng dụng là tên tệp của hội đồng thực thi.

5

Dưới đây là cách để thiết lập hoặc thay đổi logfile của appender đầu tiên trong thời gian chạy:

var appender = (log4net.Appender.FileAppender)LogManager.GetRepository().GetAppenders()[0]; 
appender.File = "C:\whatever.log"; 
appender.ActivateOptions(); 
Các vấn đề liên quan