Java日志管理:log4j、Commons-logging、slf4

1、log4j

  • 概述

log4j是Apache的一个开源项目,主要是用来做Java开发中的日志管理工作。主要是由三个重要组件构成的。可管理日志的优先级、输出目的地以及输出格式等。它的配置文件主要有XML和properties两种,当然,也可以在程序里配置,但实际开发中一般使用properties文件。

  • log4j的组件

1.1、日志信息的优先级(Level)

有7个日志级别:OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL,级别从做到有一次降低。

Off:关闭所有的日志记录

Fatal:记录严重的错误,并且会导致应用程序退出

Error:记录严重的错误,但不会影响程序的继续运行

Warn:记录警告

Info:记录程序中比较有意义的信息

Debug:记录程序中的细节信息

All:记录所有的日志

1.2、日志信息的输出目的地(Appender)

log4j可以把日志传送到控制台、文件、GUI组件、甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等。

常用的有以下几种:

org.apache.log4j.ConsoleAppender(控制台)
org.apache.log4j.FileAppender(文件)
org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)
org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生新文件)
org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
org.apache.log4j.jdbc.JDBCAppender(将日志信息写到数据库里)

1.3、日志信息的输出格式(Layout)

输出格式主要有下边几种:

org.apache.log4j.HTMLLayout(HTML表格形式)
org.apache.log4j.PatternLayout(通过表达式指定格式)
org.apache.log4j.SimpleLayout(仅仅包含日志信息的级别和信息的简单字符串)
org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)

在使用表达式指定格式的时候,表达式和C的风格还是很相近的,参数如下:

%m 输出代码中指定的消息
%p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL
%r 输出自应用启动到输出该log信息耗费的毫秒数
%c 输出所属的类目,通常就是所在类的全名
%t 输出产生该日志事件的线程名
%n 输出一个回车换行符,Windows平台为“rn”,Unix平台为“n”
%d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921
%l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10)
%x: 输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。
%%: 输出一个”%”字符 %F: 输出日志消息产生时所在的文件名称
%L: 输出代码中的行号
%m: 输出代码中指定的消息,产生的日志具体信息
%n: 输出一个回车换行符,Windows平台为”\r\n”,Unix平台为”\n”输出日志信息换行 可以在%与模式字符之间加上修饰符来控制其最小宽度、最大宽度、和文本的对齐方式。

如:

1)%20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,默认的情况下右对齐。

2)%-20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,”-”号指定左对齐。

3)%.30c:指定输出category的名称,最大的宽度是30,如果category的名称大于30的话,就会将左边多出的字符截掉,但小于30的话也不会有空格。

4)%20.30c:如果category的名称小于20就补空格,并且右对齐,如果其名称长于30字符,就从左边交远销出的字符截掉。

1.4、配置文件格式(properties)

 日志级别设置

log4j.rootLogger = [ level ] , appenderName, appenderName

level:OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL

输出的目的地:

#定义appenderName输出到控制器
log4j.appender.appenderName=org.apache.log4j.ConsoleAppender
#定义appenderName的布局模式为PaternLayout
log4j.appender.appenderName.layout=org.apache.log4j.PatternLayout

这里的appenderName和上边日志级别里的appenderName是一样的,也就是输出的目的地名字,可以任意取。

输出格式配置

# 定义appenderName的输出格式
log4j.appender.appenderName.layout.ConversionPattern=%4p [%t] (%F:%L) - %m%n

下边是一个完整的配置配置文件,仅供参考:

#定义输出端
log4j.rootCategory=INFO,A1,A2,A3

#定义A1输出到控制器
log4j.appender.A1=org.apache.log4j.ConsoleAppender
#定义A1的布局模式为PaternLayout
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
# 定义A1的输出格式
log4j.appender.A1.layout.ConversionPattern=%4p [%t] (%F:%L) - %m%n

#定义A2输出到文件
log4j.appender.A2=org.apache.log4j.DailyRollingFileAppender
#定义A2输出到哪个文件
log4j.appender.A2.File=D:\\log\\sysLog.log
#定义A2输出文件的最大长度
#log4j.appender.A2.MaxFileSize = 1KB
#定义A2的备份文件数
#log4j.appender.A2.MaxBackupIndex = 3
#定义A2的布局模式为PatternLayout
log4j.appender.A2.layout=org.apache.log4j.PatternLayout
#定义A2的输出模式
log4j.appender.A2.layout.ConversionPattern=%d{yyyy-MM-dd hh:mm:ss}:%p %t %c - %m%n

#定义A3输出到数据库
log4j.appender.A3=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.A3.URL=jdbc:mysql://localhost:3306/db_log4j
log4j.appender.A3.driver=com.mysql.jdbc.Driver
log4j.appender.A3.user=root
log4j.appender.A3.password=root
#定义A3的布局和执行的SQL语句
log4j.appender.A3.layout=org.apache.log4j.PatternLayout
log4j.appender.A3.layout.ConversionPattern=INSERT INTO tb_log(createDate,thread,level,class,message) values(‘%d‘,‘%t‘,‘%-5p‘,‘%c‘,‘%m‘)

下边是一段Java的测试代码:

import org.apache.log4j.Logger;

Logger logger = Logger.getLogger(Log4JTest.class);
if(logger.isDebugEnabled()){
    logger.debug(new Exception("testLog4j debug demo.").getMessage());
}
if(logger.isInfoEnabled()){
    logger.info(new Exception("testLog4j info demo.").getMessage());
}
logger.error(new Exception("testLog4j error demo.").getMessage());
logger.fatal(new Exception("testLog4j fatal demo.").getMessage());

2、Commons logging

  • 概述

Apache针对不同的开发语言做了一系列的日志工具包,在Java、.net、php、c++上都可以用,并且为这些日志制定了风格一致的操作方式,这里就实现了Commons-logging(JCL),Commons-logging主要是为哪些需要在不同环境下使用不同日志结构做开发的程序员而编写的,其中包括Apache Log4j和Java log。使用Commons-loogging的Log接口,并且在运行时决定使用哪种日志架构。现在使用Commons-logging和Log4J已经成为了Java日志的标准解决方案。

已经可以使用Log4j了,可为什么还要使用Commons-logging呢?在这里,Commons-logging相当于一个统一的日志接口集,当然他也有已经实现的SimpleLog,但功能很弱。在运行时来选择使用哪套日志的实现(例如Log4J),使得后期更改日志框架很方便,只需要更改JAR包就可以。另外,Commons-logging的日志管理操作更丰富、简单。

  • Commons-logging和log4j的兼容

log4j不依赖任何项目,这里点可以在log4j的官网查阅:http://logging.apache.org/log4j/2.x/dependencies.html 。

Commons-logging的在编译依赖、测试依赖等依赖项上都依赖有相关的依赖,所以,在这里可以找到Commons-logging和哪个版本的Log4j兼容性最好(很显然是编译依赖的版本)。具体的依赖关系可见:http://commons.apache.org/proper/commons-logging/dependencies.html。

编译依赖:用源码进行编译时需要的依赖,例如:拿到了Commons-logging的源码,想要编译得到Commons-logging.jar,那么就需要提供依赖中需要的那些jar包。

Commons-logging和log4j结合使用时,Java测试代码如下:

 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;

Log log = LogFactory.getLog(Log4JTest.class);
if (log.isDebugEnabled()) {
    log.debug(new Exception("Log4JCommonslogging debug demo.").getMessage());
}
if (log.isErrorEnabled()) {
    log.error(new Exception("Log4JCommonslogging error demo.").getMessage());
}
if (log.isInfoEnabled()) {
    log.info(new Exception("Log4JCommonslogging info demo.").getMessage());
}
if (log.isFatalEnabled()) {
    log.fatal(new Exception("Log4JCommonslogging fatal demo.").getMessage());
}
时间: 2024-11-06 16:45:05

Java日志管理:log4j、Commons-logging、slf4的相关文章

Java日志管理:Logger.getLogger()和LogFactory.getLog()的区别(详解Log4j)

