2016-01-22 46 views
2

我已经编写了一个使用记录器的包装类,因为我以前从来没有使用过log4net(我在工作中使用log4C++,但它已经配置好了,我从不需要弄乱它),
我不知道如何正确配置它,得到它的工作...让log4net正常工作

这是包装类的电流源代码:

using System.Text; 
using log4net; 
using log4net.Appender; 
using log4net.Config; 
using log4net.Layout; 

namespace GotLoggingService 
{ 
    public sealed partial class LoggerManager 
    { 
     private ILog Logger { get; } 

     #region Info Methods 

     public void Info(string message) 
     { 
      Logger.Info(message); 
     } 

     public void InfoFormat(string format, params object[] args) 
     { 
      Logger.InfoFormat(format, args); 
     } 

     #endregion 

     #region Debug Methods 

     public void Debug(string message) 
     { 
      Logger.Debug(message); 
     } 

     public void DebugFormat(string format, params object[] args) 
     { 
      Logger.DebugFormat(format, args); 
     } 

     #endregion 

     #region Warn Methods 

     public void Warn(string message) 
     { 
      Logger.Warn(message); 
     } 

     public void WarnFormat(string format, params object[] args) 
     { 
      Logger.WarnFormat(format, args); 
     } 

     #endregion 

     #region Error Methods 

     public void Error(string message) 
     { 
      Logger.Error(message); 
     } 

     public void ErrorFormat(string format, params object[] args) 
     { 
      Logger.ErrorFormat(format, args); 
     } 

     #endregion 

     #region Fatal Methods 

     public void Fatal(string message) 
     { 
      Logger.Fatal(message); 
     } 

     public void FatalFormat(string format, params object[] args) 
     { 
      Logger.FatalFormat(format, args); 
     } 

     #endregion 

     #region Getters 

     public static LoggerManager GetLogger(string name) 
     { 
      return new LoggerManager(name); 
     } 

     public static LoggerManager GetLogger(string name, LoggerManager parent) 
     { 
      return new LoggerManager(name, parent); 
     } 

     public static LoggerManager GetRootLogger() 
     { 
      return RootLooger; 
     } 

     #endregion 
    } 

    // Manage stuff here 
    public sealed partial class LoggerManager 
    { 
     private const string FORMAT = "%timestamp %-5level %logger %ndc - %ndc %message%newline"; 

     // Initializes root logger 
     private LoggerManager() 
     { 
      Logger = LogManager.GetLogger(ROOT_LOGGER_NAME); 
      BasicConfigurator.Configure(new FileAppender 
      { 
       AppendToFile = true, 
       Encoding = Encoding.UTF8, 
       File = "C:/log.txt", 
       ImmediateFlush = true, 
       Layout = new PatternLayout(FORMAT) 
      }); 
     } 

     private LoggerManager(string name) : this(name, GetRootLogger()) 
     { 
     } 

     private LoggerManager(string name, LoggerManager parent) 
     { 
      Logger = GetILog(name, parent); 
     } 

     private const string ROOT_LOGGER_NAME = "root"; 

     private static readonly LoggerManager RootLooger = new LoggerManager(); 

     private static ILog GetILog(string name, LoggerManager parent) 
     { 
      return LogManager.GetLogger(GetLoggerName(name, parent.Logger.Logger.Name)); 
     } 

     private static string GetLoggerName(string name, string parent = ROOT_LOGGER_NAME) 
     { 
      StringBuilder nameBuilder = new StringBuilder(); 
      nameBuilder.AppendFormat("{0}.{1}", LogManager.GetLogger(parent).Logger.Name, name); 
      return nameBuilder.ToString(); 
     } 
    } 
} 

正如你所看到的,我已经试过使用BasicConfigurator进行配置,并使用FileAppender提供。我试着登录的东西,它不将文件添加任何东西......这里是我如何使用记录仪包装一个简单的例子:

using GotLoggingService; 

namespace trythelog 
{ 
    class LoggerTry 
    { 
     private LoggerManager logger; 

     public static void Main(string[] args) 
     { 
      LoggerTry logger = new LoggerTry(); 
     } 

     public LoggerTry() 
     { 
      logger = LoggerManager.GetLogger("some-logger"); 
      logger.Info("this is a log message"); 
     } 
    } 
} 

这基本上是所有我不得不说...谢谢阅读,如果你能指出我搞砸的东西,我希望它。

我现在用的,而不是BasicConfigurator

这App.Config中是在app.config:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <startup> 
     <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" /> 
    </startup> 

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

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

    <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender"> 
     <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%date %-5level %logger %ndc - %ndc %message%newline" /> 
     </layout> 
    </appender> 

    <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender"> 
     <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> 
     <file value="logs/" /> 
     <datePattern value="yyyyMMdd'.log'" /> 
     <staticLogFileName value="false" /> 
     <appendToFile value="true" /> 
     <rollingStyle value="Composite" /> 
     <maxSizeRollBackups value="10" /> 
     <maximumFileSize value="5MB" /> 
     <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%date %-5level %logger %ndc - %ndc %message%newline" /> 
     </layout> 
    </appender> 

    </log4net> 
