首页 > 代码库 > Log4J 使用实战
Log4J 使用实战
前言:
日志在开发和服务中扮演重要的角色, 有人用来追查/分析问题, 有人通过日志, 来记录重要的信息. 日志是数据分析和统计最重要的数据来源. 在Java领域, Log4j日志框架成为java开发人员的首选. 本文对Log4j作个总结, 权当作自己对log4j的一个学习笔记.
基本样例:
让我们先写个Java程序, 对Log4J的使用有个初步的印象.
示例代码如下所示:
public class Log4JExample { public static void main(String[] args) { // *) 配置Log4j的属性 PropertyConfigurator.configure("log4j.properties"); // *) 获取Logger对象 Logger logger = Logger.getLogger("example"); // *) 记录并输出日志信息 logger.info("log4j example"); }}
评注: 先载入Log4j的配置文件, 并进行初始化工具, 然后构建logger对象, 并通过该对象进行日志记录
log4j.properties的配置文件如下:
log4j.rootLogger=DEBUG,CONSOLE log4j.addivity.org.apache=true################### # Console Appender ################### log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender log4j.appender.Threshold=DEBUGlog4j.appender.CONSOLE.Target=System.out log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout log4j.appender.CONSOLE.layout.ConversionPattern=[%p] [%d] [%F:%L] %m%n
评注: 这边配置根logger, 同时设置了CONSOLE(appender实例)的类和日志格式布局属性
运行该程序, 输出结果如下所示:
[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
log4j.rootLogger = [level], appenderName, appenderName,...
评注: level为日志级别, appenderName为后续appender实例的名称
2. 配置日志信息输出目的地Appender
log4j.appender.appenderName = fully.qualified.name.of.appender.classlog4j.appender.appenderName.option1 = value1...log4j.appender.appenderName.option = valueN
其中,Log4j提供的常用appender有以下几种:
org.apache.log4j.ConsoleAppender: Consoleorg.apache.log4j.FileAppender: Fileorg.apache.log4j.DailyRollingFileAppender: 每天产生一个日志文件org.apache.log4j.RollingFileAppender: 文件大小到达指定尺寸的时候产生一个新的文件org.apache.log4j.WriterAppender: 将日志信息以流格式发送到任意指定的地方org.apache.log4j.jdbc.JDBCAppender:通过JDBC把日志信息输出到数据库中
3. 配置日志信息的布局格式
log4j.appender.appenderName.layout = fully.qualified.name.of.layout.classlog4j.appender.appenderName.layout.option1 = value1...log4j.appender.appenderName.layout.option = valueN
Log4j提供的日志输出格式Layout有以下几种:
org.apache.log4j.HTMLLayout: 以HTML表格形式布局org.apache.log4j.PatternLayout: 可以灵活地指定布局模式org.apache.log4j.SimpleLayout: 包含日志信息的级别和信息字符串org.apache.log4j.TTCCLayout: 包含日志产生的时间,线程,类别等等信息
Log4J采用类似C语言中的printf函数的打印格式格式化日志信息, 具体的参数如下:
%m 输出代码中指定的消息%p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL %r 输出自应用启动到输出该log信息耗费的毫秒数 %c 输出所属的类目,通常就是所在类的全名 %t 输出产生该日志事件的线程名 %n 输出一个回车换行符,Windows平台为“/r/n”,Unix平台为“/n” %d 输出日志时间点的日期或时间, 默认格式为ISO8601, 也可以在其后指定格式, 比如:%d{yyy MMM dd HH:mm:ss, SSS}, 输出类似: 2014-09-01 22:10:28,921 %l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Log4JSample.main(Log4JSample.java: 10)
评注: 以上是常用的格式化参数, 更详细的参数详见该篇博文.
至于XML的Log4J配置文件, 我们简单来看一下:
<?xml version="1.0" encoding="GBK" ?><!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"><log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> <!-- 配置Appender对象, 并设置Layout布局 --> <appender name="default" class="org.apache.log4j.DailyRollingFileAppender"> <param name="file" value="http://www.mamicode.com/logs/ask.log" /> <param name="append" value="http://www.mamicode.com/true" /> <param name="encoding" value="http://www.mamicode.com/UTF-8" /> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="http://www.mamicode.com/%d - %m%n" /> </layout> </appender> <!-- 配置RootLogger--> <root> <level value="http://www.mamicode.com/info" /> <appender-ref ref="default" /> </root></log4j:configuration>
评注: xml的文件配置方式比properties文件更加规范, 但是不如properties文件配置方便和灵活.
Log4j和SLF4J的集成
SLF4J,即简单日志门面(Simple Logging Facade for Java), 不是具体的日志解决方案, 它只服务于各种各样的日志系统. 其需要最终的日志解决方案来实现. 使用SLF4J可以方便于在各个日志库间进行切换, 这边我们讲述下Log4J和SLF4J集成的方案.
首先我们配置下Maven的依赖关系:
<dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version></dependency><dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.5</version></dependency><dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.5</version></dependency>
在java代码中, 直接使用Log4j的代码如下:
import org.apache.log4j.Logger;Logger logger = Logger.getLogger("example");
现在借助SLF4J, 则获取Logger的方式如下所示:
import org.slf4j.Logger;import org.slf4j.LoggerFactory;Logger logger = LoggerFactory.getLogger("example");
评注: 只是简单改变了Logger的获取方式, 其实函数接口一切如旧.
Log4J的配置:
Log4J的环境初始化, 非常的重要, 用户可以指定具体的文件位置以及初始化方式.
如下是Log4J提供的三种初始化方式:
BasicConfigurator.configure(): 自动快速地使用缺省Log4j环境PropertyConfigurator.configure(String configFilename): 读取使用Java的特性文件编写的配置文件DOMConfigurator.configure(String filename): 读取XML形式的配置文件
后记:
感觉有些琐碎, 但至少把Log4J的涉及的概念过了一遍, 权当学习笔记了.
Log4J 使用实战