一.Log4Net框架介绍

  Log4net 是 Apache 下一个开放源码的项目,它是Log4j 的一个克隆版。Log4net中定义了多种日志信息输出模式。它可以根据需要将日志输出到控制台,文本文件,数据库,邮件等等位置,以便我们快速跟踪程序bug。

二、Log4net的基本结构

2.1  Log4Net核心组件

Log4net主要分为5个核心组件:  Logger, Appender, Filter,Layout,Object Render 。

2.2  组件介绍

2.2.1  Logger介绍

Logger是 负责日志的记录者 ,我们可以根据需要使用多个 Logger实现。Logger主要用于记录日志的分类和控制日志的级别。它可以以多种格式输出日志信息,同时它也可以控制日志的输出级别。

log4net使用继承体系,也就是说假如存在两个Logger,名字分别为a.b.c和a.b。那么a.b就是a.b.c的祖先。每个Logger都继承了它祖先的属性。Root是所有logger的父类。

2.2.2  Appender介绍

Appender 提供记录的介质 ,我们可能要将日志输出到控制台,文本文件,数据库,邮件等等位置。我们可以通过Appender配置实现,而且Log4Net当中已经默认提供了一些常用的Appender,我们可以简单地修改一些配置文件就实现同时向数据库和同时向文件中写入的功能。

2.2.3  Filter介绍

Filter就是 过滤器 ,使用过滤器可以过滤掉Appender输出的部分内容,只输出感兴趣的日志。

2.2.4 Layout介绍

Layout用于 控制Appender的输出格式 ,可以使线性的也可以使XML。一个Appender只能有一个Layout配置。

2.2.5 Object Render介绍

Object Render将告诉logger如何把一个对象转化为一个字符串记录到日志里。ILog中定义的记录日志的方法接收的参数是Object,而不是String。

例如你想把Orange对象记录到日志中,但此时logger只会调用Orange默认的ToString方法而已。所以要定义一个OrangeRender类实现log4net.ObjectRender.IObjectRender接口,然后注册它。这时logger就会知道如何把Orange记录到日志中了。

三、节点配置

3.1  一些基本的节点

3.1.1  configSections节点

  配置log4net需要在configSections节点中加入节点section,例如

<configSections>
<section name="log4net" type="System.Configuration.IgnoreSectionHandler"/>
</configSections>

3.1.2  log4net节点

Log4net节点是整个日志配置的根节点,包含的属性:debug:可选,取值是true或false,默认是false。设置为true,开启log4net的内部调试。update:可选,取值是Merge(合并)或Overwrite(覆盖),默认值是Merge。设置为Overwrite,在提交配置的时候会重置已经配置过的库。threshold:可选,取值是repository(库)中注册的level,默认值是ALL。

3.2  logger节点配置

3.2.1 属性

name:必须,logger的名字,用于代码获取logger

ILog log = LogManager.GetLogger("logger-name")

Additivity:可选,bool类型,默认值是true。设置为false时将阻止父logger中的appender。

3.2.2 子元素

Level:最多一个。在这个级别或之上的才会被记录。Log4net中的级别有OFF、FATAL、ERROR、WARN 、INFO、DEBUG、ALL7种。

appender-ref:0个或多个,要使用的appender的名字。

Param:0个或多个,设置一些额外参数。

3.2.3 一个logger的配置栗子

 <log4net xmlns="urn:log4net">
<logger xmlns="" name="Base">
<appender-ref ref="文件输出"/>
</logger>
<logger xmlns="" name="Base.Test">
<!-- 继承Base-->
<level value="ALL"/>
<appender-ref ref="控制台输出"/>
</logger>
<appender xmlns="" name="控制台输出" type="log4net.Appender.ConsoleAppender">
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%d %-5p %m %exception %n" />
</layout>
</appender>
<appender xmlns="" name="文件输出" type="log4net.Appender.FileAppender">
<param name="File" value="F:log-file.txt" />
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%d %-5p %m %exception %n" />
</layout>
</appender>
</log4net>

3.3  appender节点配置

3.3.1  属性

Name:必须的,appender对象的名称

Type:必须的,appender对象的输出类型

3.3.2  常用的子元素

Filter:0个或多个,定义此appender使用的过滤器。

Layout:最多一个。定义appender使用的输出格式。

Param:0个或多个, 设置Appender类中对应的属性的值。

