如何为ac#Windows服务配置log4net

13 log4net windows-services

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

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

<add key="log4net.Config" value="log4net.config"/>
Run Code Online (Sandbox Code Playgroud)

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

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

有任何想法吗?

Parag

Gra*_*ton 21

也许这很有用(使用ASP.NET 2.0网站将您的Log4Net配置移出web.config.).

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

告诉应用程序使用此配置文件配置log4net.这有两个地方.首先是global.asax,第二个是assemblyInfo.cs文件.请注意,大多数情况下,您将使用包含所有内联代码的global.asax文件开始.无论出于何种原因,我可以使用它的唯一方法是将global.asax分解为使用代码隐藏然后使用assemblyInfo.cs文件.所以最终看起来像这样.

global.asax:<%@ Application Language ="C#"Inherits ="GlobalAsax"%> 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

现在您的应用程序调用了log4net的配置,您可以在程序集信息中设置一个属性,以便log4net知道在哪里查找配置文件. AssemblyInfo.cs(在你的App_Code 文件夹中):

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

监视标志告诉log4net密切关注配置文件以查找可能的更改.如果您希望仅在测试过程中将配置更改为仅将错误记录为错误,这将非常有用.

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

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

  • 我的朋友,如果可以,我会给你1000分.这是周五晚上,我想回家,如果作为控制台应用程序运行,我的愚蠢服务就是记录,但是从"服务"面板启动时却没有.而且缺少了[assembly]属性.谢谢. (3认同)
  • 我以前只使用控制台应用程序的汇编属性,但看起来Windows服务需要`log4net.Config.XmlConfigurator.Configure();`line和assembly属性. (2认同)

zvo*_*kov 13

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

另一方面,XmlConfiguratorAttribute使用应用程序的BaseDirectory,这就是它始终有效的原因.

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

System.IO.Directory.SetCurrentDirectory (AppDomain.CurrentDomain.BaseDirectory);
Run Code Online (Sandbox Code Playgroud)