Log4net không ghi tệp nhật ký


159

Tôi đã tạo một kịch bản đơn giản bằng Log4net, nhưng có vẻ như các appender của tôi không hoạt động vì các tin nhắn không được thêm vào logfile.

Tôi đã thêm phần sau vào tệp web.config:

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

<log4net>
    <appender name="LogFileAppender" type="log4net.Appender.FileAppender">
            <file value="D:\MyData\Desktop\LogFile.txt" />
            <appendToFile value="true" />
            <encoding value="utf-8" />
            <layout type="log4net.Layout.SimpleLayout" />
    </appender>


    <root>
        <level value="INFO" />
        <appender-ref ref="LogFileAppender" />
    </root>
</log4net>

Trong tệp ASAX toàn cầu tôi đã thêm:

ILog logger = LogManager.GetLogger(typeof(MvcApplication));

và trong phương thức Application_Start:

logger.Info("Starting the application...");

Tôi đã làm gì sai?

Câu trả lời:


316

Bạn có gọi

log4net.Config.XmlConfigurator.Configure();

một nơi nào đó để làm cho log4net đọc cấu hình của bạn? Ví dụ: trong Global.asax:

void Application_Start(object sender, EventArgs e) 
{
    // Code that runs on application startup

    // Initialize log4net.
    log4net.Config.XmlConfigurator.Configure();
}

4
Cảm ơn rất nhiều, tôi đã có dòng sau: log4net.Config.BasicConfigurator.Configure (); Tôi có gọi điều này nếu tôi sử dụng cấu hình c # thay vì web.config để định cấu hình log4net không? Đây có phải là "Định cấu hình" cuộc gọi -Method theo bất kỳ cách nào được yêu cầu không vì trong nhiều hướng dẫn tôi không tìm thấy dòng mã này.
john84

9
Có rất nhiều cách để cho log4net biết nơi cần tìm cấu hình, xem log.apache.org/log4net/release/manual/configuration.html . Gọi XmlConfigurator.Configure () sẽ giúp log4net tìm cấu hình trong <app.exe> ​​.config hoặc web.config. BasicConfigurator.Configure sẽ (theo tài liệu SDK): "Khởi tạo hệ thống ghi nhật ký log4net bằng ConsoleAppender sẽ ghi vào Console.Out."
Andreas Paulsson

FYI - bạn cũng có thể sử dụng log4net.Config.BasicConfigurator nếu bạn KHÔNG muốn nó dựa trên tập tin. Đầu ra được gửi đến bàn điều khiển.
silverArc

1
Tôi đang làm cấu hình trong AssemblyInfotập tin. Đăng như một câu trả lời dưới đây.
LCJ

Argh, đã tìm thấy rất nhiều câu hỏi trong số này và ở mọi nơi họ không đề cập đến nơi tìm các tệp nhật ký thực tế ... Điều đó rõ ràng đến mức mọi người đều biết?
MrFox

50

Sử dụng trang Câu hỏi thường gặp này: Câu hỏi thường gặp về Apache log4net

Khoảng 3/4 đường xuống, nó cho bạn biết cách bật gỡ lỗi log4net bằng cách sử dụng theo dõi ứng dụng. Điều này sẽ cho bạn biết vấn đề của bạn ở đâu.

Những điều cơ bản là:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <appSettings>
        <add key="log4net.Internal.Debug" value="true"/>
    </appSettings>
</configuration>

Và bạn thấy dấu vết trong đầu ra tiêu chuẩn


1
Cảm ơn tôi đã kiểm tra Câu hỏi thường gặp nhưng chúng không thể giải quyết vấn đề của tôi.
john84

1
Nhờ câu trả lời này, tôi đã có thể xác định rằng rootphần của tôi đã đề cập đến logger sai !!
seebcakes

mẹo tuyệt vời. Tôi thấy rằng quyền truy cập đã bị từ chối đối với người dùng asp.net
Blue Clouds

nếu nó không hoạt động với ai đó, thì hãy thử cách của tôi để sử dụng cái này: <log4net> <Internal> <Debug value = "true"> </ Debug> </ Internal> </ log4net>
himanshupareek66

35

Như @AndreasPaulsson đề xuất, chúng ta cần cấu hình nó. Tôi đang làm cấu hình trong AssemblyInfotập tin. Tôi chỉ định configuration file nameở đây.

// Log4Net Configuration.
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]

9
Điều gì xảy ra nếu tôi có cả cái này và log4net.Config.XmlConfigurator.Configure (); đang tải?
n00b

1
@ n00b, sau đó chúng tôi có thể nhận xét dòng này, thực ra chỉ với cách này nó hoạt động với tôi "log4net.Config.XmlConfigurator.Configure ();", và một điều nữa: Tôi đã thêm dòng này vào cài đặt web.config của tôi = "log4net.I Internalal.Debug" value = "true" />
himanshupareek66

