94

我们正在使用 log4net 并希望在外部配置文件中指定它的配置(就像我们对其他部分所做的那样)。为此,我们将 App.config 中的 log4net 部分更改为:

...
<section name="log4net" 
     type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
...
<log4net configSource="Log.config" />
...

在 Log.Config 文件(与 App.config 相同的目录)中,我们有:

<log4net>
  <appender name="General" type="log4net.Appender.FileAppender">
    <file value="myapp.log" />
    <layout type="log4net.Layout.SimpleLayout" />
  </appender>
  <root>
    <appender-ref ref="General" />
  </root>
</log4net>

但是,当我们运行应用程序时,不会创建任何日志文件(也没有完成日志记录)。没有错误消息输出到控制台。

如果我们将 Log.config 文件的内容移回 App.config(替换上面的第一行代码),它会按预期工作。知道为什么它不能在外部文件中工作吗?

4

13 回答 13

120

您的AssemblyInfo.cs文件中是否具有以下属性:

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "Log4Net.config", Watch = true)]

并在每个需要日志记录功能的类的开头编写这样的代码:

private static readonly ILog log = 
LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

我在这里有一篇包含此信息和其他信息的博文。

于 2009-01-15T08:11:00.203 回答
42

在这个问题上有一个公开的缺陷。Log4Net 不支持配置元素的 configSource 属性。要使用纯粹的配置文件解决方案,您可以在 appSettings 中使用 log4net.Config 键。

第 1 步:包括正常的配置部分定义:

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

第 2 步:在 appSettings 中使用神奇的 log4net.Config 键。

<appSettings>
      <add key="log4net.Config" value="log4net.simple.config" />
</appSettings>

第 3 步:贡献一个补丁来修复 configSource 的处理。

于 2009-09-25T20:10:16.033 回答
28

错过的步骤是

log4net.Config.XmlConfigurator.Configure(); 

这将导致使用 configSource。确保在调用 GetLogger() 之前调用它一次;

于 2011-04-11T21:09:40.840 回答
22

确保您的 log4net.config 文件设置有以下属性:

构建操作:内容

复制到输出目录:始终复制

于 2010-07-28T12:38:56.347 回答
11

无论是使用,

<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
</configSections>
<appSettings>
<add key="log4net.Config" value="Log4Net.config" />
</appSettings>

要不就,

log4net.Config.XmlConfigurator.ConfigureAndWatch(new System.IO.FileInfo("Log4Net.config"));

在这两种情况下,文件 Log4Net.config 都应该在输出目录中。您可以通过在解决方案资源管理器中设置 Log4Net.config 文件属性来执行此操作。构建操作 - 内容并复制到输出目录 - 始终复制

于 2014-02-25T13:46:18.370 回答
2

注意这个问题...

就我而言,一切都已正确配置。问题是我在 Visual Studio 2013 中使用 Web Deploy 将站点上传到WinHost.com并重置了服务器上的ACL。这反过来又撤销了对文件夹和文件的所有权限 - log4net 无法写入文件。

你可以在这里读更多关于它的内容:

如何阻止 Web Deploy/MSBuild 弄乱服务器权限

我要求那里的支持团队重置 ACL,然后 log4net 开始吐出日志。:)

于 2014-07-07T18:26:44.963 回答
2

也可以为log4net. 将其插入 App.config 文件:

 <appSettings>
      <add key="log4net.Internal.Debug" value="true"/>
 </appSettings>
 <system.diagnostics>
      <trace autoflush="true">
      <listeners>
           <add
             name="textWriterTraceListener"
             type="System.Diagnostics.TextWriterTraceListener"
             initializeData="link\to\your\file.log" />
      </listeners>
      </trace>
 </system.diagnostics>

并且您至少会收到错误消息,从中可以得出究竟出了什么问题。就我而言,我只是忘记设置Copy to output directoryCopy Always.

于 2017-08-31T08:22:02.933 回答
1

假设你有一个名为 log4net.config 的外部配置文件被复制到你的部署目录,你可以像这样配置它:

using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Reflection;

using log4net;

namespace MyAppNamespace {
    static class Program {
        //declare it as static and public so all classes in the project can access it
        //like so: Program.log.Error("got an error");
        public static readonly log4net.ILog log = log4net.LogManager.GetLogger(typeof(Program));

        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main() {
             //configure it to use external file
            log4net.Config.XmlConfigurator.Configure(new Uri(Application.StartupPath + "\\log4net.config"));
            //use it
            log.Debug("#############   STARING APPLICATION    #################");


            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new FormMain());
        }
    }
}
于 2013-04-16T00:29:57.330 回答
1

我有同样的问题,除了有

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net")]

在正在运行的项目中,我在参考项目中也有以下行:

[assembly: log4net.Config.XmlConfigurator]

当我在引用的项目中删除此行时,日志开始出现。

于 2014-09-21T14:03:03.367 回答
1
  1. 将以下内容添加到AssemblyInfo.cs

    [程序集:log4net.Config.XmlConfigurator(ConfigFile = "Log4Net.config")]

  2. 确保 log4net.config 包含在项目中

  3. log4net.config的属性中

CopyToOutputDirctory标签更改为CopyIfNewer标签

  1. 仔细检查日志级别级别value="ALL"
于 2018-10-10T13:16:39.057 回答
0

@Mitch,原来有一个带有 [assembly:...] 声明的文件,但它没有 ConfigFile 属性。

一旦我添加它并将其指向 Log.config,它就开始工作了。我原以为它会像所有其他配置部分(即 AppSettings)一样工作,并且无需修改即可接受外部配置文件。

我们没有您提到的第二条语句,因为我们将其包装在全局静态日志提供程序中。

于 2009-01-15T08:21:07.313 回答
0

就我而言,我收到此错误消息:

log4net: config file [C:\........\bin\Debug\log4net.config] not found.

log4net.config该文件位于 Visual Studio 2017 项目中,但是当我检查文件夹中的文件时,我bin\Debug找不到它。

我原来的装配设置是这样的:

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]

经过一段时间的研究,我将其更改为以下内容并且可以正常工作:

[assembly: log4net.Config.XmlConfigurator(ConfigFile = @"..\..\log4net.config", Watch = true)]
于 2018-02-16T22:42:07.223 回答
0

还值得指出的是,在 Web 应用程序中,它查看的是根目录,而不是 bin 文件夹,因此请确保这是放置配置文件的位置。

于 2019-11-27T07:05:22.680 回答