该文章是系列文章 基于.NetCore和ABP框架如何让Windows服务执行Quartz定时作业 的其中一篇。

比较流行的日志组件有以下四种,Topshelf都有相应的组件提供

本篇文章主要介绍log4net的使用。

配置log4net

使用Topshelf创建Windows服务中提到了当我们调试的时候Console会打印出如下的类似日志

Configuration Result:
[Success] Name Demo.MyJob
[Success] Description Demo.MyJob Service
[Success] ServiceName Demo.MyJob
Topshelf v4.2.0.194, .NET Framework v4.0.30319.42000
The Demo.MyJob service is now running, press Control+C to exit.

该日志是如何打印出来的呢?

访问Topshelf Github的源码,在HostFactory.cs查看Run执行逻辑,日志打印是通过调用HostLogger.Get(Type type) 方法获取了LogWriter,LogWriter是写日志接口。查看HostLogger.cs,可以看到LogWriter的默认实现,该实现包含有三个类TraceHostLoggerConfigurator.cs 继承接口HostLoggerConfiguratorTraceLogWriterFactory.cs 继承接口LogWriterFactoryTraceLogWriter.cs 继承接口LogWriter

如果我们需要实现log4net的日志访问,则需要实现三个类Log4NetLoggerConfigurator、Log4NetLoggerConfigurator、Log4NetLogWriter。我们可以自己实现,也可以使用Topshelf提供的实现,需要引用nuget包Topshelf.Log4Net。在Run执行逻辑添加UseLog4Net,如下所示。

        public override void PostInitialize()
{
HostFactory.Run(configure =>
{
//定义服务描述
configure.SetDescription("Demo.MyJob Service");
configure.SetDisplayName("Demo.MyJob");
configure.SetServiceName("Demo.MyJob"); configure.RunAsLocalSystem(); //使用log4net记录日志
configure.UseLog4Net("App.config"); //定义操作
configure.Service<MyJobService>(service =>
{
service.ConstructUsing(_ => new MyJobService());
service.WhenStarted(async _ => await _.StartAsync());
service.WhenStopped(async _ => await _.StopAsync());
service.WhenContinued(async _ => await _.ContinueAsync());
service.WhenPaused(async _ => await _.PauseAsync());
});
});
}

在上述代码中可知,我们需要添加自己的配置文件,对log4net进行配置。注意:需将添加的配置文件的属性配置为如果较新则复制。因为UseLog4Net关于加载配置文件的逻辑,是加载当前应用目录下的指定名称的文件。

更多关于log4net的配置请访问:https://logging.apache.org/log4net/release/manual/configuration.html

未使用log4net打印日志时,打印出来的日志是黑底白字,我们可以通过log4net配置改变打印字体的颜色,使用ManagedColoredConsoleAppender,也可以通过RollingFileAppender在本地机器生成log日志文件。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<log4net>
<appender name="ManagedColoredConsoleAppender" type="log4net.Appender.ManagedColoredConsoleAppender">
<mapping>
<level value="ERROR" />
<foreColor value="Red" />
</mapping>
<mapping>
<level value="Info" />
<foreColor value="Green" />
</mapping>
<mapping>
<level value="DEBUG" />
<foreColor value="Blue" />
</mapping>
<mapping>
<level value="WARN" />
<foreColor value="Yellow" />
</mapping>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%d{ABSOLUTE} [%thread] %-5p %c{1}:%L - %m%n" />
</layout>
<filter type="log4net.Filter.LevelRangeFilter">
<param name="LevelMin" value="DEBUG" />
<param name="LevelMax" value="Fatal" />
</filter>
</appender>
<appender name="RollingFile" type="log4net.Appender.RollingFileAppender">
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
<file value=".\logs\" />
<datePattern value="'my-windows-service-'dd.MM.yyyy'.log'" />
<staticLogFileName value="false" />
<appendToFile value="true" />
<rollingStyle value="Composite" />
<maxSizeRollBackups value="10" />
<maximumFileSize value="5MB" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%d [%t] %-5p %c - %m%n" />
</layout>
</appender>
<root>
<level value="DEBUG" />
<appender-ref ref="ManagedColoredConsoleAppender" />
<appender-ref ref="RollingFile" />
</root>
</log4net>
</configuration>

