【问题标题】:Writing logs to file将日志写入文件
【发布时间】:2012-04-06 00:15:41
【问题描述】:

我在将日志从 log4net 写入文件时遇到了一些麻烦。我似乎按照手册中的描述做了所有事情,但这不起作用。这是我的 logging.config 文件:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
  </configSections>
  <log4net>
    <appender name="FileAppender" type="log4net.Appender.FileAppender">
      <file value="log.txt" />
      <appendToFile value="true" />
      <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %message%newline" />
      </layout>
    </appender>
  </log4net>
</configuration>

请提供一个实际有效的配置文件示例。

【问题讨论】:

标签: c# .net logging log4net log4net-configuration


【解决方案1】:

这是在 Visual Studio 2012 和 .NET 4.5 下将 Log4Net 添加到项目的完整分步指南。

  1. 将新的 C# 控制台应用添加到您的解决方案中。

  2. 选择Tools &gt;&gt; Library Package Manager &gt;&gt; Manage NuGet Packages For Solution 并搜索log4net。安装它,然后选择要添加 log4net 引用的项目。

  3. 编辑Program.cs:

using System;
namespace Log4Net
{    
    class Program
    {
        private static readonly log4net.ILog log = log4net.LogManager.GetLogger
                (System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
        static void Main(string[] args)
        {
            Console.WriteLine("Writing to \"log.txt\" in the same directory as the .exe file.\n");
            log.Info("Info logging");
            try
            {
                throw new Exception("Exception!");
            }
            catch (Exception e)
            {
                log.Error("This is my error", e);
            }
            Console.WriteLine("[any key to exit]");
            Console.ReadKey();
            }
        }
    }
}
  1. 添加log4.config,右键选择Properties,然后选择Copy to Output Directory - Copy If Newer
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
  </configSections>

  <log4net>
    <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
      <file value="log.txt" />
      <appendToFile value="true" />
      <rollingStyle value="Size" />
      <maxSizeRollBackups value="10" />
      <maximumFileSize value="250KB" />
      <staticLogFileName value="true" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
      </layout>
    </appender>
    <root>
      <level value="ALL" />
      <appender-ref ref="RollingFileAppender" />
    </root>
  </log4net>
</configuration>
  1. 编辑App.Config,使其与以下内容匹配:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
    <appSettings>
        <add key="log4net.Config" value="log4.config"/>
        <add key="log4net.Config.Watch" value="True"/>
        <add key="log4net.Internal.Debug" value="False"/>
    </appSettings>
</configuration>
  1. 运行程序并观察在输出\bin\Debug\目录中创建的文件log.txt

    2013-08-10 11:54:26,798 [10] INFO  Log4Net.Program [(null)] - Info logging
    2013-08-10 11:54:26,824 [10] ERROR Log4Net.Program [(null)] - This is my error
    System.Exception: Exception!
       at Log4Net.Program.Main(String[] args) in C:\Test\Log4Net\Program.cs:line 14
    
  2. 1234563

【讨论】:

  • 只是在 configSections 上的注释:“如果这个元素在配置文件中,它必须是 元素的第一个子元素。” msdn.microsoft.com/en-us/library/aa903350(v=vs.71).aspx
  • 您能否详细说明一下 App.config 设置播放的滚动?
  • @jxramos app.config 中的设置控制与日志记录有关的所有内容,包括是否写入文件、每行的格式、是否写入控制台等。可能更容易查看在 log4net 文档中查看所有选项。
【解决方案2】:

太棒了。答案是正确的...除了它们对我不起作用

网上搜了一圈,终于发现我在Assembly.cs中漏掉了下面这行:

[assembly: log4net.Config.XmlConfigurator]

【讨论】:

    【解决方案3】:

    您似乎没有引用您的附加程序的 &lt;root&gt; 元素:

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <configSections>
        <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
      </configSections>
    
        <log4net>
          <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
            <file value="log.txt" />
            <appendToFile value="true" />
            <rollingStyle value="Size" />
            <maxSizeRollBackups value="10" />
            <maximumFileSize value="250KB" />
            <staticLogFileName value="true" />
            <layout type="log4net.Layout.PatternLayout">
              <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
            </layout>
          </appender>
          <root>
            <level value="INFO" />
            <appender-ref ref="RollingFileAppender" />
          </root>
        </log4net>
    </configuration>
    

    【讨论】:

    • 谢谢,这很重要。另外我发现你可以把 将所有日志重定向到文件。
    【解决方案4】:

    应用第一次启动时是否调用了configure方法?

    log4net.Config.XmlConfigurator.Configure();
    

    如果是。你应该很好。检查您正在写入的磁盘上的文件权限。

    如果你愿意,你也可以启用 log4net 内部调试来找出问题所在。

    http://logging.apache.org/log4net/release/faq.html#troubleshooting

    【讨论】:

    • 您也可以启用 log4net 内部调试,详情如下:logging.apache.org/log4net/release/faq.html#troubleshooting
    • 对于一个 .NET web 应用程序,这一行是否只需要调用一次?即在 Global.asax 文件的 Application_Start() 中?或者在每个用户会话开始时,即 Session_Start() ?
    • @paul :将其添加到我的答案中。谢谢保罗
    • @Seany84 :不是针对每个会话。应用程序启动时只有一次。就是这样,我们将它放在 global.asax 中的 Application_start 事件中,该事件将在应用程序生命周期内仅触发一次。
    • @Shyju 感谢您为我解决这个问题。我最近将 log4net 引入了一个商业应用程序,我将不得不将此 Configure() 移动到 Application_Start()。感谢您的建议。
    【解决方案5】:

    你可以做两件事:

    一,如果您想使用单独的配置文件,通过将以下内容添加到您的 app.config 文件中,它将自动配置日志记录。

    <?xml version="1.0"?>
    <configuration>
        <appSettings>
            <add key="log4net.Config" value="log4.config"/>
            <add key="log4net.Config.Watch" value="True"/>
            <add key="log4net.Internal.Debug" value="False"/>
        </appSettings>
    </configuration>
    

    否则,您需要在应用程序的开头启动日志记录。

    //Initiate logging based on web.config file
    log4net.Config.XmlConfigurator.Configure();
    
    // Create a logger for use in this class
    log4net.ILog log4 = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
    

    【讨论】:

      猜你喜欢
      • 2023-03-31
      • 2012-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-27
      • 1970-01-01
      • 2016-10-13
      相关资源
      最近更新 更多