我们正在使用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(替换上面的第一个代码行),它将按预期工作。知道为什么它不在外部文件中工作吗?
答案 0 :(得分:110)
您的AssemblyInfo.cs
文件中是否包含以下属性:
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "Log4Net.config", Watch = true)]
在每个需要日志记录功能的类的开头都有这样的代码:
private static readonly ILog log =
LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
我有一篇博客文章,其中包含此信息和其他信息here。
答案 1 :(得分:36)
此问题有open defect。 Log4Net不支持配置元素的configSource属性。要使用纯配置文件解决方案,请使用appSettings中的log4net.Config键。
步骤1:包括正常配置部分定义:
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
</configSections>
步骤2:在appSettings中使用magic log4net.Config键。
<appSettings>
<add key="log4net.Config" value="log4net.simple.config" />
</appSettings>
步骤3:提供修补程序以修复configSource的处理。
答案 2 :(得分:24)
错过的步骤是
log4net.Config.XmlConfigurator.Configure();
这将导致使用configSource。 在调用GetLogger();
之前,请确保调用一次答案 3 :(得分:19)
确保使用以下属性设置log4net.config文件:
构建操作:内容
复制到输出目录:始终复制
答案 4 :(得分:9)
使用,
<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文件属性来执行此操作。 构建操作 - 内容和复制到输出目录 - 始终复制
答案 5 :(得分:2)
注意这个问题...
在我的情况下,一切都配置正确。问题是我在Visual Studio 2013中使用Web Deploy将站点上传到WinHost.com并重置服务器上的ACLs。这反过来又撤销了对文件夹和文件的所有权限 - log4net无法写入文件。
您可以在此处详细了解:
How to stop Web Deploy/MSBuild from messing up server permissions
我要求那里的支持团队重置ACL,然后log4net开始吐出日志。 :)
答案 6 :(得分: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());
}
}
}
答案 7 :(得分:1)
我有同样的问题,除了
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net")]
在正在运行的项目中,我在参考项目中也有以下行:
[assembly: log4net.Config.XmlConfigurator]
当我在引用的项目中删除此行时,日志开始出现。
答案 8 :(得分:1)
也可以打开doInBackground &
doInBackground &
doInBackground &
doInBackground &
wait
的调试模式。将其插入App.config文件:
log4net
并且您至少会收到错误消息,您可以从中获取确实出错的内容。在我的情况下,我只是忘了将 <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 directory
。
答案 9 :(得分:0)
@Mitch,事实证明有一个带有[assembly:...]声明的文件,但它没有ConfigFile属性。
一旦我添加它并将其指向Log.config,它就开始工作了。我会认为它会像所有其他配置部分(即AppSettings)一样工作,并接受外部配置文件而无需修改。
我们没有您提到的第二个声明,因为我们将它包装在全局静态日志提供程序中。
答案 10 :(得分: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)]
答案 11 :(得分:0)
[程序集:log4net.Config.XmlConfigurator(ConfigFile =“ Log4Net.config”)]
将复制到输出目录更改为如果更新则复制
答案 12 :(得分:0)
还值得指出的是,在Web应用程序中,它查找的是根目录,而不是bin文件夹,因此请确保将其放在配置文件中。