在配置文件中使用了<file value=".\logs\" />指定了文件生成相对路径,该相对路径应指向的是应用程序当前目录下,该目录下确实生成了日志文件,但是很不爽的是在C:\Windows\System32路径下也生成了文件。怎么解决该问题?通过log4net属性指定目录。

修改<file type="log4net.Util.PatternString" value="%property{LogsDirectory}\logs\" />,并需要添加一行配置代码log4net.GlobalContext.Properties["LogsDirectory"] = AppDomain.CurrentDomain.BaseDirectory;,如下所示。问题解决。

        public override void PostInitialize()
{
log4net.GlobalContext.Properties["LogsDirectory"] = AppDomain.CurrentDomain.BaseDirectory; HostFactory.Run(configure =>
{
//定义服务描述
configure.SetDescription("Demo.MyJob Service");
configure.SetDisplayName("Demo.MyJob");
configure.SetServiceName("Demo.MyJob"); configure.RunAsLocalSystem(); //使用log4net记录日志
configure.UseLog4Net("App.config"); //定义操作
configure.Service<MyJobService>(service =>
{
service.ConstructUsing(_ => new MyJobService());
service.WhenStarted(async _ => await _.StartAsync());
service.WhenStopped(async _ => await _.StopAsync());
service.WhenContinued(async _ => await _.ContinueAsync());
service.WhenPaused(async _ => await _.PauseAsync());
});
});
}

关于Appenders的特别说明

官网上哪些平台可用的Appenders表格如下

Appender .NET Framework 1.0 .NET Framework 1.1 .NET Framework 2.0 .NET Framework 3.5 .NET Framework 4.0 .NET Framework 4.5 .NET Framework 3.5 Client Profile .NET Framework 4.0 Client Profile .NET Standard 1.3 .NET CF 1.0 .NET CF 2.0 Mono Shared Source CLI 1.0 CLI 1.0 Compatible
AdoNetAppender x x x x x x x x x x x x
AnsiColorTerminalAppender x x x x x x x x x x x x x x
AspNetTraceAppender x x x x x x x x
BufferingForwardingAppender x x x x x x x x x x x x x x
ColoredConsoleAppender x x x x x x x x
ConsoleAppender x x x x x x x x x x x x x x
DebugAppender x x x x x x x x x x x x x x
EventLogAppender x x x x x x x x x x
FileAppender x x x x x x x x x x x x x x
ForwardingAppender x x x x x x x x x x x x x x
LocalSyslogAppender x x x x x x x x x x x
ManagedColoredConsoleAppender x x x x x x x x
MemoryAppender x x x x x x x x x x x x x x
NetSendAppender x x x x x x x x
OutputDebugStringAppender x x x x x x x x x x x
RemoteSyslogAppender x x x x x x x x x x x x x x
RemotingAppender x x x x x x x x x x x
RollingFileAppender x x x x x x x x x x x x x x
SmtpAppender x x x x x x x x x x
SmtpPickupDirAppender x x x x x x x x x x x x x x
TelnetAppender x x x x x x x x x x x x x x
TraceAppender x x x x x x x x x x x x x x
UdpAppender x x x x x x x x x x x x x x

由表格得知 ManagedColoredConsoleAppender 不支持 .NET Standard 1.3。

访问 Apache GitHub 镜像 Mirror of This is the Apache log4net logging project git repository

https://github.com/apache/logging-log4net/blob/master/netstandard/log4net/log4net.xproj



与官网说明不一致,官网说支持 ColoredConsoleAppender,不支持 ManagedColoredConsoleAppender,但是代码显示对于.Net Core来说,ManagedColoredConsoleAppender可用。

