2012-04-18 27 views
52

Tôi có mã này và các tập tin cấu hình dưới đây:Configure Log4Net trong ứng dụng web

ILog log = LogManager.GetLogger(typeof(MyClass)); 
log.Debug("Testing"); 

TestProj thư mục không được tạo ra và nếu tôi tạo ra nó, không TestLog.txt tập tin, không đăng nhập ... không có gì.

Bất kỳ ý tưởng nào?

Cảm ơn,

Các cấu hình tập tin

<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" /> 

<log4net debug="true"> 
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender"> 
    <file value="C:\\TestProj\\TestLog.txt" /> 
    <appendToFile value="true" /> 
    <rollingStyle value="Size" /> 
    <maxSizeRollBackups value="10" /> 
    <maximumFileSize value="10MB" /> 
    <staticLogFileName value="true" /> 
    <layout type="log4net.Layout.PatternLayout"> 
    <conversionPattern value="%-5p %d %5rms %-22.22c{1} %-18.18M - %m%n" /> 
    </layout> 
</appender> 

<root> 
    <level value="DEBUG" /> 
    <appender-ref ref="RollingLogFileAppender" /> 
</root> 
</log4net> 
+2

Liệu ứng dụng web có quyền tạo thư mục và tập tin? – Xharze

+1

Đó là trên máy dev của tôi> toàn quyền –

+0

https://dzone.com/articles/using-log4net-web-applications – SunilA

Trả lời

101

Bạn cần phải gọi Configure chức năng của XmlConfigurator

log4net.Config.XmlConfigurator.Configure(); 

Hoặc gọi trước khi gọi loggin đầu tiên của bạn hoặc trong Global.asax của bạn như thế này:

protected void Application_Start(Object sender, EventArgs e) { 
    log4net.Config.XmlConfigurator.Configure(); 
} 
+0

OK đó là công việc :) Bây giờ tôi phải định cấu hình tệp để xem trong nhật ký những gì tôi muốn –

+2

Nếu bạn đang sử dụng một dự án Web bạn có thể phải làm mục mới và thêm tệp Global.asax, vì nó không tồn tại theo mặc định. Bạn cũng nên ngay lập tức đăng nhập một cái gì đó. log4net.Config.XmlConfigurator.Configure(); log4net.ILog log = log4net.LogManager.GetLogger (System.Reflection.MethodBase.GetCurrentMethod(). DeclaringType); log.Debug ("Thiết lập trong Application_Start."); – ggb667

2

thường này là do quyền mất tích. Các cửa sổ tài khoản IIS Application Pool cục bộ đang chạy với có thể không có quyền ghi vào thư mục ứng dụng. Bạn có thể tạo một thư mục ở đâu đó, cho phép mọi người viết nó và trỏ cấu hình log4net của bạn vào thư mục đó. Nếu sau đó một tệp nhật ký được tạo ở đó, bạn có thể sửa đổi các quyền cho thư mục nhật ký mong muốn của mình để nhóm ứng dụng có thể ghi vào nó.

Một lý do khác có thể là log4net chưa được khởi tạo. Trong một ứng dụng winforms, bạn thường cấu hình log4net khi bắt đầu ứng dụng. Trong một ứng dụng web, bạn có thể thực hiện thao tác này (trong thành phần ghi nhật ký của mình, kiểm tra xem bạn có thể tạo một trình ghi nhật ký Ilog cụ thể bằng tên của nó không, nếu không -> gọi configure()) hoặc một lần nữa khi ứng dụng khởi động trong global.asax.cs .

6

1: Thêm dòng sau vào lớp AssemblyInfo

[assembly: log4net.Config.XmlConfigurator(Watch = true)] 

2: Make sur e bạn không sử dụng .Net Framework 4 Client Profile làm Target Framework (Tôi cho rằng điều này phù hợp với bạn bởi vì nếu không nó sẽ không biên dịch)

3: Đảm bảo bạn đăng nhập sớm trong chương trình của mình. Nếu không, trong một số trường hợp, nó sẽ không được khởi tạo đúng cách (đọc thêm trên log4net FAQ).

Vì vậy, đăng nhập một cái gì đó quá trình khởi động ứng dụng trong Global.asax

public class Global : System.Web.HttpApplication 
{ 
    private static readonly log4net.ILog Log = log4net.LogManager.GetLogger(typeof(Global)); 
    protected void Application_Start(object sender, EventArgs e) 
    { 
     Log.Info("Startup application."); 
    } 
} 

4: Hãy chắc chắn rằng bạn có quyền tạo các file và thư mục trên con đường nhất định (nếu thư mục riêng của mình cũng không tồn tại)

5: phần còn lại của thông tin cung cấp của bạn trông ok

+3

bạn có nguồn hỗ trợ điểm 3 không? – Default

+3

@Default Xem "Khi nào tôi nên đăng nhập thông điệp đầu tiên của mình" trong [FAQ] (https://logging.apache.org/log4net/release/faq.html) –

19

Một cách khác để làm điều này sẽ có thêm dòng này đến các thông tin lắp ráp của các ứng dụng web:

// Configure log4net using the .config file 
[assembly: log4net.Config.XmlConfigurator(Watch = true)] 

Tương tự như của Shriek.

+0

Điều này sẽ chỉ hoạt động trong các ứng dụng "bình thường", nhưng không phải với một ứng dụng web. – shriek

+1

@shriek: Tôi không chắc bạn đúng. Thuộc tính này được sử dụng để cấu hình XmlConfigurator mà không cần gọi một trong các phương thức Cấu hình. Đúng là 'Watch = True' không có nhiều giá trị vì thay đổi trong web.config luôn khiến khởi động lại ứng dụng web – hwcverwe

+1

@hwcverwe: Tôi vừa mới gặp vấn đề này ngày hôm qua, thuộc tính đã có nhưng logger không làm gì cả. Chỉ sau khi gọi phương thức 'Configure' trước khi cuộc gọi đầu tiên tới logger nó hoạt động. (Đây là một dịch vụ WCF) – shriek

0

Tôi cũng gặp vấn đề tương tự. Nhật ký không được tạo.

Vui lòng kiểm tra thuộc tính logger tên phải phù hợp với LogManager.GetLogger của bạn ("tên")

<logger name="Mylog"> 
     <level value="All"></level> 
     <appender-ref ref="RollingLogFileAppender" /> 
    </logger> 



private static readonly ILog Log = LogManager.GetLogger("Mylog");