Java日志管理:Logger.getLogger()和LogFactory.getLog()的区别(详解Log4j) 博客分类: Java综合 第一.Logger.getLogger()和LogFactory.getLog()的区别     1.Logger.getLogger()是使用log4j的方式记录日志:  2.LogFactory.getLog()则来自apache的common-logging包. common-logging组件:         Jakarta Commons

Java日志管理方法(转载)

原文地址:http://www.cnblogs.com/leocook/p/log_java.html java开发中常见的几种日志管理方案有以下4种: 1. Commons-logging + log4j 2. log4j 3. slf4j + log4j + commmons-logging 4. slf4j + log4j 原文地址:http://www.cnblogs.com/leocook/p/log_java.html 1.log4j 概述 log4j是Apache的一个开源项目,主

Java日志commons-logging log4j slf4j之间的关系

一.之前进行日志操作一般都是在一个类中加入如下代码: import org.apache.log4j.Logger; //引入的是log4j的包 private static final Logger LOG = Logger.getLogger(Test.class); 二.后来看见别人的代码是这样写的: import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; //引入的是comm

日志管理-log4j与slf4j的使用

一.概述 1.log4j: Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台.文件.GUI组件,甚至是套接口服务器.NT的事件记录器.UNIX Syslog守护进程等:我们也可以控制每一条日志的输出格式:通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程.最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码. 2.slf4j: SLF4J,即简单日志门面(Simple Logging Facade

JAVA日志框架log4j和slf4j

1 org.apache.log4j.ConsoleAppender(控制台) 2 org.apache.log4j.FileAppender(文件) 3 org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件) 4 org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件) 5 org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方) 原

JAVA日志管理体系(文件、数据库、邮件)

目前程序中,有很多地方 try catch,程序运行异常.出错石沉大海而不被感知,接下来要针对这个问题进行调整,原则是任何异常都可以被感知.记录继而被优化处理:严重的错误异常,必须可以在第一时间通知到开发人员. 方案: log4j 升级为 log4j2 针对不同业务,采用不同等级.不同载体的日志记录形式: 1.日志文件记录 2.JMS 消息推送 3.数据库日志记录 4.实时邮件发送(严重错误) ---------------------------------------------- 程序中,

为什么使用 SLF4J 而不是 Log4J 来做 Java 日志

转自:为什么使用 SLF4J 而不是 Log4J 来做 Java 日志 英文原文:Why use SLF4J over Log4J for logging in Java 每个Java开发人员都知道日志记录对Java应用的重要性,尤其是对服务端应用,而且其中许多人都已经熟悉了各种记录日志的库,比如java.util.logging,Apache的log4j,logback,然而如果你不知道SLF4J,java的简单记录日志的设计的话 ,那么到了学习并在你的项目中使用它的时候了.在这篇Java文档

Java中的日志管理

日志是应用程序运行中不可缺少的一部分,JAVA中有很多已经成熟的方案,尽管记录日志是应用开发中并不可少的功能,在 JDK 的最初版本中并不包含日志记录相关的 API 和实现.相关的 API(java.util.logging 包,JUL)和实现,直到 JDK 1.4 才被加入.因此在日志记录这一个领域,社区贡献了很多开源的实现.其中比较流行的包括 log4j 及其后继者 logback.除了真正的日志记录实现之外,还有一类与日志记录相关的封装 API,如 Apache Commons Loggi

Log4j日志管理的简单实例

大型项目中很多情况下要分析程序的日志信息,如何管理自己的日志信息至关重要.在应用程序中添加日志记录总的来说基于三个目的 , 监视代码中变量的变化情况,周期性的记录到文件中供其他应用进行统计分析工作: 跟踪代码运行时轨迹,作为日后审计的依据: 担当集成开发环境中的调试器的作用,向文件或控制台打印代码的调试信息. 最普通的做法就是在代码中嵌入许多的打印语句,这些打印语句可以输出到控制台或文件中,比较好的做法就是构造一个日志操作类 来封装此类操作,而不是让一系列的打印语句充斥了代码的主体. 这篇文章主