【Z13区】《Log4net写出适合自己的日志类》第二篇【没有理论的实践是盲目】

第一篇中,已经真刀实枪用log4net干过了一次。也是希望大家能先感受到什么是log4net。但是只没有理论的实践肯定是盲目的,所以这一篇,

咱们好好谈谈log4net的配置等其他信息



log4net来源

    log4net是Apache软件基金会Apache Logging Services工程的一部分。Apache日志服务工程致力于为程序调试和审计提供跨语言的日志服务。

详细说明,源码下载 可以参考官网:http://logging.apache.org/log4net/

Apache Logging Services工程其他项目:http://logging.apache.org/

log4net能干哪些活?

    一个项目无论多么nb,要是我们用不着,那基本和我们无关。所以你要用它之前,得知道他能干哪些活。

首先log4net是用来写日志的。主要特性如下:

  • log4net 可实现速度优化。
  • log4net 基于已命名日志记录器层次结构。
  • log4net 是失败即停,但没有依懒性。
  • log4net 是线程安全的。
  • log4net 并不限于一组预定义的设施。可以在运行时使用一个配置文件设置日志记录行为。配置文件是 XML 格式。
  • log4net 被设计来处理从一开始的异常。
  • log4net 可以其输出定向到许多汇包括: 文件、 控制台、 windows事件日志或电子邮件。
  • log4net 分类分为级别的日志记录: DEBUG, INFO, WARN, ERROR and FATAL.。
    日志输出的格式可以通过实现一个新的布局类很容易改变。 通过编写一个新的附加类可改变的日志输出,以及写作策略目标。
  • log4net 支持多个输出附加目的地每记录器。

主要作用我已经标记背景色,它还可以将日志输出到数据库中【Sqlserver、Access, Oracle、DB2,SQLite】

以上的特性和log4net日志能输出位置,我相信在我们编程中,基本都能满足写日志的需求了。

它还有个特性,就是学习成本也低。   在第一篇中,我们也看到了,只需要一个log4net.dll和配置文件一份,就可以直接输出日志了。

那么接下来,我们分析下配置文件的具体作用。

log4net结构和配置文件分析

    ps:配置文件可以自定义文件名,也可以写在程序自带的app.config/web.config。



 主要结构:

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

作用分析:

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

 Repository(库):主要用于负责日志对象组织结构的维护。

Appender(附着器):  定义输出介质。例如:输出到文件、控制台、数据库、windows事件日志、电子邮件等。

 Layout(布局):格式化日志信息。例如:你想做日志信息中增加当前时间,log4net都有字符代替。[较抽象,看后面具体操作即可]



 配置文件:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="log4net" type="System.Configuration.IgnoreSectionHandler"/>
  </configSections>
  <log4net>
      <!--appender节点的name可以自定义,但是root节点下的appender-ref节点的ref属性必须对应apperder的name-->    <!--appender节点和apperder-ref节点应该一一对应-->
    <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
        </layout>
    </appender>
    <root>
      <!--====控制台控制显示日志====-->
     <appender-ref ref="ConsoleAppender" />
    </root>
  </log4net>
</configuration>

上面的配置我们主要关注appender节点和root节点。其余节点节本暂时不用管。

apperder(附着器):type属性决定日志输出的具体位置。

AdoNetAppender:针对数据库输出(MS SQL Server,MS Access,Oracle9i,Oracle8i,IBM DB2,SQLite)
AspNetTraceAppender:在AspNetTraceAppender记录消息
BufferingForwardingAppender:缓冲消息,然后输出到apperder
ColoredConsoleAppender:将消息发送到控制台,可以设置背景、字体颜色
ConsoleAppender:将消息发送到控制台
EventLogAppender:将消息发送到应用程序的事件中
FileAppender:将日志写入文件中
ForwardingAppender:详细看官网说明。
ManagedColoredConsoleAppender:可以用来突出显示错误消息
MemoryAppender:内存流附着器
NetSendAppender:详细看官网说明
OutputDebugStringAppender:将日志写入OutputDebugString API
RemotingAppender:将日志传递给remoting
RollingFileAppender:以FileAppender为基础,可以设置按时间或大小重新覆盖日志。
SmtpAppender:通过smtp电子邮件发送日志
SmtpPickupDirAppender:类似smtp,详细可以看官网说明。
TraceAppender:将日志写入.net 基类库提供的跟踪系统(System.Diagnostics.Trace )
UdpAppender:发送到RemoteAddress 上指定 RemotePort。
DynamicPatternLayout:详细看官网说明。

apperder类型

以上都是我的概括,有些不好概括的,就没有写,怕误导大家。

大家也可以参考官网说明(有具体的配置信息) http://logging.apache.org/log4net/release/config-examples.html

如果有概括的更好的,也希望和我分享:z13qu#sina.com



接下来分析下特殊字符:

在apperder的layout下的conversionPattern 中,可以发现有很多你并不太明白的字符

"%date [%thread]"让我们来具体看看它们的意思:

%m(message):日志具体内容(第一篇中写的  consoleLoger.Info("这是一行日志");  "这是一行日志"就是%m的内容)

%n(new line):换行

%d(datetime):输出当前语句运行的时刻

%r(run time):输出程序从运行到执行到当前语句时消耗的毫秒数

%t(thread id):当前语句所在的线程ID

%p(priority): 日志的当前优先级别,即DEBUG、INFO、WARN…等

%c(class):当前日志对象的名称

%L:输出语句所在的行号

%F:输出语句所在的文件名

%-数字:表示该项的最小长度,如果不够,则用空格填充

