前言:
  日志在开发和服务中扮演重要的角色, 有人用来追查/分析问题, 有人通过日志, 来记录重要的信息. 日志是数据分析和统计最重要的数据来源. 在Java领域, Log4j日志框架成为java开发人员的首选. 本文对Log4j作个总结, 权当作自己对log4j的一个学习笔记.

基本样例:
  让我们先写个Java程序, 对Log4J的使用有个初步的印象.
  示例代码如下所示:

  1. public class Log4JExample {
  2.   public static void main(String[] args) {
  3.     // *) 配置Log4j的属性
  4.     PropertyConfigurator.configure("log4j.properties");
  5.     // *) 获取Logger对象
  6.     Logger logger = Logger.getLogger("example");
  7.     // *) 记录并输出日志信息
  8.     logger.info("log4j example");
  9.   }
  10. }

  评注: 先载入Log4j的配置文件, 并进行初始化工具, 然后构建logger对象, 并通过该对象进行日志记录
  log4j.properties的配置文件如下:

  1. log4j.rootLogger=DEBUG,CONSOLE
  2. log4j.addivity.org.apache=true
  3. ###################
  4. # Console Appender
  5. ###################
  6. log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
  7. log4j.appender.Threshold=DEBUG
  8. log4j.appender.CONSOLE.Target=System.out
  9. log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
  10. log4j.appender.CONSOLE.layout.ConversionPattern=[%p] [%d] [%F:%L] %m%n

  评注: 这边配置根logger, 同时设置了CONSOLE(appender实例)的类和日志格式布局属性
  运行该程序, 输出结果如下所示:

  1. [INFO] [2014-09-01 11:12:18,619] [Log4JExample.java:17] log4j example

  整个Log4j的使用, 非常的简单, 体验也非常的好, 下面我们来慢慢解读它.

Log4j的类体系:
  Log4J由三个重要的概念构成:日志信息的优先级,日志信息的输出目的地,日志信息的输出格式.
  Log4J的类体系划分的相当漂亮, Logger/Appender/Layout类各司其职, 其职责划分类似MVC设计模式(Web开发经典设计模式).

  评注: Logger扮演了Controller的角色, 负责串联appender和日志级别. Appender相当于Model, 用于指定日志输出地. Layout则是扮演View的角色, 用于渲染日志格式.
  1). Logger: 日志写出器,供程序员输出日志信息
  2). Appender: 日志目的地,把格式化好的日志信息输出到指定的地方去
    ConsoleAppender: 目的地为控制台的Appender
    FileAppender: 目的地为文件的Appender
    RollingFileAppender: 目的地为大小受限的文件的Appender
  3). Layout: 日志格式化器,用来把程序员的logging request格式化成字符串
    PatternLayout: 用指定的pattern格式化logging request的Layout

Log4j的日志级别:
  每个Logger都可以设置自己的日志级别, Log4J的日志级别如下所示:
  OFF: 最高等级, 用于关闭所有日志记录.
  FATAL: 指出每个严重的错误事件将会导致应用程序的退出.
  ERROR: 指出虽然发生错误事件, 但仍然不影响系统的继续运行.
  WARN: 表明会出现潜在的错误情形.
  INFO: 一般和在粗粒度级别上, 强调应用程序的运行全程.
  DEBUG: 一般用于细粒度级别上, 对调试应用程序非常有帮助.
  ALL: 最低等级, 用于打开所有日志记录.

