将日志写入文件。

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>

请提供一个实际可用的配置文件示例,请求帮助。


2
你正在配置Xml设置吗?请参考http://logging.apache.org/log4net/release/sdk/log4net.Config.XmlConfigurator.Configure_overload_5.html。 - Lloyd
5个回答

84

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

  1. 向解决方案添加新的 C# 控制台应用程序。

  2. 选择工具 >> 库程序包管理器 >> 管理解决方案的 NuGet 程序包并搜索log4net。 安装它,并选择要添加 log4net 引用的项目。 enter image description here

  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,右键选择属性,然后选择复制到输出目录-仅在更改时复制
<?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
  • 如果您以后想要将 log4net 添加到另一个项目中,请选择 工具 >> 库程序包管理器 >> 管理解决方案的NuGet程序包,选择 log4net 并单击 管理,然后选中要添加 log4net 的项目。 enter image description here


  • 关于configSections的注意事项:“如果此元素在配置文件中,则必须是<configuration>元素的第一个子元素。” https://msdn.microsoft.com/zh-cn/library/aa903350(v=vs.71).aspx - unicorn2
    你能详细说明一下 App.config 设置所起的作用吗? - jxramos
    @jxramos app.config 中的设置控制着与日志记录相关的所有内容,包括是否将其写入文件、每行的格式是什么、是否将其写入控制台等。查看 log4net 文档可能更容易了解所有选项。 - Contango

    47

    你似乎没有一个引用你的appender的<root>元素:

    <?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
    谢谢,这是一个重要的观点。我还发现您可以使用< level value =“ALL”/>将所有日志重定向到文件中。 - Yury Pogrebnyak

    21

    你在应用程序第一次启动时调用了configure方法吗?

    log4net.Config.XmlConfigurator.Configure();
    

    如果是的话,你应该没问题。检查你正在写入的磁盘文件权限。如果需要,你可以启用log4net内部调试来找出问题所在。

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


    您还可以启用log4net的内部调试,详见:http://logging.apache.org/log4net/release/faq.html#troubleshooting - paul
    对于一个.NET Web应用程序,这行代码只需要被调用一次吗?即在Global.asax文件的Application_Start()中?还是在每个用户会话开始时,即Session_Start()中? - Seany84
    @paul:我已经将这个添加到我的答案中了。谢谢Paul。 - Shyju
    1
    @Seany84:不是每个会话都需要。 只在应用程序启动时执行一次。这就是为什么我们将其放在global.asax中的Application_start事件中,它只会在应用程序生命周期内触发一次。 - Shyju
    @Shyju 谢谢你为我澄清这个问题。最近我在商业应用程序中引入了log4net,我将不得不将这个Configure()移动到Application_Start()中。感谢你的建议。 - Seany84

    6

    你可以做两件事:

    首先,如果你想使用单独的配置文件,请在 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);
    

    3

    太好了。答案是正确的……但对我来说却不起作用。

    在网上搜索后,最终发现我在Assembly.cs文件中漏掉了以下一行:

    [assembly: log4net.Config.XmlConfigurator]
    

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接