Log4Net在WCF中无法工作

6

你好,我正在尝试在托管于IIS的WCF服务中使用Log4Net,但它没有记录任何数据。有人成功地在WCF服务中使用Log4Net进行日志记录吗?


必须与您设置的配置方式有关...检查事件查看器以查看是否列出了任何错误...还要查看您在哪里指定了lof4net设置。 - Mahesh
6个回答

8

我在自托管的WCF应用程序中成功使用了log4net。

我们设置的步骤非常简单。

  1. Add reference to log4net.dll to our console service host project (our application entry point)
  2. Add the following line to the above project's AssemblyInfo.cs file (allows a custom log4net config file to be specified, which log4net will "watch" for updates. Quick, but maybe a bit dirty..)

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

  3. Add log4net.config file to console project and copy it to the output directory (file properties: "Copy to Output Directory")

  4. Add log4net.dll reference to all projects where you require logging
  5. Declare the logger as private static member of the classes where you need logging:

     private static readonly log4net.ILog Logger = 
     log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
    
  6. Log where required:

    Logger.Info("Starting console service host");

这篇文章基本上涵盖了所有内容:http://haacked.com/archive/2005/03/07/ConfiguringLog4NetForWebApplications.aspx

据我所知,当在IIS中托管时,这将无法工作。Log4net将找不到配置文件... - Stefan Egli
@Stefan - 在IIS中对我有用。但是在VS中,log4net.config必须设置为“复制到输出目录”。换句话说,在IIS中部署位置的“bin”文件夹中必须有log4net.config。 - codeulike
@codeulike - 这绝对是正确的方法。我更新了我的回答。请注意,我提到您需要将配置文件复制到输出目录。 - Stefan Egli
如果您在https://dev59.com/q0bRa4cB1Zd3GeqP1pNg#552726上发布此内容,我会为其点赞(我正在将此问题标记为重复)。 - Ruben Bartelink

1
另一件需要注意的事情是,当您在自定义WCF ServiceHostFactory中定义一个单独的程序集来保持DRY时(例如),则定义工厂的程序集是从log4net和XmlConfigurator属性的角度来看的“根”程序集。
此常见问题解答http://logging.apache.org/log4net/release/faq.html#trouble-webapp-stops-logging及其相关评论解释了log4net希望尽早初始化的原因。

0

用户权限已确认。

授予写入和修改权限。

Assamble.cs
在末尾添加:

[assembly: log4net.Config.XmlConfigurator(Watch = true)] 

0
使用程序集属性来配置log4net将不起作用,因为log4net不会检查配置文件的正确目录。也许您可以尝试在指定配置文件时使用一些相对路径,但更容易使用其中一个建议的解决方案here

0
我遇到了与此相同的问题,原因是我在使用自定义配置文件时使用了相对路径。我使用了以下代码行:
log4net.Config.XmlConfigurator.ConfigureAndWatch(new FileInfo("log4net.config"));

通过log4nets的调试输出,它告诉我它在寻找log4net.config文件时是在根IIS目录中查找,而不是在我的应用程序路径中的任何位置。

因此,更改该行以避免此问题(如果您也以这种方式配置自定义配置):

log4net.Config.XmlConfigurator.ConfigureAndWatch(new FileInfo(@"G:\MyProject\log4net.config"));

0

我正在使用log4net在托管在IIS 7中的MSMQ激活的WCF服务中。我使用Ninject进行依赖注入,并安装了Ninject.Extensions.WcfNinject.Extensions.Logging.log4net NuGet包,并将log4net配置部分添加到Web.config文件中。

我看到有人建议将log4net初始化代码添加到Global.asax中,但据我所知,这对于MSMQ激活的服务不起作用。然而,Ninject安装了WebActivator包,允许您在Web应用程序启动时运行初始化代码。Ninject将自己的代码放入App_Start\NinjectWebCommon.cs中。要配置log4net,您需要将代码添加到Start方法中。我的代码如下:

public static void Start() 
{
    DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule));
    DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule));

    // configure log4net
    XmlConfigurator.Configure();

    bootstrapper.Initialize(CreateKernel);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接