该文章是系列文章 基于.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. css三大特性

    层叠性: 当多个样式(样式的优先级相同)作用于同一个(同一类)标签时,样式发生了冲突,总是执行后边的代码(后边代码层叠前边的代码).和标签调用选择器的顺序没有关系. 继承性: 文字的大多属性都可以继承 ...

  2. lombok注解简化实体类getting 和 setting 方法

    实体类注解,将以往的get/set方法简化为标签注解,让代码看着更简洁. Maven依赖: <dependency> <groupId>org.projectlombok< ...

  3. java学习(4)——动手动脑

    根据ppt所给的例子,运行的结果如下所示: ppt中出现的第二个动手动脑如下: 代码如下: 其运行结果如下: 作出简单的分析如下:有点类似于if 和else的关系,总是对应try和catch同层中的异 ...

  4. Spring Boot项目错误:Error parsing lifecycle processing instructions

    pom.xml文件错误:Error parsing lifecycle processing instructions 解决方法:清空.m2/repository下的所有依赖文件,重新下载即可解决该问 ...

  5. Node.js开发Web后台服务(转载)

    原文:http://www.cnblogs.com/best/p/6204116.html 目录 一.简介 二.搭建Node.js开发环境 2.1.安装Node.js 2.2.安装IDE开发Node. ...

  6. DATASNAP清除僵死连接

    DATASNAP使用TCP/IP长连接的时候,由于诸如客户端非正常关闭的情况会造成中间件产生僵死SOCKET连接,随着时间的推移,僵死连接越来越多,造成中间件停止服务,表现为客户端无法连接中间件.DE ...

  7. 去掉小程序textarea上的完成按钮栏

    小程序textarea上会自动多一个完成按钮,如下图所示,如果是mpVue,在textarea添加     :show-confirm-bar="false"     即可.  

  8. Navicat for MySQL无法连接到数据库怎么办

    注意端口就是3306,不要改成80之类的,访问数据库就是从这个端口过去的

  9. BC一周年B

    #include <cstdio> #include <iostream> #include <algorithm> #include <queue> ...

  10. Mongodb for PHP教程之管理工具

    1:下面的事情应该是PHP程序员应该了解的,更详细的参考可以百度谷歌之 mongodb PHP官方文档http://us.php.net/manual/en/book.mongo.php 1.Mong ...