</configuration> 

我得到这个例外,当我尝试运行:http://pastebin.com/qftQAHkn

ליו להיות הצאצא הראשון של אלמנט הבסיס <configuration>. (C:\GameOfThrowsUnityRepository\GameOfThrowsU 
nity\GameOfThrowsServer\trythelog\bin\Debug\trythelog.exe.Config line 7) 
    ב- System.Configuration.ConfigurationSchemaErrors.ThrowIfErrors(Boolean ignoreLocal) 
    ב- System.Configuration.BaseConfigurationRecord.ThrowIfParseErrors(ConfigurationSchemaErrors sch 
emaErrors) 
    ב- System.Configuration.BaseConfigurationRecord.ThrowIfInitErrors() 
    ב- System.Configuration.ClientConfigurationSystem.EnsureInit(String configKey) 
    --- סוף רכיב מעקב אחר מחסנית של מצב חריג פנימי --- 
    ב- System.Configuration.ConfigurationManager.PrepareConfigSystem() 
    ב- System.Configuration.ConfigurationManager.get_AppSettings() 
    ב- log4net.Util.SystemInfo.GetAppSetting(String key) ב- c:\log4net\tags\1.2.15RC1\src\Util\Syste 
mInfo.cs:שורה 954 
log4net:ERROR Failed to parse config file. Is the <configSections> specified as: <section name="log4 
net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net, Version=1.2.15.0, Culture=neut 
ral, PublicKeyToken=669e0ddf0bb1aa2a" /> 
System.Configuration.ConfigurationErrorsException: אתחול מערכת התצורה נכשל. ---> System.Configuratio 
n.ConfigurationErrorsException: אלמנט <configSections> אחד בלבד מותר לכל קובץ config ואם הוא קיים, ע 
ליו להיות הצאצא הראשון של אלמנט הבסיס <configuration>. (C:\GameOfThrowsUnityRepository\GameOfThrowsU 
nity\GameOfThrowsServer\trythelog\bin\Debug\trythelog.exe.Config line 7) 
    ב- System.Configuration.ConfigurationSchemaErrors.ThrowIfErrors(Boolean ignoreLocal) 
    ב- System.Configuration.BaseConfigurationRecord.ThrowIfParseErrors(ConfigurationSchemaErrors sch 
emaErrors) 
    ב- System.Configuration.BaseConfigurationRecord.ThrowIfInitErrors() 
    ב- System.Configuration.ClientConfigurationSystem.EnsureInit(String configKey) 
    --- סוף רכיב מעקב אחר מחסנית של מצב חריג פנימי --- 
    ב- System.Configuration.ConfigurationManager.PrepareConfigSystem() 
    ב- System.Configuration.ConfigurationManager.GetSection(String sectionName) 
    ב- log4net.Config.XmlConfigurator.InternalConfigure(ILoggerRepository repository) ב- c:\log4net\ 
tags\1.2.15RC1\src\Config\XmlConfigurator.cs:שורה 173 
Press any key to continue . . . 

对不起对于希伯来文的东西:x

+0

为什么不使用配置文件? – Mate

+0

我该如何使用它?我完全不熟悉配置log4anything。 –

+1

http://stackoverflow.com/questions/7089286/correct-way-of-using-log4net或http://www.codeproject.com/Articles/140911/log-net-Tutorial – Mate

回答

1

尝试:

代码

using log4net; 
... 

static void Main(string[] args) 
     { 
      log4net.Config.XmlConfigurator.Configure(); // Missing!!? 

      ILog log = LogManager.GetLogger("MyLogger"); 
      log.Info("message"); 

App.Config中或Web.Config中

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <configSections> <!-- must be the first child --> 
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" /> 
    </configSections> 

    ... 

    <log4net> 
    <logger name="MyLogger"> 
     <level value="INFO" /> 
     <appender-ref ref="RollingLogFileAppender" /> 
    </logger> 


    <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender"> 
     <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> 
     <file value="logs/" /> <!--YOUR PATH--> 
     <datePattern value="yyyyMMdd'.log'" /> 
     <staticLogFileName value="false" /> 
     <appendToFile value="true" /> 
     <rollingStyle value="Composite" /> 
     <maxSizeRollBackups value="10" /> 
     <maximumFileSize value="5MB" /> 
     <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%date [%thread] %level %logger - %message%newline" /> 
     </layout> 
    </appender> 

    </log4net> 


</configuration> 
+0

你能向我解释你给的配置吗? –

+0

我猜'logger'是根记录器,基本上我需要了解appender的设置。什么是“RollingFileAppender”?它如何设置文件名?等等。这听起来像它和'LogRotate'类似,但我不确定。 –

+0

请检查我以前的评论 - >链接http://www.codeproject.com/Articles/140911/log-net-Tutorial的所有答案。是的,它类似于LogRotate。您可以设置文件名<文件值=“myFile。TXT”>或者设置一个datePattern作为例子 – Mate

0

对我来说,这个问题是由文件属性造成复制到输出目录。它被设置为不要复制(和它的作品为Web应用程序),然而,对于控制台应用程序必须设置为始终复制

(使用F4在Visual Studio键显示属性窗口)