Log4net学习系列(一)——Log4net的基础知识学习

  今天把Log4net日志记录做了封装,作为一个公共的类库。记录一下应该注意的地方。先了解一下log4net的理论知识。

  参考百度百科

一、log4net是什么?  

  log4net库是Apache log4j框架在Microsoft .NET平台的实现,是一个帮助程序员将日志信息输出到各种目标(控制台、文件、数据库等)的工具。 log4net是Apache软件基金会Apache Logging Services工程的一部分。Apache日志服务工程致力于为程序调试和审计提供跨语言的日志服务。

二、log4net特征

  • 支持多数框架
  • 可输出日志到多种目标
  • 层级日志体系
  • 可使用XML配置
  • 可动态配置
  • 记录上下文信息
  • 被检验过的体系
  • 模块化和可扩展化设计
  • 灵活、高性能

三、Log4Net的结构

  Log4Net有四种主要的组件,分别是Logger(记录器),Repository(库),Appender(附着器),以及 Layout(布局)。

  1、Logger记录器

    (1)Logger记录器:Logger是应用程序需要交互的主要组件,它用来产生日志消息。产生的日志消息并不直接显示,还要预先经过Layout的格式化处理后才会输出。

  Logger提供了多种方式来记录一个日志消息,你可以在你的应用程序里创建多个Logger,每个实例化的Logger对象都被log4net框架作为命名实体(named entity)来维护。这意味着为了重用Logger对象,你不必将它在不同的类或对象间传递,只需要用它的名字为参数调用就可以了。log4net框架使用继承体系,继承体系类似于.NET中的名字空间。也就是说,如果有两个logger,分别被定义为a.b.c和a.b,那么我们说a.b是a.b.c的祖先。每一个logger都继承了祖先的属性。Log4net框架定义了一个ILog接口,所有的logger类都必须实现这个接口。如果你想实现一个自定义的logger,你必须首先实现这个接口。Log4Net框架定义了一个叫做LogManager的类,用来管理所有的logger对象。它有一个GetLogger()静态方法,用我们提供的名字参数来检索已经存在的Logger对象。如果框架里不存在该Logger对象,它也会为我们创建一个Logger对象。

    (2)日志的级别:ERROR、DEBUG、WARN、INFO、FATAL

  2、Repository库

    Repository主要用于负责日志对象组织结构的维护。在log4net的以前版本中,框架仅支持分等级的组织结构(hierarchical organization)。这种等级结构本质上是库的一个实现,并且定义在log4net.Repository.Hierarchy 名字空间中。要实现一个Repository,需要实现log4net.Repository.ILoggerRepository 接口。但是通常并不是直接实现该接口,而是以log4net.Repository.LoggerRepositorySkeleton为基类继承。体系库 (hierarchical repository )则由log4net.Repository.Hierarchy.Hierarchy类实现。如果你是个log4net框架的使用者,而非扩展者,那么你几乎不会在你的代码里用到Repository的类。相反的,你需要用到LogManager类来自动管理库和日志对象。

  3、Log4Net Appender(附着器)

    一个好的日志框架应该能够产生多目的地的输出。比如说输出到控制台或保存到一个日志文件。log4net 能够很好的满足这些要求。它使用一个叫做Appender的组件来定义输出介质。正如名字所示,这些组件把它们附加到Logger日志组件上并将输出传递到输出流中。你可以把多个Appender组件附加到一个日志对象上。 

    Appender和root经常搭配使用

    appender:决定日志输出的方式(可设置多个节点,如对INFO,ERROR等设置不同的输出方式)。

    主要包括已下几种:

    1 AnsiColorTerminalAppender:在ANSI 窗口终端写下高亮度的日志事件。
    2 AspNetTraceAppender:能用asp.net中Trace的方式查看记录的日志。
    3 BufferingForwardingAppender:在输出到子Appenders之前先缓存日志事件。
    4 ConsoleAppender:将日志输出到控制台。
    5 EventLogAppender:将日志写到Windows Event Log. 
    6 FileAppender:将日志写到文件中。
    7 LocalSyslogAppender:将日志写到local syslog service (仅用于UNIX环境下). 
    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的形式广播。

    从上面提供的方式中可以看出能输出文件、控制台、Windows事件日志和数据库。这个可根据实际情况选择。    

