2014-04-11 15 views
9

Trước hết, tôi đã thấy rất nhiều câu trả lời và lời khuyên về các chủ đề khác (tương tự như hầu hết: Log4Net: Multiple loggers), nhưng không có câu trả lời thích hợp.Log4Net Nhiều logger

Tôi muốn có 2 logger với appenders tập tin khác nhau và hạn chế từng viết vào logger gốc. Đây là ứng dụng Console. Tổng số các mã bên dưới:

using System; 
using System.Diagnostics; 
using System.Linq; 
using log4net; 

namespace Test_log4net 
{ 
class Program 
{ 
    static void Main(string[] args) 
    { 
     log4net.Config.XmlConfigurator.Configure(); 

     ILog logger = LogManager.GetLogger("Async"); 
     logger.Info("started async"); 
     Console.WriteLine("Logger: {0}", (logger as log4net.Core.LogImpl).Logger.Name); 
     Console.WriteLine("Appenders: {0}", string.Join(", ", (logger as log4net.Core.LogImpl).Logger.Repository.GetAppenders().ToList().Select(appendr => appendr.Name))); 


     ILog logger2 = LogManager.GetLogger("Sync"); 
     logger2.Info("started sync"); //changed: from logger -> to logger2 on 10/21/2014 
     Console.WriteLine("Logger: {0}", (logger2 as log4net.Core.LogImpl).Logger.Name); 
     Console.WriteLine("Appenders: {0}", string.Join(", ", (logger2 as log4net.Core.LogImpl).Logger.Repository.GetAppenders().ToList().Select(appendr => appendr.Name))); 

     Console.ReadKey(); 
    }  
} 
} 

Và App.config

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
<configSections> 
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/> 
</configSections> 
<startup> 
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> 
</startup> 
<log4net> 
    <root> 
     <level value="All"/> 
    </root> 

    <appender name="FileInfoAppenderA" type="log4net.Appender.RollingFileAppender"> 
     <file value="D:\\temp\\AsyncTest.log"/> 
     <filter type="log4net.Filter.LevelRangeFilter"> 
      <levelMin value="DEBUG"/> 
      <levelMax value="FATAL"/> 
     </filter> 
     <appendToFile value="true"/> 
     <rollingStyle value="Size"/> 
     <maxSizeRollBackups value="10"/> 
     <maximumFileSize value="100MB"/> 
     <staticLogFileName value="true"/> 
     <datePattern value="yyyyMMdd"/> 
     <layout type="log4net.Layout.PatternLayout"> 
      <conversionPattern value="%d - %m%n"/> 
     </layout> 
    </appender> 

    <appender name="FileInfoAppenderS" type="log4net.Appender.RollingFileAppender"> 
     <file value="D:\\temp\\SyncTest.log"/> 
     <filter type="log4net.Filter.LevelRangeFilter"> 
      <levelMin value="DEBUG"/> 
      <levelMax value="FATAL"/> 
     </filter> 
     <appendToFile value="true"/> 
     <rollingStyle value="Size"/> 
     <maxSizeRollBackups value="10"/> 
     <maximumFileSize value="100MB"/> 
     <staticLogFileName value="true"/> 
     <datePattern value="yyyyMMdd"/> 
     <layout type="log4net.Layout.PatternLayout"> 
      <conversionPattern value="%d - %m%n"/> 
     </layout> 
    </appender> 

    <logger Name="Sync" additivity="false"> 
     <level value="INFO"/> 
     <appender-ref ref="FileInfoAppenderS"/> 
    </logger> 

    <logger Name="Async" additivity="false"> 
     <level value="INFO"/> 
     <appender-ref ref="FileInfoAppenderA"/> 
    </logger> 

</log4net> 
</configuration> 

Và giao diện điều khiển đầu ra:

Logger: Async 
Appenders: FileInfoAppenderA 
Logger: Sync 
Appenders: FileInfoAppenderA 

tập tin đã được tạo ra, nhưng cả hai trong số đó là sản phẩm nào. Khi tôi định appenders trong thư mục gốc, như:

<root> 
    <level value="All"/> 
    <appender-ref ref="FileInfoAppenderA"/> 
    <appender-ref ref="FileInfoAppenderS"/> 
</root> 

sau đó, giao diện điều khiển:

log4net:ERROR [RollingFileAppender] Attempted to append to closed appender named [FileInfoAppenderS] 
Logger: Async 
Appenders: FileInfoAppenderA, FileInfoAppenderS 
Logger: Sync 
Appenders: FileInfoAppenderA, FileInfoAppenderS 

Và chỉ trong AsyncTest.log:

2014-04-11 17:26:58,142 - started async 
2014-04-11 17:26:58,151 - started sync 

Những gì tôi đang làm sai?

UPD (2014/10/21): Với log4net mới nhất có sẵn thông qua NuGet Tôi đã sau console đầu ra:

Logger: Async 
Appenders: FileInfoAppenderA 
Logger: Sync 
Appenders: FileInfoAppenderA 

Và cả các tập tin (AsyncTest.log, SyncTest.log) là rỗng.

UPD (08/4/2015): Giải pháp là sử dụng chữ thường khi đặt thuộc tính cho mọi thứ trong phần log4net. Vì vậy, tôi chỉ nên thay đổi các dòng sau trong app.config:

...... 
<logger name="Sync" additivity="false"> 
...... 
<logger name="Async" additivity="false"> 
...... 

Lưu ý sự khác biệt: thuộc tính 'tên' nằm trong chữ thường.

+0

cho giải pháp mà tôi cần đọc cho đến khi kết thúc Câu hỏi của bạn. trường hợp thấp hơn vấn đề. –

Trả lời

13

Bạn có một vài lỗi chính tả trên ví dụ của bạn. Đầu tiên là bạn không đóng thẻ cấu hình, và lý do tại sao bạn đang nhận được chỉ trong một tập tin, là bởi vì bạn gọi:

logger.Info("started async"); 

và sau đó bạn đáng ngạc nhiên làm:

logger.Info("started sync"); 

Bạn sẽ không nhận được văn bản trong tập tin thứ hai bởi vì bạn thực sự không đăng nhập vào nó.

Và trong giao diện điều khiển tôi nhận được từ mã của bạn:

Logger: Async 
Appenders: FileInfoAppenderS, FileInfoAppenderA 
Logger: Sync 
Appenders: FileInfoAppenderS, FileInfoAppenderA 

Để biết thông tin trong tương lai, bạn đã làm một cách chính xác bằng cách đặt additivity false, vì điều này có nghĩa rằng logger sẽ không kế thừa từ logger gốc.Như về tuyên bố:

Tôi muốn có 2 logger với appenders tập tin khác nhau và hạn chế từng viết vào logger gốc

Tôi không hiểu nó. Nếu bạn muốn logger của bạn ghi vào các tập tin này trong khi root logger có một appender console chẳng hạn, chỉ cần remove additivity và chúng sẽ ghi vào console và các file riêng của chúng. Cũng được thử nghiệm và nó hoạt động rất tốt.

Tôi đã đọc nhận xét của bạn. Bây giờ tôi thêm mã mà tôi đang sử dụng và nhận được những gì bạn cần:

class Program 
{ 
    static void Main(string[] args) 
    { 
     log4net.Config.XmlConfigurator.Configure(); 

     ILog logger = LogManager.GetLogger("Async"); 
     logger.Info("started async"); 
     Console.WriteLine("Logger: {0}", (logger as log4net.Core.LogImpl).Logger.Name); 
     Console.WriteLine("Appenders: {0}", string.Join(", ", (logger as log4net.Core.LogImpl).Logger.Repository.GetAppenders().ToList().Select(appendr => appendr.Name))); 


     ILog logger2 = LogManager.GetLogger("Sync"); 
     logger2.Info("started sync"); 
     Console.WriteLine("Logger: {0}", (logger2 as log4net.Core.LogImpl).Logger.Name); 
     Console.WriteLine("Appenders: {0}", string.Join(", ", (logger2 as log4net.Core.LogImpl).Logger.Repository.GetAppenders().ToList().Select(appendr => appendr.Name))); 

     Console.ReadKey(); 
    } 
} 

