Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 让log4net工作起来_C#_Log4net_Log4net Configuration_Log4net Appender - Fatal编程技术网

C# 让log4net工作起来

C# 让log4net工作起来,c#,log4net,log4net-configuration,log4net-appender,C#,Log4net,Log4net Configuration,Log4net Appender,我已经为使用Logger编写了一个包装器类,而且因为我以前从未使用过log4net(我在工作中使用log4c++,但它已经配置好了,我从来都不需要处理它), 我不知道如何正确配置它并让它工作 这是包装类的当前源代码: using System.Text; using log4net; using log4net.Appender; using log4net.Config; using log4net.Layout; namespace GotLoggingService { publ

我已经为使用Logger编写了一个包装器类,而且因为我以前从未使用过log4net(我在工作中使用log4c++,但它已经配置好了,我从来都不需要处理它),
我不知道如何正确配置它并让它工作

这是包装类的当前源代码:

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");
        }
    }
}
这基本上就是我要说的。。。谢谢你的阅读,如果你能指出我把事情搞砸了,我会很高兴的

我现在使用App.Config而不是BasicConfigurator

这是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>

。(C:\GameOfThrowsUnityRepository\GameOfThrowsU
nity\GameOfThrowsServer\trythelog\bin\Debug\trythelog.exe.Config第7行)
ב-System.Configuration.ConfigurationSchemaErrors.throwiferors(布尔ignoreLocal)
ב-System.Configuration.BaseConfigurationRecord.ThrowIfParseErrors(配置模式错误
(错误)
ב-System.Configuration.BaseConfigurationRecord.ThrowIfInitErrors()
ב-System.Configuration.ClientConfigurationSystem.EnsureInit(字符串configKey)
--- סוף רכיב מעקב אחר מחסנית של מצב חריג פנימי ---
ב-System.Configuration.ConfigurationManager.PrepareConfigSystem()
ב-System.Configuration.ConfigurationManager.get_AppSettings()
ב-log4net.Util.SystemInfo.GetAppSetting(字符串键)ב-c:\log4net\tags\1.2.15RC1\src\Util\Syste
mInfo.cs:שורה954
log4net:解析配置文件失败。是指:
系统配置配置错误异常:系统配置错误系统配置
n、 配置错误异常:配置错误异常
ליו להיות הצאצא הראשון של אלמנט הבסיס . (C:\GameOfThrowsUnityRepository\GameOfThrowsU
nity\GameOfThrowsServer\trythelog\bin\Debug\trythelog.exe.Config第7行)
ב-System.Configuration.ConfigurationSchemaErrors.throwiferors(布尔ignoreLocal)
ב-System.Configuration.BaseConfigurationRecord.ThrowIfParseErrors(配置模式错误
(错误)
ב-System.Configuration.BaseConfigurationRecord.ThrowIfInitErrors()
ב-System.Configuration.ClientConfigurationSystem.EnsureInit(字符串configKey)
--- סוף רכיב מעקב אחר מחסנית של מצב חריג פנימי ---
ב-System.Configuration.ConfigurationManager.PrepareConfigSystem()
ב-System.Configuration.ConfigurationManager.GetSection(字符串sectionName)
ב-log4net.Config.XmlConfigurator.InternalConfigure(iLogger存储库)ב-c:\log4net\
tags\1.2.15RC1\src\Config\XmlConfigurator.cs:שורה173
按任意键继续。
为希伯来语的东西感到抱歉:x

试试:

代码

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>

...

在我的例子中,问题是由文件属性复制到输出目录引起的。它被设置为不复制(它适用于Web应用程序),但是,对于控制台应用程序,它必须设置为始终复制


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

为什么不使用配置文件?如何使用它?我完全不熟悉配置log4any。或者使用codeproject链接^它完整详细地解释了一切,并且是关于如何正确实现log4net的完整教程。谢谢@Mate!没有双关语的意思你能解释一下你给我的配置吗?我想
记录器是根记录器,基本上我需要了解appender设置。什么是滚动文件追加器?它如何设置文件名?等等在我看来,它的功能类似于
LogRotate
,但我不确定。请检查我之前评论->链接上的所有答案。是的,它与对数旋转相似。您可以设置文件名或设置datePattern,如中所示example@Mate如果配置是在OP正在执行的代码中提供的,则不需要XmlConfigurator。@GioraGuttsait。无效的配置文件。。。我想是吧。编辑您的问题并添加App.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>