常见配置项:
  Log4j有两种方式去配置日志属性, 一种通过Key/Value的Properties文件去实现, 另一种是通过XML文件来实现. 我们先来谈下Properties文件的配置属性.
  1. 配置根Logger

  1. log4j.rootLogger = [level], appenderName, appenderName,...

  评注: level为日志级别, appenderName为后续appender实例的名称
  2. 配置日志信息输出目的地Appender

  1. log4j.appender.appenderName = fully.qualified.name.of.appender.class
  2. log4j.appender.appenderName.option1 = value1
  3. ...
  4. log4j.appender.appenderName.option = valueN

  其中,Log4j提供的常用appender有以下几种:

  1. org.apache.log4j.ConsoleAppender: Console
  2. org.apache.log4j.FileAppender: File
  3. org.apache.log4j.DailyRollingFileAppender: 每天产生一个日志文件
  4. org.apache.log4j.RollingFileAppender: 文件大小到达指定尺寸的时候产生一个新的文件
  5. org.apache.log4j.WriterAppender: 将日志信息以流格式发送到任意指定的地方
  6. org.apache.log4j.jdbc.JDBCAppender:通过JDBC把日志信息输出到数据库中

  3. 配置日志信息的布局格式

  1. log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
  2. log4j.appender.appenderName.layout.option1 = value1
  3. ...
  4. log4j.appender.appenderName.layout.option = valueN

  Log4j提供的日志输出格式Layout有以下几种:

  1. org.apache.log4j.HTMLLayout: HTML表格形式布局
  2. org.apache.log4j.PatternLayout: 可以灵活地指定布局模式
  3. org.apache.log4j.SimpleLayout: 包含日志信息的级别和信息字符串
  4. org.apache.log4j.TTCCLayout: 包含日志产生的时间,线程,类别等等信息

  Log4J采用类似C语言中的printf函数的打印格式格式化日志信息, 具体的参数如下:

  1. %m 输出代码中指定的消息
  2. %p 输出优先级,即DEBUGINFOWARNERRORFATAL
  3. %r 输出自应用启动到输出该log信息耗费的毫秒数
  4. %c 输出所属的类目,通常就是所在类的全名
  5. %t 输出产生该日志事件的线程名
  6. %n 输出一个回车换行符,Windows平台为“/r/n”,Unix平台为“/n
  7. %d 输出日志时间点的日期或时间, 默认格式为ISO8601, 也可以在其后指定格式, 比如:%d{yyy MMM dd HH:mm:ss, SSS}, 输出类似: 2014-09-01 22:10:28,921
  8. %l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Log4JSample.main(Log4JSample.java: 10)

  评注: 以上是常用的格式化参数, 更详细的参数详见该篇博文.

  至于XML的Log4J配置文件, 我们简单来看一下:

  1. <?xml version="1.0" encoding="GBK" ?>
  2. <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
  3. <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
  4.   <!-- 配置Appender对象, 并设置Layout布局 -->
  5.   <appender name="default" class="org.apache.log4j.DailyRollingFileAppender">
  6.     <param name="file" value="logs/ask.log" />
  7.     <param name="append" value="true" />
  8.     <param name="encoding" value="UTF-8" />
  9.     <layout class="org.apache.log4j.PatternLayout">
  10.       <param name="ConversionPattern" value="%d - %m%n" />
  11.     </layout>
  12.   </appender>
  13.   <!-- 配置RootLogger-->
  14.   <root>
  15.     <level value="info" />
  16.     <appender-ref ref="default" />
  17.   </root>
  18. </log4j:configuration>

  评注: xml的文件配置方式比properties文件更加规范, 但是不如properties文件配置方便和灵活.

Log4j和SLF4J的集成
  SLF4J,即简单日志门面(Simple Logging Facade for Java), 不是具体的日志解决方案, 它只服务于各种各样的日志系统. 其需要最终的日志解决方案来实现. 使用SLF4J可以方便于在各个日志库间进行切换, 这边我们讲述下Log4J和SLF4J集成的方案.
  首先我们配置下Maven的依赖关系:

  1. <dependency>
  2.   <groupId>log4j</groupId>
  3.   <artifactId>log4j</artifactId>
  4.   <version>1.2.17</version>
  5. </dependency>
  6. <dependency>
  7.   <groupId>org.slf4j</groupId>
  8.   <artifactId>slf4j-api</artifactId>
  9.   <version>1.7.5</version>
  10. </dependency>
  11. <dependency>
  12.   <groupId>org.slf4j</groupId>
  13.   <artifactId>slf4j-log4j12</artifactId>
  14.   <version>1.7.5</version>
  15. </dependency>

  在java代码中, 直接使用Log4j的代码如下:

  1. import org.apache.log4j.Logger;
  2. Logger logger = Logger.getLogger("example");

  现在借助SLF4J, 则获取Logger的方式如下所示:

  1. import org.slf4j.Logger;
  2. import org.slf4j.LoggerFactory;
  3. Logger logger = LoggerFactory.getLogger("example");

  评注: 只是简单改变了Logger的获取方式, 其实函数接口一切如旧.

Log4J的配置:
  Log4J的环境初始化, 非常的重要, 用户可以指定具体的文件位置以及初始化方式.
  如下是Log4J提供的三种初始化方式:

  1. BasicConfigurator.configure(): 自动快速地使用缺省Log4j环境
  2. PropertyConfigurator.configure(String configFilename): 读取使用Java的特性文件编写的配置文件
  3. DOMConfigurator.configure(String filename): 读取XML形式的配置文件

后记:
  感觉有些琐碎, 但至少把Log4J的涉及的概念过了一遍, 权当学习笔记了.

Log4J 使用实战的更多相关文章

  1. Log4j实战,依赖分析

    背景 在项目中经常被log4j的各种依赖冲突搞的焦头烂额,久病成良医啊,在这里记录一下我对log4j的理解与分析 log4j 与 log4j2 log4j2是log4j的升级版,二者互不兼容,据说lo ...

  2. JAVA - 优雅的记录日志(log4j实战篇)

    写在前面 项目开发中,记录错误日志有以下好处: 方便调试 便于发现系统运行过程中的错误 存储业务数据,便于后期分析 在java中,记录日志有很多种方式: 自己实现 自己写类,将日志数据,以io操作方式 ...

  3. 传统的log4j实战

    /** * */ package log4j; import org.apache.log4j.Logger; import org.apache.log4j.PropertyConfigurator ...

  4. 基于slf4j的log4j实战

    参考文档如下: http://blog.csdn.net/anialy/article/details/8529188 slf4j是接口,基于门面模式,可以实现log4j和logback 参考文档如下 ...

  5. JAVA - 优雅的记录日志(log4j实战篇) (转)

    写在前面 项目开发中,记录错误日志有以下好处: 方便调试 便于发现系统运行过程中的错误 存储业务数据,便于后期分析 在java中,记录日志有很多种方式: 自己实现 自己写类,将日志数据,以io操作方式 ...

  6. log4j详解与实战

    [转自] http://www.iteye.com/topic/378077 log4j是一个非常强大的log记录软件,下面我们就来看看在项目中如何使log4j. 首先当然是得到log4j的jar档, ...

  7. 日志分析利器elk与logback(log4j)实战

    https://blog.csdn.net/puhaiyang/article/details/69664891

  8. Spark入门实战系列--10.分布式内存文件系统Tachyon介绍及安装部署

    [注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .Tachyon介绍 1.1 Tachyon简介 随着实时计算的需求日益增多,分布式内存计算 ...

  9. 转载文档:Storm实战常见问题及解决方案

    该文档为实实在在的原创文档,转载请注明: http://blog.sina.com.cn/s/blog_8c243ea30101k0k1.html 类型 详细 备注 该文档是群里几个朋友在storm实 ...

随机推荐

  1. js基础之COOKIE

    一.COOKIE的封装函数 function setCookie(name,value,eDate){ var oDate = new Date(); oDate.setDate(oDate.getD ...

  2. ROS主题发布订阅

    节点是一个可执行程序,它连接到了ROS的网络系统中.我们将会创建一个发布者,也就是说话者节点,它将会持续的广播一个信息. 改变目录到之前所建立的那个包下: cd ~/catkin_ws/src/beg ...

  3. 详解centos用户&组权限&添加删除用户

    1.Linux用户操作系统 Linux操作系统是多用户多任务操作系统,包括用户账户和组账户两种: 细分用户账户(普通用户账户,超级用户账户)除了用户账户以为还有组账户所谓组账户就是用户账户的集合,ce ...

  4. new 动态分配数组空间

    (一)定义一个整数              int *p =new int;        int *p =new int(4); //赋初值4 (二)定义一个一维数组                ...

  5. IOS 中的KVO模式 观察者模式

    / // KvoObject.h // KVO // // Created by lin kang on 16/6/7. // Copyright © 2016年 lin kang. All righ ...

  6. 深入C#数据类型小部分第二章

    值类型和引用类型C#的值类型包括:结构体(数值类型,bool型,用户定义的结构体),枚举,可空类型. C#的引用类型包括:数组,用户定义的类.接口.委托,object,字符串. 数组的元素,不管是引用 ...

  7. mongo db 分享 ppt

    在公司内部的mongo db的ppt.初步进阶 http://files.cnblogs.com/files/yuhan-TB/mongoDB.pptx

  8. Office word excel电子表格在线编辑的实现方法

    Office xp之后的版本支持通过webdav协议(http的扩展)直接编辑服务器上的文件. IIS(6.0)支持webdav,这在IIS管理器的web服务扩展中可以看到.利用IIS作为webdav ...

  9. 使用copy来拷贝对象

    拷贝对象 您通过将 copy 消息发送给对象,以制作对象的副本. NSArray *myArray = [yourArray copy]; 要拷贝,接收对象的类必须遵守 NSCopying 协议.如果 ...

  10. OD调试程序3

    条件跳转指令的图片,作为以后的参考. 载入了reverses.eve程序,F8下去,发现一个跳转,调用了一个函数,致使程序结束.于是我们绕过它,参考上面的 跳转指令图片. 然后继续F8 又会发现一个跳 ...