Và app.config:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <configSections> 
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/> 
    </configSections> 
    <startup> 
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> 
    </startup> 
    <log4net> 
    <appender name="FileInfoAppenderA" type="log4net.Appender.RollingFileAppender"> 
     <file value="C:\\temp\\AsyncTest.log"/> 
     <filter type="log4net.Filter.LevelRangeFilter"> 
     <levelMin value="DEBUG"/> 
     <levelMax value="FATAL"/> 
     </filter> 
     <appendToFile value="true"/> 
     <rollingStyle value="Size"/> 
     <maxSizeRollBackups value="10"/> 
     <maximumFileSize value="100MB"/> 
     <staticLogFileName value="true"/> 
     <datePattern value="yyyyMMdd"/> 
     <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%d - %m%n"/> 
     </layout> 
    </appender> 

     <appender name="FileInfoAppenderS" type="log4net.Appender.RollingFileAppender"> 
     <file value="C:\\temp\\SyncTest.log"/> 
     <filter type="log4net.Filter.LevelRangeFilter"> 
      <levelMin value="DEBUG"/> 
      <levelMax value="FATAL"/> 
     </filter> 
     <appendToFile value="true"/> 
     <rollingStyle value="Size"/> 
     <maxSizeRollBackups value="10"/> 
     <maximumFileSize value="100MB"/> 
     <staticLogFileName value="true"/> 
     <datePattern value="yyyyMMdd"/> 
     <layout type="log4net.Layout.PatternLayout"> 
      <conversionPattern value="%d - %m%n"/> 
     </layout> 
     </appender> 

    <root> 
     <level value="INFO"/> 
    </root> 

    <logger name="Sync" additivity="false"> 
     <level value="INFO"/> 
     <appender-ref ref="FileInfoAppenderS"/> 
    </logger> 

    <logger name="Async" additivity="false"> 
     <level value="INFO"/> 
     <appender-ref ref="FileInfoAppenderA"/> 
    </logger> 
    </log4net> 
</configuration> 

phiên bản Log4net: 1.2.13.0 với .NET 4.0 Cho tôi xin nếu bạn có được những gì bạn muốn.

+0

XMight, thx để phát lại. Typos không ảnh hưởng đến ứng dụng, chỉ là bài đăng của tôi (dù sao - cố định). Tôi đã tái tạo dự án từ mã tôi đã đăng ở đây trước và với log4net 1.2.13.0 nó không hoạt động chút nào - cả hai tệp đều trống (mặc dù tôi đã chuyển sang logger2.Info ("bắt đầu đồng bộ hóa");). Hơn nữa, chỉ "FileInfoAppenderA" được liệt kê trong cả hai logger. Và để làm rõ mục tiêu của tôi: 1) cần logger1 -> đăng nhập vào asyng.log CHỈ 2) cần logger2 -> đăng nhập vào sync.log ONLY. 3) Không logger1, không logger2 nên đăng nhập vào logger gốc (bất cứ điều gì được đăng ký ở đó) – LaoR

+0

cuối cùng tôi đã có vấn đề gì) Bạn sẽ cười) Bạn có thấy sự khác biệt giữa ' 'và của bạn' '? Có, chỉ là tên thuộc tính có phân biệt chữ hoa chữ thường 'name! = Name'. Đó là lý do tại sao logger của tôi không đăng nhập vào các tệp thích hợp và cả hai tệp đều trống. – LaoR

+0

Tôi rất vui vì bạn đã tìm thấy sự cố;) – XMight

0

Cấu hình này làm việc cho tôi:

<log4net> 
<root name="EventLog"> 
<level value="ALL"/> 
<appender-ref ref="EventLogAppender"/> 
</root> 

<logger name="FileLogger" additivity="false"> 
<level value="ALL" /> 
<appender-ref ref="RollingFileAppender" /> 

...appenders 
</logger> 

Good Luck!

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