2009-04-03 32 views
48

Điều này tương tự như 650694 nhưng không có câu trả lời nào được chấp nhận ở đó, tôi không thể nhận được bất kỳ gợi ý nào để làm việc và tôi nghi ngờ mình có thể ở trong tình huống hơi khác.Thay đổi mức ghi log4net theo lập trình

Tôi đang gọi log4net.Config.XmlConfigurator.Configure(). Nhưng sau thời điểm đó trong chương trình, tôi muốn thay đổi ngưỡng đăng nhập thành một giá trị chỉ được biết khi chạy.

Từ câu hỏi khác, tôi đã cố gắng:

((log4net.Repository.Hierarchy.Logger)mylogger.Logger).Level = log4net.Core.Level.Error; 

và:

var appender = new log4net.Appender.ColoredConsoleAppender(); 
appender.Layout = new log4net.Layout.PatternLayout(@"%date %-5level %message%newline"); 
appender.Threshold = log4net.Core.Level.Error; 
appender.ActivateOptions(); 
log4net.Config.BasicConfigurator.Configure(appender); 

nhưng không ai có vẻ có bất kỳ tác: Tôi vẫn thấy DEBUG và INFO báo cáo trên giao diện điều khiển đăng nhập . Linh cảm của tôi là tôi đang thêm một appender mới, mà không có tác dụng lên appender được khai báo trong cấu hình XML (nó cho nó để in các thông báo mức DEBUG), nhưng tôi chưa có bất kỳ bằng chứng nào cho điều này. Tuy nhiên, tôi không có bất kỳ bằng chứng nào cho điều này .

Tôi đã tìm hiểu qua API log4net một lúc và tôi không thấy nó. Có cái gì đơn giản tôi đang mất tích?

+1

Đặt mức của Trình ghi nhật ký thành "Lỗi" sẽ ngăn chặn bất kỳ lỗi hoặc thông tin đầu ra nào từ trình ghi nhật ký đó khỏi bị ghi nhật ký. Bạn đang nhìn thấy DEBUG và INFO cho Logger rất có mức độ đăng nhập bạn đang thay đổi? – Eddie

+0

Đó là một điểm tốt: # 1 có thể chỉ đặt ngưỡng cho một trình ghi nhật ký. Nhưng # 2 có vẻ như nó phải là toàn cầu. – Ken

+0

Có # 1 chỉ đặt ngưỡng cho cá thể Logger duy nhất bạn đang thay đổi, cộng với bất kỳ Trình ghi nào bên dưới nó trong cấu trúc phân cấp không có cấp độ được đặt rõ ràng. – Eddie

Trả lời

22

Cuối cùng tìm được giải pháp làm việc, here.

Những mảnh lớn là:

  • cần phải thiết lập các ngưỡng trên tất cả các logger, trong đó có "không thể được lấy theo tên" logger gốc
  • cần phải nhận được Cấp từ LevelMap của Hierarchy

Cảm ơn Eddie vì đã đặt câu hỏi đúng, điều này đã đưa tôi đến với google những từ đúng. Tôi sẽ không bao giờ nghĩ ra điều này một mình.

(Bên cạnh: Kho lưu trữ, Phân cấp, Trình ghi nhật ký, RootLogger, LevelMap - Tôi không hề biết rằng thậm chí có thể tạo thư viện ghi nhật ký phức tạp này. Nó có khoảng 20 lớp không phân biệt. đủ cho bất cứ điều gì, nhưng làm cho nó gần như không thể làm những việc đơn giản như "không đăng nhập bất kỳ tin nhắn trên ngưỡng X" Gah)

+0

Yow, điều đó phức tạp hơn tôi tưởng tượng! Liên kết tốt. Câu trả lời của tôi từ câu hỏi 650694 đã làm việc cho tôi trong nhiều ứng dụng, ít nhất với log4Net 1.2.10. Tôi không biết tại sao nó không hiệu quả với bạn, nhưng những gì bạn thấy là * triệt để *! – Eddie

8

có một cách đơn giản để làm điều đó:.!

LogManager.GetRepository().Threshold = Level.Info; 

biết thêm thông tin có thể được tìm thấy here.

+4

Điều này không thay đổi mức độ ghi nhật ký khi quá trình ghi nhật ký đã được định cấu hình. –

+2

Bạn cũng phải cho biết rằng cấu hình đã thay đổi thông qua RaiseConfigurationChanged. –

62

Không có giải pháp nào ở đây có hiệu quả đối với tôi. Nó không thay đổi tại runtime

Đây là những gì làm việc cho tôi:

((log4net.Repository.Hierarchy.Hierarchy)LogManager.GetRepository()).Root.Level = Level.Debug; 
((log4net.Repository.Hierarchy.Hierarchy)LogManager.GetRepository()).RaiseConfigurationChanged(EventArgs.Empty); 

Bạn phải gọi RaiseConfigurationChanged sau khi thực hiện thay đổi cấu hình của nó.

+0

Có - điều này hoạt động hoàn hảo. Cảm ơn. –

0

Tôi đang tìm cách tiếp cận tương tự và thấy rằng phiên bản NLog mới nhất 3.2.0.0 cung cấp tùy chọn bên dưới để thay đổi mức ghi nhật ký khi chạy.

LogManager.GlobalThreshold = LogLevel.Debug; 

Tôi nghĩ cách tiếp cận khác có thể là sử dụng LogManager.Configuration để ghi đè cài đặt cấu hình bằng biến.

+0

mặc định cho LogManager.GlobalThreshold là LogLevel.Trace – seUser

1

Đã thử tất cả các câu trả lời này và không có câu trả lời nào trong số đó hoạt động. Trong trình gỡ lỗi, tôi có thể thấy rằng tất cả các mức logger, mức root, ngưỡng được thiết lập theo chỉ dẫn. Mặc dù vậy, tôi không thấy bất kỳ thay đổi cấp độ nhật ký nào trong tệp tin mà tôi đã đăng nhập.

Sau đó, tôi thấy rằng trong tệp cấu hình, phần tử công cụ tìm kiếm cũng chỉ định giá trị ngưỡng. Vì vậy, khi tôi muốn thay đổi cấp độ để Debug trong khi appender được thiết lập để Warn, ví dụ, appender đã không nhận được tin nhắn bổ sung khi họ dưới ngưỡng. Vì vậy, tôi đã loại bỏ ngưỡng khỏi cấu hình của trình cài đặt và chỉ giữ cấu hình mức.

<root> 
    <level value="Warn" /> 
    <appender-ref ref="RollingFile" /> 
    </root> 

Sau đó, tôi đã kết thúc bằng cách sử dụng giải pháp của Ken để thay đổi cấp khi chạy.

Các vấn đề liên quan