【问题标题】:Log4Net in WCF not workingWCF 中的 Log4Net 不起作用
【发布时间】:2011-01-05 08:37:00
【问题描述】:

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

【问题讨论】:

  • 必须与您设置配置的方式有关..检查 eventvwr 以查看是否列出了任何错误..还有您在哪里指定了 lof4net 设置。

标签: wcf log4net


【解决方案1】:

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

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

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

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

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

  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");

这篇文章几乎涵盖了它:http://haacked.com/archive/2005/03/07/ConfiguringLog4NetForWebApplications.aspx

【讨论】:

  • Afaik 这在 IIS 中托管时将不起作用。 Log4net 将找不到配置文件...
  • @Stefan - 在 IIS 中为我​​工作。但是 log4net.config 必须在 VS 中设置“复制到输出目录”。换句话说,log4net.config 必须在 IIS 中部署位置的“bin”文件夹中
  • @codeulike - 这当然是这样做的方法。我更新了我的答案。请注意,我确实提到您需要将配置文件复制到输出目录。
  • 如果您在stackoverflow.com/questions/552718/… 上发布此内容,我会为 oen 投票(我正在将此 Q 标记为重复)
【解决方案2】:

要注意的另一件事是,当您在 Wcf 端点的单独程序集中定义自定义 WCF ServiceHostFactory(例如,保持 DRY)时,定义工厂的程序集是来自的“根”程序集log4net 的观点和XmlConfigurator 属性需要在该程序集中声明。

这个常见问题解答http://logging.apache.org/log4net/release/faq.html#trouble-webapp-stops-logging 和链接的 cmets 说明 log4net 想要尽快初始化

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      我在 IIS 7 中托管的 MSMQ 激活 WCF 服务中使用 log4net。我使用 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);
      }
      

      【讨论】:

        【解决方案5】:

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

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

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

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

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

        【讨论】:

          【解决方案6】:

          Iısusr 许可 好的。

          授予写入和修改权限。

          Assamble.cs
          在末尾添加:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-07-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-07-20
            • 1970-01-01
            • 2018-10-01
            相关资源
            最近更新 更多