如何为c#Windows服务配置log4net

时间:2009-10-22 08:30:54

标签: windows-services log4net

我有一个Windows服务,其中app.config文件和log4net.config文件是分开的。日志记录无效。

在我的app.config文件中,我在以下部分中有以下内容:

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

如果在值中指定了log4net.config文件的绝对路径,则此方法有效。

我是否需要提供log4net.cong的绝对路径? log4net.config和app.config文件都与可执行文件位于同一文件夹中。

任何想法?

Parag

2 个答案:

答案 0 :(得分:21)

也许这很有用(Moving your Log4Net configuration out of web.config with ASP.NET 2.0 web sites。)。

以下是您可能感兴趣的部分:

  

告诉应用程序进行配置   log4net使用此配置文件。那里   这真的是两个地方。第一,   global.asax和第二个   assemblyInfo.cs文件。请注意,大多数   当你开始的时候   global.asax文件包含所有代码   排队。无论出于何种原因,唯一的   我可以得到这个工作的方式   打破global.asax使用a   代码隐藏然后屁股   assemblyInfo.cs文件。所以它最终结束了   看起来像这样。

     

global.asax中:   &lt;%@ Application Language =“C#”Inherits =“GlobalAsax”%&gt;   global.asax.cs(在你的App_Code文件夹中):

using System;
using System.Web;

public class GlobalAsax : HttpApplication
{
    // you may have lots of other code here
    void Application_Start(object sender, EventArgs e)
    {
        log4net.Config.XmlConfigurator.Configure();
    }
}
  

现在你有了申请   你调用log4net的配置   可以在程序集中设置属性   信息,以便log4net知道在哪里   寻找配置文件。   AssemblyInfo.cs(在App_Code中   文件夹):

     

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

     

watch标志告诉log4net保持一个   关注配置文件   潜在的变化。这有用   您想要更改配置   从记录everthing到仅错误   在测试过程中。

要确保log4net.config始终存在,请将log4net.config添加到csproject,并将其设置为CopyAlways。它应该出现在debug文件夹中。

您可以使用脚本将所有内容复制到发布文件夹,或者如果您使用的是MS安装项目,请手动将该文件添加到项目中。然后将添加引用。

答案 1 :(得分:13)

对于Windows服务,当前目录是Windows \ system32 - 并且XmlConfigurator.Configure()使用FileInfo来处理相对于当前目录的相对路径。所以log4net正在Windows \ system32中寻找它的配置文件。

另一方面,

XmlConfiguratorAttribute使用应用程序的BaseDirectory,这就是它始终有效的原因。

或者,您可以在调用XmlConfigurator.Configure()之前执行以下操作:

System.IO.Directory.SetCurrentDirectory (AppDomain.CurrentDomain.BaseDirectory);