<appender name="Log4Net_INFO" type="log4net.Appender.RollingFileAppender">
...
</appender>

    这里配置的name(“Log4Net_INFO”)会在定义日志的输出媒介中使用到。name可任意设置。

    root的配置说明 。

    root:对设置输出的方式进行指定。

<root>
    <!--批定DEBUG输出的文件形式记录日志-->
    <level value="DEBUG"/>
    <appender-ref ref="Log4Net_ERROR" />

  <!--批定INFO输出的文件形式记录日志-->
    <level value="INFO"/>
    <appender-ref ref="Log4Net_INFO" />
</root>

  4、Appender Filters过滤器
    一个Appender对象缺省地将所有的日志事件传递到输出流。Appender的过滤器(Appender Filters) 可以按照不同的标准过滤日志事件。在log4net.Filter的名字空间下已经有几个预定义的过滤器。使用这些过滤器,你可以按照日志级别范围过滤日志事件,或者按照某个特殊的字符串进行过滤。  

    过滤器通常有以下几种:

    • DenyAllFilter 阻止所有的日志事件被记录
    • LevelMatchFilter 只有指定等级的日志事件才被记录
    • LevelRangeFilter 日志等级在指定范围内的事件才被记录
    • LoggerMatchFilter 与Logger名称匹配,才记录
    • PropertyFilter 消息匹配指定的属性值时才被记录
    • StringMathFilter 消息匹配指定的字符串才被记录

  5、Layout布局

    Layout 组件用于向用户显示最后经过格式化的输出信息。输出信息可以以多种格式显示,主要依赖于我们采用的Layout组件类型。可以是线性的或一个XML文件。Layout组件和一个Appender组件一起工作。API帮助手册中有关于不同Layout组件的列表。一个Appender对象,只能对应一个Layout对象。要实现你自己的Layout类,你需要从log4net.Layout.LayoutSkeleton类继承,它实现了ILayout接口。

  一个Appender只能有一个Layout。

  最常用的Layout应该是经典格式的PatternLayout,其次是SimpleLayout,RawTimeStampLayout和ExceptionLayout。然后还有IRawLayout,XMLLayout等几个,使用较少。Layout可以自己实现,需要从log4net.Layout.LayoutSkeleton类继承,来输出一些特殊需要的格式,在后面扩展时就重新实现了一个Layout。

    • SimpleLayout简单输出格式,只输出日志级别与消息内容。
    • RawTimeStampLayout 用来格式化时间,在向数据库输出时会用到。样式如“yyyy-MM-dd HH:mm:ss“
    • ExceptionLayout需要给Logger的方法传入Exception对象作为参数才起作用,否则就什么也不输出。输出的时候会包含Message和Trace。
    • PatterLayout使用最多的一个Layout,能输出的信息很多

四、简单的Log4Net.config配置及说明

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <!--添加自定义节点:log4net  type:解析类名,程序集名(log4net.dll)-->
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
  </configSections>

  <log4net>
    <!--定义输出到文件中-->
    <appender name="Log4Net_INFO" type="log4net.Appender.RollingFileAppender">
      <!--定义文件存放位置-->
      <file value="C:/log4net/"/>
      <!--是否追加到文件,默认为true,通常无需设置-->
      <appendToFile value="true"/>
      <RollingStyle value="Date"/>
      <!--日期的格式,每天换一个文件记录,如不设置则永远只记录一天的日志,需设置-->
      <DatePattern value="INFO_yyyyMMdd&quot;.log&quot;" />
      <!--日志文件名是否为静态-->
      <StaticLogFileName value="false"/>
      <!--多线程时采用最小锁定-->
      <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
      <!--布局(向用户显示最后经过格式化的输出信息)-->
      <layout type="log4net.Layout.PatternLayout">
        <!--
           %m(message):输出的日志消息,如ILog.Debug(…)输出的一条消息
           %n(new line):换行
           %d(datetime):输出当前语句运行的时刻
           %r(run time):输出程序从运行到执行到当前语句时消耗的毫秒数
           %t(thread id):当前语句所在的线程ID
           %p(priority): 日志的当前优先级别,即DEBUG、INFO、WARN…等
           %c(class):当前日志对象的名称,例如:
           %L:输出语句所在的行号
           %F:输出语句所在的文件名
           %-数字:表示该项的最小长度,如果不够,则用空格填充
          -->
        <Header value="[Header]