Windows服务使用log4net记录日志的更多相关文章

  1. 使用Topshelf开发Windows服务、log4net记录日志

    开发windows服务,除了在vs里新建服务项目外(之前有写过具体开发方法,可点击查看),还可以使用Topshelf. 不过使用topshelf需要.netframework 4.5.2版本,在vs2 ...

  2. 如何为Windows服务增加Log4net和EventLog的日志功能。

    一.简介 最近在做一个项目的时候,需要该项目自动启动.自动运行,不需要认为干预.不用说,大家都知道用什么技术,那就是 Windows服务.在以前的Net Framework 平台下,Windows 服 ...

  3. windows service使用log4net 记录日志

    最近写了个定时邮件推送的服务,当利用lognet4记录日志时,发现日志并没有记录.后来明白windows 服务一般默认是在C:\Windows\System 或是C:\Windows\System32 ...

  4. windows服务与log4net应用

    有时候我们需要用到window服务来执行定时任务,然后配合log4net记录程序运行情况,这里简单记录下配置的整个过程以及注意要点: 一.添加windows服务 1.设计页面,右键添加安装程序

  5. C# 开发 Windows 服务 使用Log4net 组件 不能生成日志文件

    使用VS2012开发Windows服务,需要使用Log4net日志组件记录业务情况,但是始终生成不了日志文件. /// <summary> /// 入口方法 /// </summar ...

  6. Log4Net在Windows服务中不能记录日志 z

    解决方案: 在Windows安装服务的“serviceProcessInstaller1”中修改Account属性为LocalSystem.见下图 后来查了一下这个Account属性 说白了还是权限的 ...

  7. 基于.NetCore和ABP框架如何让Windows服务执行Quartz定时作业

    demo地址:ABP.WindowsService 该系列文章启发自 How to: Create a Windows Service that schedules jobs, logs and is ...

  8. 制作Windows服务项目详细攻略

    1.在windows服务下面获得根目录: string assemblyFilePath = Assembly.GetExecutingAssembly().Location; string asse ...

  9. C# DateTime的11种构造函数 [Abp 源码分析]十五、自动审计记录 .Net 登陆的时候添加验证码 使用Topshelf开发Windows服务、记录日志 日常杂记——C#验证码 c#_生成图片式验证码 C# 利用SharpZipLib生成压缩包 Sql2012如何将远程服务器数据库及表、表结构、表数据导入本地数据库

    C# DateTime的11种构造函数   别的也不多说没直接贴代码 using System; using System.Collections.Generic; using System.Glob ...

随机推荐

  1. 洛谷 P3879 [TJOI2010]阅读理解

    P3879 [TJOI2010]阅读理解 题目描述 英语老师留了N篇阅读理解作业,但是每篇英文短文都有很多生词需要查字典,为了节约时间,现在要做个统计,算一算某些生词都在哪几篇短文中出现过. 输入输出 ...

  2. Atom列编辑快捷键

    安装这个:sublime-style-column-selection,在Ubuntu下使用[Shitf]+鼠标左键选择.

  3. [转] OracleDataReader.Read()是否有值

    TongYu2009的原文地址 当你执行一次OracleDataReader.Read()是Bool型),注意是只读取一个!如果你的Select语句执行结果是空,或者所有的结果都已经读取完了则Orac ...

  4. 【网络】TCP的拥塞控制

    一.拥塞控制的一般原理 拥塞:对网络中某一资源的需求超过了该资源所能提供的可用部分 拥塞控制是防止过多的数据注入到网络,这样可以使网络中的路由器或链路不致过载,拥塞控制是一个全局性的过程. 流量控制往 ...

  5. centos No module named setuptools解决方案

    wget http://pypi.python.org/packages/source/s/setuptools/setuptools-0.6c11.tar.gz tar zxvf setuptool ...

  6. Mockito的简单使用方法演示样例

    Mockito是一个流行的Mocking框架.它使用起来简单,学习成本非常低.并且具有非常简洁的API,測试代码的可读性非常高.因此它十分受欢迎,用 户群越来越多.非常多的开源的软件也选择了Mocki ...

  7. js实现的美女瀑布流效果代码

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...

  8. Opengl ES 1.x NDK实例开发之七:旋转的纹理立方体

    开发框架介绍请參见:Opengl ES NDK实例开发之中的一个:搭建开发框架 本章在第六章(Opengl ES 1.x NDK实例开发之六:纹理贴图)的基础上绘制一个旋转的纹理立方体,原理和纹理贴图 ...

  9. Redis和Memcache性能测试对比

    Redis和Memcache在写入性能上面差别不大,读取性能上面尤其是批量读取性能上面Memcache全面胜出,当然Redis也有自己的优点:比如数据持久化.支持更多的数据结构(Set List ZS ...

  10. WWDC笔记:2011 Session 125 UITableView Changes, Tips and Tricks

    What’s New Automatic Dimensions - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSect ...