使用依赖注入在 windows 服务中实现 log4net

Implement log4net in a windows service using dependency injection

如果在每 10 分钟运行一次的 windows 服务的日志文件中发生错误,我想写入错误。我正在使用 .net framework 4.6 并通过 autofac 使用依赖注入。我想使用 Microsoft.Extensions.Logging dll。

我在 Windows 服务中使用 ASP.Net 4.8 和用于 DI 的 Autofac 完成了此操作。我也不必在 AssemblyInfo.cs 中添加任何程序集信息,因为我将配置信息放在 app.config 中,而不是单独的配置文件中。

app.config 将其放在 app.config 文件的顶部,紧跟在 <configuration>

之后
<configuration>
    <configSections>
        <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
    </configSections>

log4net 配置 把它放在 app.config 文件的底部,就在 </configuration> 里面。它将打印到您的 visual studio 输出 window 和一个名为 myservice.log

的文件
<log4net>
    <root>
      <level value="ALL" />
      <appender-ref ref="console" />
      <appender-ref ref="file" />
    </root>
    <appender name="console" type="log4net.Appender.ConsoleAppender">
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date %level %logger - %message%newline" />
      </layout>
    </appender>
    <appender name="file" type="log4net.Appender.RollingFileAppender">
      <file value="myservice.log" />
      <appendToFile value="true" />
      <rollingStyle value="Size" />
      <maxSizeRollBackups value="5" />
      <maximumFileSize value="10MB" />
      <staticLogFileName value="true" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %level %logger - %message%newline" />
      </layout>
    </appender>
  </log4net>
</configuration>

Program.cs

static void Main()
{
            ContainerBuilder cb = new ContainerBuilder();
            cb.RegisterType<MyService>().AsSelf().InstancePerLifetimeScope();
            log4net.Config.XmlConfigurator.Configure();
            ServiceBase.Run(container.Resolve<MyService>());
}

MyService.cs

private readonly ILog _logger;
public MyService(ILog logger)
{
    InitializeComponent();
    _logger = logger;
    _logger.Info("Hello World!");
}