3.3.3  Type属性的种类(输出的方式)

   AdoNetAppender              将日志记录到数据库中。可以采用SQL和存储过程两种方式。

   AnsiColorTerminalAppender   将日志高亮输出到ANSI终端。

   AspNetTraceAppender         能用asp.net中Trace的方式查看记录的日志。

   BufferingForwardingAppender 在输出到子Appenders之前先缓存日志事件。

   ConsoleAppender             将日志输出到应用程序控制台。

   EventLogAppender            将日志写到Windows Event Log。

   FileAppender                将日志输出到文件。

   ForwardingAppender          发送日志事件到子Appenders。

   LocalSyslogAppender         将日志写到local syslog service (仅用于UNIX环境下)。

   MemoryAppender              将日志存到内存缓冲区。

   NetSendAppender             将日志输出到Windows Messenger service.这些日志信息将在用户终端的对话框中显示。

   OutputDebugStringAppender   将日志输出到Debuger,如果程序没有Debuger,就输出到系统Debuger。如果系统Debuger也不可用,将忽略消息。

   RemoteSyslogAppender        通过UDP网络协议将日志写到Remote syslog service。

   RemotingAppender            通过.NET Remoting将日志写到远程接收端。

   RollingFileAppender         将日志以回滚文件的形式写到文件中。

   SmtpAppender                将日志写到邮件中。

   SmtpPickupDirAppender       将消息以文件的方式放入一个目录中,像IIS SMTP agent这样的SMTP代理就可以阅读或发送它们。

   TelnetAppender              客户端通过Telnet来接受日志事件。

   TraceAppender               将日志写到.NET trace 系统。

   UdpAppender                 将日志以无连接UDP数据报的形式送到远程宿主或用UdpClient的形式广播。

3.3.4  appender配置的栗子

(1)最常用的回滚文件的形式记录日志

<appender name="文件输出" type="log4net.Appender.RollingFileAppender">
<file value="F:\log\Log.txt" />
<appendToFile value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="10" />
<maximumFileSize value="5MB" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%d %-5p %m %exception %n" />
</layout>
</appender>

(2)使用过滤器记录日志

<appender name="控制台输出" type="log4net.Appender.ConsoleAppender">
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%d %-5p %m %exception %n" />
</layout>
<filter type="log4net.Filter.LevelMatchFilter">
<levelToMatch value="FATAL"/>
</filter>
<filter type="log4net.Filter.DenyAllFilter" />
</appender>

3.4  filter节点配置

3.4.1  节点和子元素

属性:type,必须的,表示filter的类型

子元素:Param,数量0个或多个,作用设置一些参数。

     AcceptOnMatch true/false,默认为true,作用见下边分析。

3.4.2  filter的常用类型

    DenyAllFilter       阻止所有的日志事件被记录
LevelMatchFilter 只有指定等级的日志事件才被记录
LevelRangeFilter 日志等级在指定范围内的事件才被记录
LoggerMatchFilter Logger名称匹配,才记录

3.4.3  filter的工作原理

  查了很多资料都没明白,说一个形象的栗子吧:一个超市营业,刚开始所有的顾客(所有的日志信息)都是普通客人,大家都可以自由购物(输出日志)。后来超市用一个办法(过滤器)给把顾客分成三个等级:拉黑,普通客人,Vip,分等级的规则很简单:找一些特定的顾客(如小区是A小区的-[logger名为A小区]/资产为100w等级-[LevelToMatch为Error]),把这些顾客拉黑(AccrptOnMatch为false)或者设置为VIP(AcceptOnMatch为true默认的),被拉黑的顾客不能买东西了(不能输出日志),普通顾客和Vip可以照常购物(可以输出日志)。有一天超市缺货,所以给大家说普通客人不能购物了(添加了一个DenyAllFilter过滤器),现在只剩下Vip顾客能Shopping了。(值得注意的是LevelRangeFilter默认会把不再范围的日志都淘汰掉 Ps:我们超市只面对资产为10w~100w的客人(Level为Info~Error的可以输出),其他人都拉黑,如果我还要对这个等级范围内的人筛选住在小区B的怎么办?首先让这部分顾客都不能购物(设置AccrptOnMatch为false,其他地方设置为false就拉黑了,在LevelRang这里设置false,还有一次筛选的机会),再做一个筛选(新建一个过滤器判断logger名字是小区B),这样只有住在B小区且为10w~100w资产的才能购物了)。

