2014-09-04 112 views
1

我决定使用log4net来处理我正在处理的应用程序的所有日志记录活动...阅读完文档后,我决定开始进行实验,但在第一次尝试失败后尝试log4net BasicConfigurator未在控制台上打印

该应用程序正在使用MonoDevelop 3.0.3.2在相当标准的Debian 7发行版中使用C#开发,以便稍后部署在Linux机器上。

到目前为止,代码是微不足道的,它遵循log4net文档中非常早期的步骤,并在文章末尾加以引用。

问题是记录器不打印任何东西到控制台;在试图理解发生了什么问题的同时,我用调试器研究了它;我看到日志引用包含AppendersCollection,不幸是空的我猜在配置过程中某些东西不能正常工作,并且我没有appender,因此没有日志输出。

我错过了什么?任何建议? MonoDevelop-Linux-log4net的组合存在某种我不知道的问题吗?

using System; 
using log4net; 
using log4net.Config; 

namespace TestLog4Net 
{ 
    class MainClass 
    { 
     private static readonly ILog log = LogManager.GetLogger(typeof(MainClass)); 

     public static void Main (string[] args) 
     { 
      BasicConfigurator.Configure(); 

      Console.WriteLine ("Hello World!"); 
      log.Info("Hello World!"); 
     } 
    } 
} 

UPDATE

我做了一些测试,加载配置文件。 我创建了3个记录器,每个记录器都有自己的appender,两个是滚动文件appender,另一个是控制台appender。 然后我登录“Hello World!”在每个记录器上。 滚动文件记录器按预期工作,而无法找到ConsoleLogger的输出。我用调试器和木012检查对象不显示一个空的AppenderCollection,但没有输出无论如何。您可以在下面找到更新后的代码以及配置文件。

using System; 
using log4net; 
using log4net.Config; 

namespace TestLog4Net 
{ 
    class MainClass 
    { 

     public static void Main (string[] args) 
     { 
      XmlConfigurator.Configure(new System.IO.FileInfo("app.config")); 

      ILog rflogger1 = LogManager.GetLogger("RFLoggerOne"); 
      ILog rflogger2 = LogManager.GetLogger("RFLoggerTwo"); 
      ILog clogger = LogManager.GetLogger("CLogger"); 

      rflogger1.Info("Hello World!"); 
      rflogger2.Info("Hello World!"); 
      clogger.Info("Hello World!"); 

      Console.WriteLine ("Hello World!"); 
     } 
    } 
} 

<log4net> 
<appender name="CAppender" type="log4net.Appender.AnsiColorTerminalAppender"> 
    <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> 
    </layout> 
</appender> 

<appender name="RFAppender1" type="log4net.Appender.RollingFileAppender"> 
    <file value="rf1.log"/> 
    <appendToFile value="true"/> 
    <rollingStyle value="Composite"/> 
    <datePattern value="yyyyMMdd"/> 
    <maxSizeRollBackups value="10"/> 
    <maximumFileSize value="1000000"/> 
    <staticLogFileName value="true"/> 
    <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%date [%thread] %level %logger - %message%newline"/> 
    </layout> 
</appender> 

<appender name="RFAppender2" type="log4net.Appender.RollingFileAppender"> 
    <file value="rf2.log" /> 
    <appendToFile value="true" /> 
    <maximumFileSize value="100KB" /> 
    <maxSizeRollBackups value="2" /> 

    <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%level %thread %logger - %message%newline" /> 
    </layout> 
</appender> 


<logger name="CLogger"> 
    <level value="ALL"/> 
    <appender-ref ref="CAppender"/> 
</logger> 

<logger name="RFLoggerOne"> 
    <level value="ALL"/> 
    <appender-ref ref="RFAppender1"/> 
</logger> 

<logger name="RFLoggerTwo"> 
    <level value="ALL"/> 
    <appender-ref ref="RFAppender2"/> 
</logger> 


<root> 
    <level value="ALL"/> 
</root> 
</log4net> 
+0

你可以在你的app.config或/和log4net配置中显示你的log4net配置吗? – Peter 2014-09-04 15:13:35

+0

@peer:附加的代码应该使用BasicConfigurator,并根据文档,不需要配置文件...在此期间,我用配置文件进行了一些测试,发现我遇到了问题与ConsoleAppender,而RollingFileAppender工作正常,让我用新的代码和配置文件更新原始帖子。 – BaroneAshura 2014-09-04 15:24:30

回答

0

你使用哪种类型的项目?控制台应用程序? 有几种情况你不会在控制台上看到std :: out或std :: err的输出。 看看这篇文章: Can one executable be both a console and GUI application?

+0

项目创建完成后,它被创建为MonoDevelop中的C#控制台应用程序,并且附加的源代码是唯一的源文件,它是项目的一部分。自项目创建以来,我并没有在项目设置中调整过任何内容,而且该项目只是为了使用log4net进行一些测试而创建的。所以我敢说它是一个控制台应用程序。 – BaroneAshura 2014-09-04 16:08:01