WCF中的Log4Net无法正常工作

时间:2011-01-05 08:37:01

标签: wcf log4net

您好我正在尝试在WCF IIS托管服务中使用Log4Net,但它不会记录任何数据。 有没有人使用Log4Net实现了WCF服务的登录?

5 个答案:

答案 0 :(得分:8)

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

我们的设置步骤相当简单。

  1. 将对log4net.dll的引用添加到我们的控制台服务主机项目(我们的应用程序入口点)
  2. 将以下行添加到上面项目的AssemblyInfo.cs文件中(允许指定自定义log4net配置文件,log4net将“监视”更新。快速,但可能有点脏......)

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

  3. 将log4net.config文件添加到控制台项目并将其复制到输出目录(文件属性:“复制到输出目录”)

  4. 将log4net.dll引用添加到需要记录的所有项目
  5. 将记录器声明为需要记录的类的私有静态成员:

     private static readonly log4net.ILog Logger = 
     log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
    
  6. 根据需要记录:

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

  7. 本文几乎涵盖了它:http://haacked.com/archive/2005/03/07/ConfiguringLog4NetForWebApplications.aspx

答案 1 :(得分:1)

另外要注意的是,当您在Wcf端点的单独程序集中定义了自定义WCF ServiceHostFactory时(例如保持DRY),那么定义工厂的程序集就是“根”从log4net的角度来看,需要在该程序集中声明XmlConfigurator属性。

此常见问题http://logging.apache.org/log4net/release/faq.html#trouble-webapp-stops-logging及相关评论说明log4net希望尽快初始化

答案 2 :(得分:0)

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

答案 3 :(得分:0)

我在IIS 7中托管的MSMQ激活的WCF服务中使用log4net。我使用Ninject进行依赖注入并安装 Ninject.Extensions.Wcf Ninject.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);
}

答案 4 :(得分:0)

我遇到了同样的问题,这是因为我在使用自定义配置文件的相对路径。我使用了以下代码行:

log4net.Config.XmlConfigurator.ConfigureAndWatch(new FileInfo("log4net.config"));

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

因此,将行更改为更直接的名称以避免此问题(如果您还以这种方式配置自定义配置):

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