Windows服务使用log4net记录日志
该文章是系列文章 基于.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 继承接口HostLoggerConfigurator、TraceLogWriterFactory.cs 继承接口LogWriterFactory、TraceLogWriter.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记录日志的更多相关文章
- 使用Topshelf开发Windows服务、log4net记录日志
开发windows服务,除了在vs里新建服务项目外(之前有写过具体开发方法,可点击查看),还可以使用Topshelf. 不过使用topshelf需要.netframework 4.5.2版本,在vs2 ...
- 如何为Windows服务增加Log4net和EventLog的日志功能。
一.简介 最近在做一个项目的时候,需要该项目自动启动.自动运行,不需要认为干预.不用说,大家都知道用什么技术,那就是 Windows服务.在以前的Net Framework 平台下,Windows 服 ...
- windows service使用log4net 记录日志
最近写了个定时邮件推送的服务,当利用lognet4记录日志时,发现日志并没有记录.后来明白windows 服务一般默认是在C:\Windows\System 或是C:\Windows\System32 ...
- windows服务与log4net应用
有时候我们需要用到window服务来执行定时任务,然后配合log4net记录程序运行情况,这里简单记录下配置的整个过程以及注意要点: 一.添加windows服务 1.设计页面,右键添加安装程序
- C# 开发 Windows 服务 使用Log4net 组件 不能生成日志文件
使用VS2012开发Windows服务,需要使用Log4net日志组件记录业务情况,但是始终生成不了日志文件. /// <summary> /// 入口方法 /// </summar ...
- Log4Net在Windows服务中不能记录日志 z
解决方案: 在Windows安装服务的“serviceProcessInstaller1”中修改Account属性为LocalSystem.见下图 后来查了一下这个Account属性 说白了还是权限的 ...
- 基于.NetCore和ABP框架如何让Windows服务执行Quartz定时作业
demo地址:ABP.WindowsService 该系列文章启发自 How to: Create a Windows Service that schedules jobs, logs and is ...
- 制作Windows服务项目详细攻略
1.在windows服务下面获得根目录: string assemblyFilePath = Assembly.GetExecutingAssembly().Location; string asse ...
- C# DateTime的11种构造函数 [Abp 源码分析]十五、自动审计记录 .Net 登陆的时候添加验证码 使用Topshelf开发Windows服务、记录日志 日常杂记——C#验证码 c#_生成图片式验证码 C# 利用SharpZipLib生成压缩包 Sql2012如何将远程服务器数据库及表、表结构、表数据导入本地数据库
C# DateTime的11种构造函数 别的也不多说没直接贴代码 using System; using System.Collections.Generic; using System.Glob ...
随机推荐
- uva 10559
记忆话搜索 DP 看了网上题解 状态方程真是巧妙 orz #include <cstdio> #include <cstdlib> #include <cmath> ...
- [Bzoj1015][JSOI2008]星球大战starwar(并查集)(离线处理)
1015: [JSOI2008]星球大战starwar Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 6849 Solved: 3204[Submit ...
- 打开input输入的时候,css中position:absolute/fixed定位的时候,定位元素上移问题解决
1.异常代码 <style> .box{ min-height: 100vh; width: 100%; position: relative; } .position{ position ...
- [javase学习笔记]-9.2 单继承与多重继承
这一节我们来看java中的单继承和多重继承. 在java语言中,支持的是单继承,不直接支持多继承,可是对C++中的多继承进行了改良. 那么什么是单继承和多继承呢? 单继承:一个子类仅仅能有一个直接父类 ...
- Pacemaker 安装与使用
Pacemaker 仅仅做资源管理器(CRM).底下的消息系统採用 corosync. 安装 以 ubuntu 为例, sudo aptitude install -y pacemaker coros ...
- react-router-redux
reducer与按需加载组件的时候,一并加载对应的state,具体流程就不多说了,看代码! reducer import { combineReducers } from 'redux' import ...
- <一>读<<大话设计模式>>之简单工厂模式
工厂模式尽管简单.可是写下这篇文章却不简单. 第一:本人经过内心的挣扎后才决定開始写博文的.为什么呢,由于好长时间没有写了,对自己的文学功底也是好不自信.可是技术这东西你不写出来你真不知道自己掌握多少 ...
- oracle获取字符串长度函数length()和lengthb()
oracle获取字符串长度函数length()和lengthb() lengthb(string)计算string所占的字节长度:返回字符串的长度,单位是字节 length(string)计算st ...
- [故障处理]西部数据wd elements xp 无法识别
百度后,看到如下帖子,供需要的朋友参考,黑体字为本人修改添加: http://blog.sina.com.cn/s/blog_539747670102w62w.html 经咨询WD厂商(厂商电话800 ...
- 2016/04/18 ①注册 注册处理 ② 审核 审核处理 ③登录 登录处理 ④需要jquery-1.11.2.min.js DBDA.php
① 注册 zhuceye.php <!DOCTYPE html> <html lang="en"> <head> <meta char ...