我有一个Windows服务,其中app.config文件和log4net.config文件是分开的。日志记录无效。
在我的app.config文件中,我在以下部分中有以下内容:
<add key="log4net.Config" value="log4net.config"/>
如果在值中指定了log4net.config文件的绝对路径,则此方法有效。
我是否需要提供log4net.cong的绝对路径? log4net.config和app.config文件都与可执行文件位于同一文件夹中。
任何想法?
Parag
答案 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);