外部文件中的log4Netconfiguration不起作用
我们正在使用log4net,并且想要在外部configuration文件中指定它的configuration(正如我们已经对其他部分所做的那样)。 为此,我们将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="log.txt" /> <layout type="log4net.Layout.SimplyLayout" /> </appender> <root> <appender-ref ref="General" /> </root> </log4net>
但是,当我们运行应用程序,没有创build日志文件(并没有logging完成)。 没有错误消息输出到控制台。
如果我们将Log.config文件的内容移回App.config(replace上面的第一个代码行),它将按预期工作。 任何想法,为什么它不在外部文件中工作?
你的AssemblyInfo.cs
文件中有以下属性:
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "Log4Net.config", Watch = true)]
并在每个需要日志loggingfunction的课程开始时这样的代码:
private static readonly ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
我有一个博客文章,其中包含这个和其他信息。
这个问题有一个公开的缺陷 。 Log4Net不支持configuration元素的configSource属性。 要使用纯粹的configuration文件解决scheme,请在appSettings中使用log4net.Config键。
步骤1:包含正常的configuration部分定义:
<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的处理。
已经错过的步骤是
log4net.Config.XmlConfigurator.Configure();
这将导致使用configSource。 确保在调用GetLogger()之前调用它一次;
确保您的log4net.config文件设置了以下属性:
构build行动:内容
复制到输出目录:复制总是
无论是使用,
<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都应该在输出目录中。 您可以通过在解决scheme资源pipe理器中设置Log4Net.config文件属性来执行此操作。 构build操作 – 内容并复制到输出目录 – 始终复制
假设你有一个名为log4net.config的外部configuration文件被复制到你的deploy目录,你可以这样configuration它:
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()); } } }
小心这个问题…
在我的情况下,一切正确configuration。 问题是我使用Visual Studio 2013中的Web Deploy将站点上载到WinHost.com ,并重置了服务器上的ACL 。 这又取消了文件夹和文件的所有权限–log4net无法写入文件。
你可以在这里读更多关于它的内容:
如何停止Web Deploy / MSBuild搞乱服务器权限
我问那里的支持团队重置ACL,然后log4net开始分发日志。 🙂
@Mitch,事实certificate有一个文件与[assembly:…]声明,但它没有ConfigFile属性。
一旦我添加它并将其指向Log.config,它开始工作。 我会认为它会像所有其他configuration部分(即AppSettings),并接受外部configuration文件没有修改。
我们没有提到第二种说法,因为我们将它包装在全局静态日志提供程序中。
我有同样的问题,除了有
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net")]
在正在运行的项目中,我也在参考项目中有以下行:
[assembly: log4net.Config.XmlConfigurator]
当我在被引用的项目中删除这一行时,日志开始出现。
也可以打开log4net
的debugging模式。 将其插入到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>
而且你至less会得到错误信息,从中你可以得出究竟是哪里出了问题。 在我的情况下,我忘了将Copy to output directory
设置为Copy Always
。