log4net架构、配置、使用
架构说明
架构说明
上图是官方文档的提供的代码组织。
Log4net的核心组件有: Logger, Appender, Filter, Layout, Object Render,
Logger介绍
Logger是负责日志的记录者,假设我们需要记录一些正常的运行时日志和出现异常时的错误日志,那么我们可以通过在配置文件当中添加两个Logger实现。Logger主要用于记录日志的分类和控制日志的级别。它可以以多种格式输出日志信息,同时它也可以控制日志的输出级别。
log4net使用继承体系,也就是说假如存在两个Logger,名字分别为a.b.c和a.b。那么a.b就是a.b.c的祖先。每个Logger都继承了它祖先的属性。Log4net 的日志对象管理器LogManager:LogManager是用于来管理所有的Logger对象的,GetLogger() 可以用来查找已经存在的Logger对象,如果对象不存在它会自动创建一个Logger对象,并且管理它 。
Appender介绍
Appender提供记录的介质,可以翻译为附着器,logger记录的所有信息输出到Apender,Appender再输出到控制台,文本文件,windows 日志事件查看器等等。包括数据库,邮件等等位置。具体输出到哪里,我们可以通过Appender配置实现,而且Log4Net当中已经默认提供了一些常用的Appender,我们可以简单地修改一些配置文件就实现同时向数据库和同时向文件中写入的功能。
Log4net定义了多种附着器:
(1) AdoNetAppender 将日志记录到数据库中。可以采用SQL和存储过程两种方式
(2) AnsiColorTerminalAppender 在ANSI 窗口终端写下高亮度的日志事件
(3) AspNetTraceAppender 能用asp.net中Trace的方式查看记录的日志
(4) BufferingForwardingAppender 在输出到子Appenders之前先缓存日志事件
(5) ConsoleAppender 将日志输出到控制台
(6) EventLogAppender 将日志写到Windows Event Log
(7) FileAppender 将日志写到文件中
(8) MemoryAppender 将日志存到内存缓冲区
(9) NetSendAppender 将日志输出到Windows Messenger service.这些日志信息将在用户终端的对话框中显示
(10) RemoteSyslogAppender 通过UDP网络协议将日志写到Remote syslog service
(11) RemotingAppender 通过.NET Remoting将日志写到远程接收端
(12) RollingFileAppender 将日志以回滚文件的形式写到文件中
(13) SmtpAppender 将日志写到邮件中
(14) TraceAppender 将日志写到.NET trace 系统
(15) UdpAppender 将日志connectionless UDP datagrams的形式送到远程宿主或以UdpClient的形式广播
Filter介绍
Filter就是过滤器,使用过滤器可以过滤掉Appender输出的部分内容,只输出感兴趣的日志。
Layout介绍
Layout用于控制Appender的输出格式,可以使线性的也可以使XML。一个Appender只能有一个Layout配置。
Object Render介绍
Object Render将告诉logger如何把一个对象转化为一个字符串记录到日志里。ILog中定义的记录日志的方法接收的参数是Object,而不是String。例如你想把Orange对象记录到日志中,但此时logger只会调用Orange默认的ToString方法而已。所以要定义一个OrangeRender类实现log4net.ObjectRender.IObjectRender接口,然后注册它。这时logger就会知道如何把Orange记录到日志中了。
配置
logger
假设需要配置三个logger,一个负责记录debug信息,一个负责记录软件运行的一些信息,一个负责记录Error信息。
那么配置文件就可以这样写:
<logger name="logDebug">
<level value="DEBUG" />
<appender-ref ref="DebugAppender" />
</logger>
<logger name="loginfo">
<level value="INFO" />
<appender-ref ref="InfoAppender" />
</logger>
<logger name="logError">
<level value="ERROR" />
<appender-ref ref="ErrorAppender" />
</logger>
日志级别
高到底分别为:OFF > FATAL > ERROR > WARN > INFO > DEBUG > ALL
上面配置文件中定义了三个logger,每个logger都有一个level标签,指定好标签后就该logger就不会记录小于该级别的信息,比如记录error的ligger就被定义成ERROR,那么他就不会记录WARN 、 INFO 、 DEBUG级别的日志。
appender标签
指定该logger的appender
appender
每个logger都需要配置上appender,来指定该logger记录的日志输出到哪里,可以是控制台、文件、数据库等等。每个日志对象都可以使用多个appender,这样就可以同时使用文件输出和控制台输出。
上面指定了三个logger,那么为这三个logger添加上各自的appender后的配置文件,然后我还定义了一个控制台appender,让所有的信息都输出到控制台:
<logger name="logDebug">
<level value="DEBUG" />
<appender-ref ref="DebugAppender" />
<appender-ref ref="ConsoleAppender"></appender-ref>
</logger>
<appender name="DebugAppender" type="log4net.Appender.RollingFileAppender">
<file value="Log\\LogDebug\\" />
<appendToFile value="true" />
<maxFileSize value="10240" />
<maxSizeRollBackups value="100" />
<staticLogFileName value="false" />
<datePattern value="yyyyMMdd'.txt'" />
<rollingStyle value="Date" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%newline %n记录时间:%date %n线程ID:[%thread] %n日志级别: %-5level %n日志描述:%message%newline %n" />
</layout>
</appender>
<logger name="loginfo">
<level value="INFO" />
<appender-ref ref="InfoAppender" />
<appender-ref ref="ConsoleAppender"></appender-ref>
</logger>
<appender name="InfoAppender" type="log4net.Appender.RollingFileAppender">
<file value="Log\\LogInfo\\" />
<appendToFile value="true" />
<maxFileSize value="10240" />
<maxSizeRollBackups value="100" />
<staticLogFileName value="false" />
<datePattern value="yyyyMMdd'.txt'" />
<rollingStyle value="Date" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%newline %n记录时间:%date %n线程ID:[%thread] %n日志级别: %-5level %n日志描述:%message%newline %n" />
</layout>
</appender>
<logger name="logError">
<level value="ERROR" />
<appender-ref ref="ErrorAppender" />
<appender-ref ref="ConsoleAppender"></appender-ref>
</logger>
<appender name="ErrorAppender" type="log4net.Appender.RollingFileAppender">
<file value="log\\LogError\\" />
<appendToFile value="true" />
<rollingStyle value="Date" />
<datePattern value="yyyyMMdd'.txt'" />
<staticLogFileName value="false" />
<param name="MaxSizeRollBackups" value="100" />
<layout type="log4net.Layout.PatternLayout">
<!--每条日志末尾的文字说明-->
<!--输出格式-->
<!--样例:2019-01-28 13:42:32,111 [10] INFO Log4NetDemo.MainClass [(null)] - info-->
<conversionPattern value="%newline %n记录时间:%date %n线程ID:[%thread] %n日志级别: %-5level %n错误描述:%message%newline %n" />
</layout>
</appender>
<!--输入日志到控制台-->
<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="[时间]:%d%n[级别]:%p%n[内容]:%m%n%n"></conversionPattern>
</layout>
</appender>
每个appender都有一个name属性和type属性,type说明该appender是什么类型的,可以是(上一节中说过):
(1) AdoNetAppender 将日志记录到数据库中。可以采用SQL和存储过程两种方式
(2) AnsiColorTerminalAppender 在ANSI 窗口终端写下高亮度的日志事件
(3) AspNetTraceAppender 能用asp.net中Trace的方式查看记录的日志
(4) BufferingForwardingAppender 在输出到子Appenders之前先缓存日志事件
(5) ConsoleAppender 将日志输出到控制台
(6) EventLogAppender 将日志写到Windows Event Log
(7) FileAppender 将日志写到文件中
(8) MemoryAppender 将日志存到内存缓冲区
(9) NetSendAppender 将日志输出到Windows Messenger service.这些日志信息将在用户终端的对话框中显示
(10) RemoteSyslogAppender 通过UDP网络协议将日志写到Remote syslog service
(11) RemotingAppender 通过.NET Remoting将日志写到远程接收端
(12) RollingFileAppender 将日志以回滚文件的形式写到文件中
(13) SmtpAppender 将日志写到邮件中
(14) TraceAppender 将日志写到.NET trace 系统
(15) UdpAppender 将日志connectionless UDP datagrams的形式送到远程宿主或以UdpClient的形式广播
上面配置文件中我把Debug、Info、Error全部配置成文件类型。
<file value="log\\LogError\\" />
标签指定文件保存目录
其它节点的说明与配置
(1)param节点
元素可以是如何元素的子元素,包含的属性:name、value、type。name:必须的,取值是父对象的参数名。value:可选的,value是一个能被转化为参数值的字符串。type:可选的,value和type中,必须有一个属性被指定。type是一个类型名,如果type不是在log4net程序集中定义的,就需要使用全名。
param节点的主要作用是可以代替其他任何节点,例如:
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%5p %n"/>
<!--可以使用:<param name="ConversionPattern" value="%5p %n"/>-->
</layout>
<filter type="log4net.Filter.LevelMatchFilter">
<levelToMatch value="FATAL"/>
<!--可以使用:<param name="LevelToMatch" value="FATAL"/>-->
</filter>
<filter type="log4net.Filter.DenyAllFilter" />
(2)root节点
root节点的作用是所有其它logger都默认继承它。root元素没有属性。root节点的子元素与logger一样有appender-ref、level、param。
使用示例:
<root xmlns="">
<level value="WARN" />
<appender-ref ref="LogFileAppender" />
<appender-ref ref="ConsoleAppender" />
</root>
(3)log4net节点
Log4net节点是整个日志配置的根节点,包含的属性:debug、update、threshold。debug:可选,取值是true或false,默认是false。设置为true,开启log4net的内部调试。update:可选,取值是Merge(合并)或Overwrite(覆盖),默认值是Merge。设置为Overwrite,在提交配置的时候会重置已经配置过的库。threshold:可选,取值是repository(库)中注册的level,默认值是ALL。
Log4net节点支持的子元素:appender(0或多个)、logger (0或多个)、renderer (0或多个)、root(最多一个)、param(0或多个)。
使用
log4net的配置文件可以单独做一个,也可配置到App.config中
我是配置到单独的文件中了,注意我是在.net core2.2下做的,配置文件读取有点与.net framework不一样,具体不贴出来了。
首先创建一个config文件,右键工程,添加config文件,然后把本文下面的配置文件内容添加进去。
注意这里要选择拷贝到生成目录中,要不然容易导致找不到配置文件而无法创建logger。
注意,如果是net core的话,读取配置文件使用ConfigurationManager类,需要从nuget上安装system.configuration.ConfigurationManager。
using log4net;
using log4net.Config;
using log4net.Repository;
using System;
using System.Configuration;
using System.IO;
namespace TestLog4Net
{
class Program
{
static ILog LogDebug = null;
static ILog LogInfo = null;
static ILog LogError = null;
static void Main(string[] args)
{
InitLog4Net();
LogInfo.Info("first log");
Console.WriteLine("Hello World!");
ReadAllSettings();
Console.ReadKey();
}
//初始化log4net,创建logger
static void InitLog4Net()
{
ILoggerRepository repository = LogManager.CreateRepository("NETCoreRepository");
XmlConfigurator.Configure(repository, new FileInfo("log4net.config"));
LogDebug = LogManager.GetLogger(repository.Name, "logDebug");
LogInfo = LogManager.GetLogger(repository.Name, "loginfo");
LogError = LogManager.GetLogger(repository.Name, "logError");
}
static void ReadAllSettings()
{
LogDebug.Debug("logDebug");
LogInfo.Info("loginfo");
LogError.Error("error");
try
{
var appSettings = ConfigurationManager.AppSettings;
if (appSettings.Count == 0)
{
Console.WriteLine("AppSettings is empty.");
}
else
{
foreach (var key in appSettings.AllKeys)
{
Console.WriteLine("Key: {0} Value: {1}", key, appSettings[key]);
}
}
}
catch (ConfigurationErrorsException)
{
Console.WriteLine("Error reading app settings");
}
}
}
}
完整的配置文件:
<?xml version="1.0" encoding="utf-8"?>
<log4net>
<logger name="logDebug">
<level value="DEBUG" />
<appender-ref ref="DebugAppender" />
<appender-ref ref="ConsoleAppender"></appender-ref>
</logger>
<appender name="DebugAppender" type="log4net.Appender.RollingFileAppender">
<file value="Log\\LogDebug\\" />
<appendToFile value="true" />
<maxFileSize value="10240" />
<maxSizeRollBackups value="100" />
<staticLogFileName value="false" />
<datePattern value="yyyyMMdd'.txt'" />
<rollingStyle value="Date" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%newline %n记录时间:%date %n线程ID:[%thread] %n日志级别: %-5level %n日志描述:%message%newline %n" />
</layout>
</appender>
<logger name="loginfo">
<level value="INFO" />
<appender-ref ref="InfoAppender" />
<appender-ref ref="ConsoleAppender"></appender-ref>
</logger>
<appender name="InfoAppender" type="log4net.Appender.RollingFileAppender">
<file value="Log\\LogInfo\\" />
<appendToFile value="true" />
<maxFileSize value="10240" />
<maxSizeRollBackups value="100" />
<staticLogFileName value="false" />
<datePattern value="yyyyMMdd'.txt'" />
<rollingStyle value="Date" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%newline %n记录时间:%date %n线程ID:[%thread] %n日志级别: %-5level %n日志描述:%message%newline %n" />
</layout>
</appender>
<logger name="logError">
<level value="ERROR" />
<appender-ref ref="ErrorAppender" />
<appender-ref ref="ConsoleAppender"></appender-ref>
</logger>
<appender name="ErrorAppender" type="log4net.Appender.RollingFileAppender">
<file value="log\\LogError\\" />
<appendToFile value="true" />
<rollingStyle value="Date" />
<datePattern value="yyyyMMdd'.txt'" />
<staticLogFileName value="false" />
<param name="MaxSizeRollBackups" value="100" />
<layout type="log4net.Layout.PatternLayout">
<!--每条日志末尾的文字说明-->
<!--输出格式-->
<!--样例:2019-01-28 13:42:32,111 [10] INFO Log4NetDemo.MainClass [(null)] - info-->
<conversionPattern value="%newline %n记录时间:%date %n线程ID:[%thread] %n日志级别: %-5level %n错误描述:%message%newline %n" />
</layout>
</appender>
<!--输入日志到控制台-->
<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="[时间]:%d%n[级别]:%p%n[内容]:%m%n%n"></conversionPattern>
</layout>
</appender>
</log4net>
源代码:https://github.com/feipeng8848/TestLog4Net
参考:
https://www.cnblogs.com/LiZhiW/p/4317198.html
https://www.jianshu.com/p/6c9b26db6d6d
https://segmentfault.com/a/1190000010866959#articleHeader1
https://stackoverrun.com/cn/q/261563
https://yq.aliyun.com/articles/293129/
https://logging.apache.org/log4net/release/sdk/index.html#
https://www.cnblogs.com/linezero/p/log4net.html
log4net架构、配置、使用的更多相关文章
- LOG4NET日志配置及使用
Log4net的安装 Install-Package log4net 1.先弄个日志记录的类 /// <summary> /// 使用LOG4NET记录日志的功能,在WEB.CONFIG里 ...
- log4net的配置与使用
log4net解决的问题是在.Net下提供一个记录日志的框架,它提供了向多种目标写入的实现,比如利用log4net可以方便地将日志信息记录到文件.控制台.Windows事件日志和数据库(包括MS SQ ...
- 将Log4net的配置配置到的独立文件中
本文转载:http://blog.csdn.net/wanzhuan2010/article/details/7587780 另外一篇博客:http://grim1980.blog.sohu.com/ ...
- Log4Net 日志配置[附带源码]
前述 园子里有许多人对log4net这款开源的日志记录控件有很多介绍.在这里个人再做一次总结,希望对以后有所帮助,需要的时候可以直接使用,减少查阅资料的时间.利用log4net可以方便地将日志信息记录 ...
- Log4Net详细配置
关于Log4Net配置主要分几步 第一步:下载log4net.dll(log4net官网:http://logging.apache.org/log4net/download_log4net.cgi) ...
- 日志管理-将Log4net的配置配置到的独立文件中
转自:http://www.cnblogs.com/zfanlong1314/p/3662679.html使用log4net已经很久了.但从来没有详情了解log4的参数,及具体使用方法.看了周公的博客 ...
- Log4net快速配置使用指南。(快速搭建log4net日志平台手册)
每做一个新项目,都会用到log4net,但总是忘记如何快速配置.有时在网上搜半天也找不到好的模板,大都在介绍参数的使用,在此做下总结,争取下次用时仅10分钟就可搭建好log4net. 直接上介绍的步骤 ...
- C# log4net 的配置
项目的日志组件是必备可少的,任何项目中都需要.这样既方便前期的开发测试也方便项目后期的项目维护.C#项目的一个不错的日志组件是log4net,下面我就把桌面应用程序.控制台程序.网站中log4net的 ...
- LNMP + Apache 架构配置
从事前端开发已3年有余,越来越发现前端开发要学习的知识已不仅仅是html+css+js那么简单了,2017年市场上就有了大前端的概念,可以说对前端工程师的要求也越来越高了,从招聘的要求中可以看到熟悉一 ...
- log4net 日志配置及使用
一.log4net按照不同的[LEVEL]级别输出到不同文件 <log4net> <!--错误日志:::记录错误日志--> <!--按日期分割日志文件 一天一个--> ...
随机推荐
- python3 小工具
扫描IP的端口是否开放:Porttest.py # -*- coding: utf-8 -*- import sys import os import socket #扫描 def scanport( ...
- .Net逆向初学习
前一段时间逆向一个程序时发现是.net的,然后用OD和IDA都调试不了,最后上网查了一下原来.net的逆向要用专门的工具.这里推荐大家一篇文章去了解一下逆向.net的一些工具简介:http://www ...
- [No0000D1]WPF—TreeView无限极绑定集合形成树结构
1.如图所示:绑定树效果图 2.前台Xaml代码: <Window x:Class="WpfTest.MainWindow" xmlns="http://schem ...
- Java Web请求和响应机制
1.请求响应流程图 =================== 服务器处理请求的流程: 服务器每次收到请求时,都会为这个请求开辟一个新的线程. 服务器会把客户端的请求数据封装到request对象中,req ...
- MySQL 添加索引,删除索引及其用法
一.索引的作用 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,所以查询语句的优化显然是重中之重. 在数据 ...
- PTA 复数四则运算
本题要求编写程序,计算2个复数的和.差.积.商. 输入格式: 输入在一行中按照a1 b1 a2 b2的格式给出2个复数C1=a1+b1i和C2=a2+b2i的实部和虚部.题目保证C2不为0. 输出格式 ...
- 安装Linux系统
一.环境准备 1.一个VM虚拟机镜像,一个CentOS-7镜像(注:CentOS-7和CentOS-6在命令上有很大的差别,这里选择CentOS-7版本) 二.开始安装 1.新建一个虚拟机,选择自定义 ...
- java八大数据类型
基本数据类型以值传递的方式进行传递,String以值传递的方式传递,其他的以地址的方式进行传递 分别是:byte short int long float double char boole ...
- DjangoMTV模型之model层——ORM操作数据库(基本增删改查)
Django的数据库相关操作 对象关系映射(英语:(Object Relational Mapping,简称ORM),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换.从效果上说 ...
- 小程序 navigator 无法跳转 tabBar上的页面
解决方法一: navigator 的 open-type 设置为 switchTab 解决方法二: 使用 wx.switchTab({ url: ‘../cart/index’ }) 进行跳转