【问题标题】:How to setup log4net so that it works on a wcf service?如何设置 log4net 以便它在 wcf 服务上工作?
【发布时间】:2014-11-06 22:06:18
【问题描述】:

我正在使用 Visual Studio 2008、.net 框架 3.5、Windows 7 上的解决方案。我创建了一个 log4net 库,它写入一个 txt 文件,并希望在我的解决方案的多个项目中使用它与从 Visual Studio 本地运行的同一解决方案中的 wcf 服务。

我从解决方案上的控制台应用程序启动程序。控制台应用程序调用其他项目,这些项目使用 log4net。在工作流的这个级别,日志写得很好。调用 wcf 服务时会出现问题。 wcf 服务使用日志,但 log4net 不写入文件。

在控制台项目中我有这个:

在 AssemblyInfo.cs 上:

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

在 App.config 我有 log4net 配置。

在 Program.cs 上,我拥有的 Main 方法:

LogManager.GetLogger("Initialise log4net from the current assembly attributes");

在 WCF 服务上我有这个:

AssemblyInfo.cs 上与控制台项目相同。

Web.config 上与控制台项目上的 App.config 相同。

关于 Service1.svc 的构造函数我有:

LogManager.GetLogger("Initialise log4net from the current assembly attributes");

这就是我的 App.config 和 Web.Config 的样子:

configSections 标签内:

 <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,Log4net"/>

在主配置标签内:

 <log4net>
    <root>
      <level value="DEBUG"/>
      <appender-ref ref="LogFileAppender" />
    </root>
    <appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender" >
      <file value="C:\test3.txt"/>
      <appendToFile value="true" />
      <rollingStyle value="Size" />
      <maxSizeRollBackups value="5" />
      <maximumFileSize value="10MB" />
      <staticLogFileName value="true" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%d [%t] %-5p %c %m%n" />
      </layout>
    </appender>
  </log4net>

我该如何解决这个问题?

【问题讨论】:

  • 我从来没有设法让我的 WCF 服务使用程序集属性,最后我放弃了,只使用了XmlConfigurator.ConfigureAndWatch(...)
  • @stuartd 你是说我应该删除服务的 web.config 上的 log4net 部分,并将该部分留在服务上的 AssemblyInfo.cs 上。我做了那个改变,但服务仍然没有写入文件。
  • 不,我从未设法让我的 WCF 服务通过程序集属性加载 log4net,因此我使用 XmlConfigurator 来配置日志记录。我没有花太多时间在上面,因为我想让日志记录工作并继续前进。 LogManager.GetRepository().Configured 在调用 GetLogger 后是否返回 true?
  • @stuartd 好的,所以 XmlConfigurator 将在后面的 c# 代码中完成......LogManager.GetRepository().Configured 返回 false。
  • @stuartd 你有 XmlConfigurator 的例子,所以我可以配置日志记录吗?

标签: c# log4net


【解决方案1】:

您有 XmlConfigurator 的示例,以便我可以配置日志记录吗?

var logpath = HostingEnvironment.MapPath("~/web.config");
var fileInfo = new FileInfo(logpath);

if (fileInfo.Exists == false)
{
    throw new InvalidOperationException("Can't locate the web.config file");
}

log4net.Config.XmlConfigurator.ConfigureAndWatch(fileInfo);

请注意,只有采用 FileInfo 的 ConfigureAndWatch 方法的重载才能监视 app.config 或 web.config,因为它直接读取 .config 文件而不是使用 System.Configuration(一旦读取文件就无法重新阅读)。

文档解释了这个here

@pyram 编辑:因为两个项目都记录到同一个文件,所以有必要将此行添加到两个项目的 appender 配置中:

<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />

【讨论】:

  • 配置看起来不错。你在打日志电话吗?
  • @pyram 您在使用 XmlConfigurator 时不需要初始化程序集属性,但您确实需要调用记录器上的一种记录方法来实际记录任何内容 - 例如 LogManager.GetLogger("test").Debug("test logging");
  • 文件是否被创建?
  • 如果两个应用都登录到同一个文件,您需要将&lt;lockingModel type="log4net.Appender.FileAppender+MinimalLock" /&gt; 添加到两个服务的附加程序配置中。
  • 尝试登录到不同的文件
【解决方案2】:

WCF 中的 Log4Net 配置如下:

  1. 在您的项目中安装 Log4net 块包

这会将 log4net 包添加到引用中,请仔细检查。

  1. 在 AssemblyInfo.cs 中添加以下行

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

  2. 在应用根目录下创建log4net.xml,并添加日志配置,如下:

  3. 在服务中添加日志属性以在每个方法中使用它:

    private static readonly log4net.ILog _log = log4net.LogManager.GetLogger( System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

  4. 使用_log如下:

    catch (System.Exception ex) _log.Error(ex);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-12
    • 2011-07-08
    • 1970-01-01
    • 2013-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多