"/>
        <Footer value="[Footer]
"/>
        <!--正文-->
        <ConversionPattern value="记录时间:%date 线程ID:[%thread] 日志级别:%-5level 出错类:%logger property:[%property{NDC}] - 错误描述:%message%newline"  />
      </layout>
    </appender>

    <appender name="Log4Net_ERROR" type="log4net.Appender.RollingFileAppender">
      <file value="C:/log4net/"/>
      <appendToFile value="true"/>
      <RollingStyle value="Date"/>
      <DatePattern value="ERROR_yyyyMMdd&quot;.log&quot;" />
      <StaticLogFileName value="false"/>
      <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
      <layout type="log4net.Layout.PatternLayout">
        <Header value="[Header]
"/>
        <Footer value="[Footer]
"/>
        <!--正文-->
        <ConversionPattern value="记录时间:%date 线程ID:[%thread] 日志级别:%-5level 出错类:%logger property:[%property{NDC}] - 错误描述:%message%newline"  />
      </layout>
    </appender>

    <root>
      <level value="DEBUG"/>
      <appender-ref ref="Log4Net_ERROR" />

      <level value="INFO"/>
      <appender-ref ref="Log4Net_INFO" />
    </root>

  </log4net>

</configuration>

原文地址:https://www.cnblogs.com/qtiger/p/9936673.html

时间: 2024-10-03 15:48:53

Log4net学习系列(一)——Log4net的基础知识学习的相关文章

Python学习系列(二)(基础知识)