想在回过头来看第一篇的配置文件和输出内容,是否能看明白了呢?

这一篇基本了解了大部分的理论和配置。下一篇,开始通过源码来讲解具体的使用过程。我也会将大部分的注释写在源码中。希望在实践操作中,感受到最真实的log4net。
时间: 2024-10-03 00:39:56

【Z13区】《Log4net写出适合自己的日志类》第二篇【没有理论的实践是盲目】的相关文章

【Z13区】《Log4net写出适合自己的日志类》第三篇【终】【怎样让它适合你自己需求】

第一篇   用特别简单的实例打开log4net的体验之门. 第二篇   用理论,让我们了解那些配置文件的意义所在,让我们回过头看懂了第一篇写的配置文件,和输出内容的格式. 本篇中,[由于大量代码和文字叙述,很容易忽略一些重要信息,所以本篇基本以源代码为中心,简单在博客中讲解重点步骤] 我将直接公布一份源码[包括大部分的常用apperder配置],如果大家看了前两篇. 基本也能看懂源码内容了[源码中会有大量备注]. GITHUB地址:https://github.com/tanshanli/Z13

【Z13区】《Log4net写出适合自己的日志类》第一篇

我想先知道为什么要用log4net写日志类 1.上来就是干,先实践后理论 a.创建控制台应用

【原创】怎样才能写出优雅的 Java 代码?这篇文章告诉你答案!

本文已经收录自 JavaGuide (59k+ Star):[Java学习+面试指南] 一份涵盖大部分Java程序员所需要掌握的核心知识. 本文比较简短,基本就是推荐一些对于写好代码非常有用的文章或者资源.讲真的,下面推荐的文章或者资源强烈建议阅读 3 遍以上. 团队 阿里巴巴Java开发手册(详尽版) https://github.com/alibaba/p3c/blob/master/阿里巴巴Java开发手册(华山版).pdf Google Java编程风格指南: http://hawste

【小飞牛】记忆留住深刻过往,博客写出平淡事迹【博客首篇】

在记忆的长河中检索,很多知识早已模糊不清:很多事物,早已烟消云散.在曾经流逝的时间里面,自己有过对新知识掌握的喜悦, 有对新事物认知的感动.而如今,那些曾经有的还是没有得,都得靠搜索引擎来解决的时候.我发现自己貌似开始迷失了. 即使知道自己没有惟妙惟肖得文笔,也没有绘声绘色的言语.但是也不能阻止记下曾经学习过的一切. 不求给别人带来什么,至少能够给自己留下些什么. 欢迎有朋友加微信公众号[小飞牛]交流. 编程没改变世界的时候,先改变了你我. 我也希望自己学到的,能和大家一起分享.

? 按照所给的程序流程图,写出Java代码(用类和方法实现)

代码为:package com.lwk.test2; 主类: import java.util.Scanner; package com.lwk.test2; public class Demo { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Test test = new Test(); test.test(); } } 方法类: package

按照所给的程序流程图,分别写出语句覆盖、分支覆盖的测试用例,以及它所覆盖的路径,根据程序流程图,写出代码,用JUnit生成单元测试,并利用前面设计的测试用例进行测试。

语句覆盖:路径:abc ,测试用例:x=3,y=2 分支覆盖:路径:aeg ,测试用例:x=4,y=-1 /** * 2016-04-09 * @author 吴思婷 * DoWork类用来根据程序流程图,写出代码(定义一个类和方法来实现) */ public class DoWork { public void doWork(int x,int y){ int k=0,j=0; if((x<4 || y>0)&&(y>1)){ y=y+1; } else { if(x&

写代码的指导思想:如何写出易测、清晰、健壮的牢固代码

背景 写出 BUG 不算糟糕,给人埋坑,让别人写出 BUG ,耗时耗力才更令人讨厌.要想不写出 BUG, 不埋坑,需要用心写出 "易测.清晰.健壮" 的牢固的代码.95% 的代码,能做到这一点,就可以保证几乎无问题了:3%的代码能做到"可复用.可扩展",善莫大焉! 本文结合之前的经历和案例,探讨如何写出"易测.清晰.健壮"的代码. 代码三性 代码的基本标准是:易测.清晰.健壮. 易测 易测,是说代码容易测试.写代码的第一思想是:不要对代码过于自信

如何写出更好的Java代码

Java是最流行的编程语言之一,但似乎并没有人喜欢使用它.好吧,实际上Java是一门还不错的编程语言,由于最近Java 8发布了,我决定来编辑一个如何能更好地使用Java的列表,这里面包括一些库,实践技巧以及工具. 这篇文章在GitHub上也有.你可以随时在上面贡献或者添加你自己的Java使用技巧或者最佳实践. 编码风格 结构体 builder模式 依赖注入 避免null值 不可变 避免过多的工具类 格式 文档 Stream 部署 框架 Maven 依赖收敛 持续集成 Maven仓储 配置管理

如何写出优雅的CSS代码 ?(转)

对于同样的项目或者是一个网页,尽管最终每个前端开发工程师都可以实现相同的效果,但是他们所写的代码一定是不同的.有的优雅,看起来清晰易懂,代码具有可拓展性,这样的代码有利于团队合作和后期的维护:而有的混乱,虽然表达出了最终的效果,然而却晦涩难懂,显然团队成员在读这样的代码时就显得无从下手,更不利于后期的维护了.那么如何写出优雅的代码呢?下面我将以一个很小的项目就以下几个方面简单的表达一下自己的看法,如有不妥,望批评指正. 如何整理一个项目. 如何写出清晰易懂的HTML代码. 如何写出优雅的css代