33

Ngoài ra, hãy đảm bảo tùy chọn "Sao chép luôn" được chọn cho [log4net] .config

nhập mô tả hình ảnh ở đây


1
Đây là bản sửa lỗi cho tôi. Tôi luôn quên thiết lập này.
Ju66ernaut

25

Đảm bảo quy trình (tài khoản) mà trang web đang chạy có đặc quyền ghi vào thư mục đầu ra.

Trong IIS 7 trở lên, phần này được cấu hình trên nhóm ứng dụng và thông thường là Danh tính AppPool , thông thường sẽ không có quyền ghi vào tất cả các thư mục.

Kiểm tra nhật ký sự kiện của bạn (ứng dụng và bảo mật) để xem có trường hợp ngoại lệ nào được đưa ra không.


Cảm ơn sự giúp đỡ của bạn, tôi cũng đã nghĩ về các vấn đề về quyền nhưng cũng như nếu tôi đặt vào thư mục đọc, viết, sửa đổi và thực thi quyền cho mọi người thì nó không hoạt động.
john84

@ john84 - bạn có nhận được ngoại lệ không? Bạn đã xem nhật ký sự kiện?
Oded

Cũng quan trọng, như tôi vừa phát hiện ra, với một Dịch vụ Windows đang chạy trong một tài khoản cụ thể.
Bob Mc

Cảm ơn rất nhiều đã giúp tôi rất nhiều.
Abbas

20

Chèn:

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

ở phần cuối của AssemblyInfo.cs tập tin


Đây là sự giải cứu của tôi. Thực hiện một dự án Forms trên máy tính để bàn và đặt log4net.Config.XmlConfigurator.Configure (); trong chính đã không giúp đỡ. Cảm ơn
Tomas Hesse

Điều này đã giúp tôi. Tôi đã có cấu hình trong web.config nhưng log4net dường như không nhận được các thay đổi được thực hiện. Tôi đã thêm "Watch = true" vào thuộc tính đó và anithing bắt đầu hoạt động
mặc dù

3

Đối với tôi, tôi đã di chuyển vị trí của các logfiles và chỉ đến khi tôi thay đổi tên của tệp thành một tên khác thì nó mới bắt đầu lại.

Dường như nếu có một logfile có cùng tên đã tồn tại, không có gì xảy ra.

Sau đó, tôi đổi tên tập tin cũ và thay đổi tên tệp nhật ký trong cấu hình một lần nữa thành nó.


2

Trong trường hợp của tôi, log4net không đăng nhập đúng do có một khoảng trắng trong tên dự án của tôi. Hãy cho tôi biết tại sao cùng một mã chỉ hoạt động tốt trong một dự án khác, nhưng lại không có trong dự án mới. Không gian. Một không gian đơn giản.

Vì vậy, hãy cẩn thận không gian trong tên dự án. Tôi đã học được bài học của mình.


1
Trường hợp bạn có vấn đề này? Log4Net đang hoạt động rất tốt trong một dự án, nhưng không phải trên một dự án khác ... không biết tại sao. Tks
Pascal

1

Trong trường hợp của tôi, tôi đã phải cấp quyền IIS_IUSRSĐọc \ ghi cho tệp nhật ký.


1

Đảm bảo mã dòng sau sẽ có trong tệp AssociationInfo.cs.

[lắp ráp: log4net.Config.XmlConfigurator (ConfigFile = "Web.config", Watch = true)]

và cũng kiểm tra dòng này trong phương thức Application_start ().

log4net.Config.XmlConfigurator.Configure();

0

Tập tin cấu hình của bạn có vẻ đúng. Sau đó, bạn phải đăng ký tệp cấu hình Log4net của mình vào ứng dụng. Vì vậy, bạn có thể sử dụng mã dưới đây:

var logRepo = LogManager.GetRepository(Assembly.GetEntryAssembly());
XmlConfigurator.Configure(logRepo, new FileInfo("log4net.config"));

Sau khi đăng ký quá trình, bạn có thể gọi định nghĩa dưới đây để gọi logger:

private static readonly ILog log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);

log.Error("Sample log");

0

Đối với tôi, tôi đã phải chuyển Logger sang Gói Nuget. Mã dưới đây cần được thêm vào trong dự án gói NuGet.

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config")]

Xem https://gurunadhduvvuru.wordpress.com/2020/04/30/log4net-issues-when-mond-it-to-a-nuget-package/ để biết thêm chi tiết.


Cố gắng tránh các liên kết như câu trả lời. Họ có thể không luôn luôn làm việc. Có lẽ chỉnh sửa câu trả lời của bạn để bao gồm một bản tóm tắt thông tin trong liên kết.
Derek C.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.