Python基础语法 Python学习系列(一)(基础入门) 对于任何一门语言的学习,学语法是最枯燥无味的,但又不得不学,基础概念较繁琐,本文将不多涉及概念解释,用例子进行相关解析,适当与C语言对比,避免陷入语法的苦海.我认为初学者学习语法的目标是学会使用即可,关于对概念的深入理解,剖析,没有一定的知识积累是很难做到的. 学习Python,基本语法不是特别难,有了C的基本知识,理解比较容易.本文的主要内容是Python基础语法,学完后,能熟练使用就好.(开发环境依然是Python2.7,简单使用

oracle学习入门系列之二 数据库基础知识

oracle学习入门系列之二 数据库基础知识 本篇蛤蟆要梳理下那些被淡忘的数据库基础知识,也许根本就没被人记住过.不管是哪种情况,该记住的必须记住,记不住就把他记下来吧. 首先问几个问题如下: 数据库基础知识是什么? 好吧,蛤蟆直接吐后而不亡,看目录开始吧. 本人邮箱:[email protected] 微信公众号:HopToad 欢迎各界交流 1      基本概念 概念就是概念,大伙对这些名词不要死磕,但是对定义一定要理解,理解方能领悟,领悟方能运用自如后创新. 1.1      数据 数据

Python学习系列(一)(基础入门)

Python入门 本系列为Python学习相关笔记整理所得,IT人,多学无害,多多探索,激发学习兴趣,开拓思维,不求高大上,只求懂点皮毛,作为知识储备,不至于落后太远.如果兴趣学习者,推荐一个基础视频:http://edu.51cto.com/lesson/id-11637.html 本文主要介绍Python的相关背景,环境搭建. 一.了解Python 1,关于Python的语言特点: 借用Python官网Https://www.python.org的解释: Python is powerful

ARM基础知识学习笔记

/*****************数电知识*******************/ PN结(Positive-Negative) 三极管:BJT(双极结型三极管Bipolar Junction Transistor)               FET(场效应管Field Effect Transistor)          (单极结型) 1.MOSFET (金属氧化物半导体Metal Oxide Semiconductor FET)               2.JFET(结型Junct

学习 shell脚本之前的基础知识

转载自:http://www.92csz.com/study/linux/12.htm  学习 shell脚本之前的基础知识 日常的linux系统管理工作中必不可少的就是shell脚本,如果不会写shell脚本,那么你就不算一个合格的管理员.目前很多单位在招聘linux系统管理员时,shell脚本的编写是必考的项目.有的单位甚至用shell脚本的编写能力来衡量这个linux系统管理员的经验是否丰富.笔者讲这些的目的只有一个,那就是让你认真对待shell脚本,从一开始就要把基础知识掌握牢固,然后要

计算机基础知识学习

第一周学习 一.知识方面,总得来说,就是学习计算机基础知识. 1.从计算机的发展,应用,组成,网络等方面了解: 2.对计算机操作系统的学习:常用的操作系统,操作系统的功能.分类: 3.办公软件的学习:Word\Excel\ppt,像Word中编号格式.自动生成目录,Excel中条件格式的应用,图表插入,以及各种基础函数的使用: =SUM(Eoo*$E$3,Foo*$F$3,Goo*$G$3)  表示:用E\F\G列的各数与E3\F3\G3相乘后求和,count(if)\a 计数函数, =COUN

考试备战系列--软考--02基础知识复习

这部分主要是计算机基础知识的概念介绍,相关系列文章如下所示. 考试备战系列--软考--01基础架构概念 考试备战系列--软考--02基础知识复习 考试备战系列--软考--03综合知识复习 考试备战系列--软考--04考题收集 考试备战系列--软考--05案例收集 考试备战系列--软考--06论文准备 操作系统时计算机系统的核心系统软件,其他软件均建立在其上,其分类包括:单用户操作系统和批处理操作系统.分时操作系统和实时操作系统.网络操作系统和分布式操作系统.嵌入式操作系统.其4大特征为并发性.共

加壳学习笔记(一)-基础知识

1.预备知识 1.关于栈,在windows里面的堆栈其实很简单,当学了才知道哈,呵呵,第一要记住的是windows里面的栈是向低地址生长的(extended,延伸,呵呵,顺便丰富下英语的单词量,确实是少的可怜),你可以这样认为,栈就像是一个倒立的箱子,箱子的口子是向下的,底是向上的,这里就表明了系统栈的分布也是延伸方向是由高地址向低地址extended,在最初的空栈阶段,栈顶(extended stack pointer,简称是esp)在栈底的低一个位置,呵呵,其实很好理解,就是说最初的箱子是空

C++基础知识学习笔记

基本语法 C面向过程思想:程序=(数据结构)+(算法) 数据结构与算法分离,以算法(函数)为主. C++面向对象思想:程序=(数据结构+算法) 数据结构(属性)与算法(操作)绑成一个类,定义一个个对象对象=(数据结构+算法)  ,程序=(对象+对象+对象+--) 面向对象程序设计的程序员有两类:1.面向对象应用程序设计2.类库的设计 头文件:类的声明            ---类的外部接口       (成员函数在类声明中实现时,一般很简短,默认为内联函数)源文件:类的成员函数定义     -

linux基础知识学习-linux架构

硬盘分区: 第一扇区(512bytes): MSR:master boot record (446bytes)主引导分区 partion table:(64bytes)分区表,四个.可以是主分区(primary)或者扩展分区(Extended), 每个表指向磁盘某段区间.最多只有一个扩展分区,扩展分区里面可以扩展多个逻辑分区.其余扇区(柱面(cylinder)):实际存储的地方 linux 中(\etc/fstab):IDE  总线形式不同 (a~d)/dev/hda SATA,SCSI,USB