3.4.4  filter配置的常用栗子

(1)仅输出level为Error的信息(LevelMatchFilter+DenyAllFilter

       <filter type="log4net.Filter.LevelMatchFilter">
<param name="LevelToMatch" value="Error" />
<AcceptOnMatch value="true"></AcceptOnMatch> AcceptOnMatch默认为true,如果设置为false,
</filter>
<filter type="log4net.Filter.DenyAllFilter" />

(2)输出lever在DEBUG到ERROR之间的信息

       <filter type="log4net.Filter.LevelRangeFilter">
<param name="LevelMin" value="DEBUG" />
<param name="LevelMax" value="ERROR" />
</filter>

(3)输出名字为myLogger的日志

       <filter type="log4net.Filter.LoggerMatchFilter">
<param name="LoggerToMatch" value="myLogger" />
</filter>

3.5  layout节点配置

3.5.1  节点和子元素

属性:type,必须的,表示layout的类型

子元素:Param,数量0个或多个,作用设置一些参数。

3.5.2  type属性(布局的种类)

    ExceptionLayout         只呈现日志事件中异常的文本信息
PatternLayout 可以通过类型字符串来配置的布局
RawPropertyLayout 从日志事件中提取属性值
RawTimeStampLayout 从日志事件中提取日期
RawUtcTimeStampLayout 从日志事件中提取UTC日期
SimpleLayout 很简单的布局
XmlLayout 把日志事件格式化为XML元素的布局

3.5.3  PatterLayout的格式化字符串

    %m、%message         输出的日志消息
%d、%datetime 输出当前语句运行的时刻,格式%date{yyyy-MM-dd HH:mm:ss,fff}
%r、%timestamp 输出程序从运行到执行到当前语句时消耗的毫秒数
%p、%level 日志的当前优先级别
%c、%logger 当前日志对象的名称
%L、%line 输出语句所在的行号
%F、%file 输出语句所在的文件名,警告:只在调试的时候有效,调用本地信息会影响性能
%a、%appdomain 引发日志事件的应用程序域的名称。
%C、%class、%type 引发日志请求的类的全名,警告:会影响性能
%exception 异常信息
%u、%identity 当前活动用户的名字,我测试的时候%identity返回都是空的。警告:会影响性能
%l、%location 引发日志事件的名空间、类名、方法、行号。警告:会影响性能,依赖pdb文件
%M、%method 发生日志请求的方法名,警告:会影响性能
%n、%newline 换行符
%x、%ndc NDC(nested diagnostic context)
%X、%mdc、%P、%properties 等介于 %property
%property 输出{log4net:Identity=, log4net:UserName=, log4net:HostName=}
%t、%thread 引发日志事件的线程,如果没有线程名就使用线程号。
%w、%username 当前用户的WindowsIdentity,类似:HostName/Username。警告:会影响性能
%utcdate 发生日志事件的UTC时间。例如:%utcdate{HH:mm:ss,fff}
%% 输出一个百分号

3.5.4  PatterLayout格式修饰符

    %20logger       右对齐     20        无     如果logger名不足20个字符,就在左边补空格
%-20logger 左对齐 20 无 如果logger名不足20个字符,就在右边补空格
%.30logger 左对齐 无 30 超过30个字符将截断
%20.30logger 右对齐 20 30 logger名要在20到30之间,少了在左边补空格,多了截断
%-20.30logger 左对齐 20 30 logger名要在20到30之间,少了在右边补空格,多了截断

3.5.5  layout的使用示例

<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%d [%t] %-5p %c [%x] - %m%n"/>
</layout>

参考文献

1、http://www.cnblogs.com/LiZhiW/p/4317198.html?utm_source=tuicool&utm_medium=referral

2、https://zhidao.baidu.com/question/755628560075598484.html

3、https://blog.csdn.net/cxzhq2002/article/details/46363681

Log4net(一)-——配置文件的更多相关文章

  1. 【log4net】配置文件

    相关资料: http://www.cnblogs.com/dragon/archive/2005/03/24/124254.html 注意: //如果为了使得应用程序的配置文件(web/app.con ...

  2. 【log4net】配置文件解释

    ASP.NET MVC 1.web.config: <configSections> <section name="log4net" type="log ...

  3. 在C#代码中应用Log4Net(三)Log4Net中配置文件的解释

    一个完整的配置文件的例子如下所示,这个是”在C#代码中应用Log4Net(二)”中使用的配置文件. <log4net> <!-- 错误日志类--> <logger nam ...

  4. 在C#代码中应用Log4Net 中配置文件的解释

    一个完整的配置文件的例子如下所示,这个是”在C#代码中应用Log4Net(二)”中使用的配置文件. <log4net> <!-- 错误日志类--> <logger nam ...

  5. [转]Log4Net中配置文件的解释

    FROM:http://www.cnblogs.com/kissazi2/p/3392605.html 一个完整的配置文件的例子如下所示 <log4net> <!-- 错误日志类-- ...

  6. Log4Net中配置文件的解释

    一个完整的配置文件的例子如下所示 <log4net> <!-- 错误日志类--> <logger name="logerror"> <le ...

  7. C#log4net引入配置文件后,数据库连接找不到并且有很多 未能找到元素“appender”的架构信息

    今天用了log4net加入配置信息后,数据库链接的字符串就报错,无法连接数据库.后来发现,只需要调整一下位置就可以了 configSections 节点必须写在 connectionStrings 节 ...

  8. log4net独立配置文件配置(winfrom)

    log4net配置很多,具体配置步骤不细说,具体说出个人遇到的问题. 在winfrom和web应用程序中配置,在默认配置文件配置都没问题,因为EF也写在默认配置文件中,就会冲突解决办法就是将log4. ...

  9. log4net保存到数据库系列二:独立配置文件中配置log4net

    园子里面有很多关于log4net保存到数据库的帖子,但是要动手操作还是比较不易,从头开始学习log4net数据库日志一.WebConfig中配置log4net 一.WebConfig中配置log4ne ...

  10. 怎么在.NetCore3.0 中使用Log4net 写日志 及读取配置文件的信息

    1:安装Log4Net的 NuGet 包: 我们通常之需要安装这一个包即可,其他的主包会自动被添加进来: insatll-package  Microsoft.Extensions.Logging.L ...

随机推荐

  1. David Silver强化学习Lecture1:强化学习简介

    课件:Lecture 1: Introduction to Reinforcement Learning 视频:David Silver深度强化学习第1课 - 简介 (中文字幕) 强化学习的特征 作为 ...

  2. org.apache.ibatis.exceptions.PersistenceException: ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure The last packet sent succ

    数据库 没有开启  连接失败 org.apache.ibatis.exceptions.PersistenceException: ### Error querying database. Cause ...

  3. PHP利用GD库处理图片方法实现

    这里写的是完成每个功能的函数,可以复制单个函数直接使用,这里的每个函数都是另外一篇PHP常用类------图片处理类Image当中的方法进行细化,可以参考一下 废话不多说,直接付代码吧! 添加水印(文 ...

  4. docker container can not connect internet

    https://stackoverflow.com/questions/23810845/i-cant-get-docker-containers-to-access-the-internet htt ...

  5. Wshshell 脚本简单学习

    WshShell 的简单语法 学习 同事给了一个脚本自动执行  部署命令 感觉挺好的 , 年前一直说要学习一下 但是一直没有学习(自己太懒了) 这次简单总结一下. 创建对象: Set WshShell ...

  6. number (1)eclipse 连接数据库报错 数据库信息不对导致的出错

  7. mysql理论结合实际篇(一)

    最近两天做需求,是要将退款和退货报表里使用的临时表改用固定表, 自己建表时,如(只是举例): CREATE TABLE tasks ( task_id INT UNSIGNED NOT NULL AU ...

  8. 今天看到了一篇文档 app 测试内容记录下来

    1 APP测试基本流程 1.1流程图 1.2测试周期 测试周期可按项目的开发周期来确定测试时间,一般测试时间为两三周(即15个工作日),根据项目情况以及版本质量可适当缩短或延长测试时间.正式测试前先向 ...

  9. xhtml的3種文檔聲明類型

    xhtml有三種文檔聲明類型: strict:使用嚴格的標記,避免語法上的混亂: trasitional:為不支持的css的瀏覽器編寫xhtml時: frameset:利用框架將窗口分割為兩個部分或多 ...

  10. oftype 指的是集合的类型