【问题标题】:Steps to configure log4net in a C# service application在 C# 服务应用程序中配置 log4net 的步骤
【发布时间】:2017-03-03 00:29:45
【问题描述】:

我对如何在 Windows 服务项目中配置 log4net 感到非常困惑。除此之外,我是 Visual Studio 配置的新手。所以,我创建了这个 Windows 服务应用程序,我想将 log4net 添加到它。所有说明都不同,一个答案据说包括以下行到程序集信息。另一个答案是将其添加到 AssemblyInfo.cs(在您的 App_Code 文件夹中)。那么这是否意味着我需要在源文件夹中添加一个名为 AssemblyInfo.cs 的类,然后在构造函数中添加这一行? 我不知道那是什么意思!

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

我已将 appSettings 添加到我的 app.config 文件中:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
    <appSettings>
        <add key="log4net.Internal.Debug" value="true"/>
    </appSettings> 
</configuration>

我还需要创建 log4net.config 文件吗?

我尝试按照this questions 的指示进行操作,但没有足够的信息对我有意义。我花了几个小时寻找有意义的说明。有人可以告诉我(高层次)为 Windows 服务应用程序配置 log4net 的步骤吗?我需要创建哪些文件;我需要添加哪些配置;我知道我需要创建一个记录器类,但配置让我完全困惑。

------------------编辑---------- ------------------------

第 1 步) 我的 app.config 如下所示:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>

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

    <log4net>
      <appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender">
        <file value="log.log" />
        <appendToFile value="true" />
        <rollingStyle value="Size" />
        <maxSizeRollBackups value="5" />
        <maximumFileSize value="100KB" />
        <staticLogFileName value="true" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%date %level %logger - %message %exception%newline" />
        </layout>
      </appender>
      <root>
        <level value="ALL" />
        <appender-ref ref="LogFileAppender" />
      </root>
    </log4net>

</configuration>

第 2 步)我已将其添加到 Program.cs 主目录中:

using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Threading.Tasks;

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

namespace MyAppService
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        static void Main()
        {
            log4net.Config.XmlConfigurator.Configure();

第 3 步)我添加了对 log4net 的引用

第 4 步)在我正在记录的课程中,我添加了以下内容:

private static ILog logger = LogManager.GetLogger(typeof(Reader));

第 4 步)我添加了如下日志语句:

logger.Info("Data Read Completed Successfully.");

【问题讨论】:

  • 我觉得跟具体的平台、服务没有关系,都是一样的。您是否尝试证明它在控制台应用程序中有效?

标签: c# windows service log4net-configuration


【解决方案1】:

您可以使用 app.config 进行配置:对于具有单独文件的 Windows 服务来说,这是一种偏好而不是必需品,因为该服务可以监视配置文件的更改。

关于任何地方的程序集指令,只要它在启动项目(您的服务)中,您就可以将其添加到任何文件中,尽管习惯上将它们添加到现有的 AssemblyInfo.cs 文件中。

必须还可以在您的启动例程中调用 Log4net,as the documentation says in bold

使用属性可以更清晰地定义应用程序的配置将从何处加载。然而值得注意的是,属性纯粹是被动的。它们只是信息。因此,如果您使用配置属性,您必须调用 log4net 以允许它读取属性。对 LogManager.GetLogger 的简单调用将导致调用程序集上的属性被读取和处理。 因此,必须在应用程序启动期间尽早进行日志调用,并且肯定是在加载和调用任何外部程序集之前。

为此,您的服务启动代码必须包含如下行:

LogManager.GetLogger("initialise logging system");

或者,您可以删除属性并在启动程序中调用XmlConfigurator.ConfigureAndWatch(),默认情况下会加载并查看 app.config 文件。同样,是使用该属性还是使用程序集属性来加载配置的偏好问题。

【讨论】:

  • 在我的 app.config 中放什么?程序集:log4net 行?
    行?如果是后者,我会在配置文件中的某个位置读取。但我的配置文件中的第一件事是 .NETFramework 的启动。那么我应该在.NETFramework 启动之前还是之后添加它?没有一个对 .NET 新手有意义的例子吗?
  • 您将配置添加到 app.config 文件中,程序集指令必须在代码文件中。 log4net 部分不一定是第一个,但它必须在 app.config 文件的顶部定义一个configSectionThis page 展示了如何做到这一点。
  • 你能看看我的编辑吗?我错过了一些东西,因为我没有得到任何日志。谢谢。
  • 糟糕!还有一件事......我在单元测试中运行它。我必须为此做一个单独的配置吗?
  • 如果你想测试日志记录,你需要在单元测试项目中复制配置,但是如果你不需要测试日志记录,log4net 不会在没有配置的情况下抛出任何错误.
猜你喜欢
  • 1970-01-01
  • 2018-10-22
  • 1970-01-01
  • 2020-06-20
  • 1970-01-01
  • 2010-12-17
  • 2017-11-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多