什么是log4j?
简单的说log4j就是帮助开发人员进行日志输出管理的API类库。它最重要的特点就可以配置文件灵活的设置日志信息的优先级、日志信息的输出目的地以及日志信息的输出格式。
Log4j除了可以记录程序运行日志信息外还有一重要的功能就是用来显示调试信息。程序员经常会遇到脱离java
ide环境调试程序的情况,这时大多数人会选择使用System.out.println语句输出某个变量值的方法进行调试。这样会带来一个非常麻烦的问题:一旦哪天程序员决定不要显示这些System.out.println的东西了就只能一行行的把这些垃圾语句注释掉。若哪天又需调试变量值,则只能再一行行去掉这些注释恢复System.out.println语句。使用log4j可以很好的处理类似情况。
怎么配置log4j
依赖的jar
<properties> ... <slf4j.version>1.7.21</slf4j.version> <log4j.version>1.2.17</log4j.version> ... </properties> <dependencies> ... <!-- 日志文件管理包 --> <!-- log start --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>${log4j.version}</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>${slf4j.version}</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>${slf4j.version}</version> </dependency> ... </dependencies>
属性文件log4j.properties
### 设置优先级别(fata、error、warn、debug、info)、以及输出源(控制台、文件) ###
### A1,R输出源名称(名称可以自己随便定义相当于变量名) ###i
log4j.rootLogger=INFO,A1,R
### 把日志信息输出到控制台 ###
### ConsoleAppender:把日志信息写到控制台 ###
log4j.appender.A1=org.apache.log4j.ConsoleAppender
### 输出样式 布局模式###
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
### %c:包名.文件名。%p:输出级别,%m:输出代码中指定的消息,%n:输出一个回车换行符,%l:输出日志信息发生的位置,包括类名、发生的线程、行数 ,%t输出一个制表符###
log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%c]-[%p] %m%n
### RollingFileAppender:把日志信息循环滚动写到文件,FileAppender:把日志信息写到文件###
log4j.appender.R=org.apache.log4j.RollingFileAppender
### 设置日志信息文件名为bbscs7log.txt ###
log4j.appender.R.File=bbscs7log.txt
### 设置日志信息文件大小为500KB ###
log4j.appender.R.MaxFileSize=500KB
### 设置日志信息文件总数最多为10个 ###
log4j.appender.R.MaxBackupIndex=10
### 输出样式 布局模式###
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%d%d%d%d%d%d%d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c] [%p] - %m%n
###控制包的日志级别 com.test.base为包名###
log4j.logger.com.test.base=INFO
log4j.logger.org.cpsolver=DEBUG
配置文件详解
Log4j支持两种配置文件格式,一种是XML格式的文件,一种是Java特性文件log4j.properties(键=值)。这里介绍属性文件的方式。
①配置根Logger,其语法为:
log4j.rootLogger = [ level ] , appenderName, appenderName, …
其中,level 是日志记录的优先级,分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者自定义的级别。Log4j建议只使用四个级别,优先级从高到低分别是ERROR、WARN、INFO、DEBUG。通过在这里定义的级别,您可以控制到应用程序中相应级别的日志信息的开关。显示所有优先权等於和高于level的信息,比如在这里定义了INFO级别,则应用程序中所有DEBUG级别的日志信息将不被打印出来。 appenderName就是指定日志信息输出到哪个地方。可同时指定多个输出目的地。
②配置日志信息输出目的地Appender,其语法为:
log4j.appender.appenderName = fully.qualified.name.of.appender.class
log4j.appender.appenderName.option1 = value1
…
log4j.appender.appenderName.option = valueN
org.apache.log4j.ConsoleAppender(控制台),
org.apache.log4j.FileAppender(文件),
org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),
org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件),
org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
③配置日志信息的格式(布局),其语法为:
log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
log4j.appender.appenderName.layout.option1 = value1
…
log4j.appender.appenderName.layout.option = valueN
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平台为“ ”,Unix平台为“ ”
%d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921
%l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10)
%p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL
%r 输出自应用启动到输出该log信息耗费的毫秒数
%c 输出所属的类目,通常就是所在类的全名
%t 输出产生该日志事件的线程名
%n 输出一个回车换行符,Windows平台为“ ”,Unix平台为“ ”
%d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921
%l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10)
怎么使用log4j?
(1)代码中直接使用
①得到记录器
使用Log4j,第一步就是获取日志记录器,这个记录器将负责控制日志信息。其语法为:
public static Logger getLogger( String name)
通过指定的名字获得记录器,如果必要的话,则为这个名字创建一个新的记录器。Name一般取本类的名字,比如:
static Logger logger = Logger.getLogger ( ServerWithLog4j.class.getName () )
②读取配置文件
当获得了日志记录器之后,第二步将配置Log4j环境,其语法为:
BasicConfigurator.configure (): 自动快速地使用缺省Log4j环境。
PropertyConfigurator.configure ( String configFilename) :读取使用Java的特性文件编写的配置文件。
PropertyConfigurator.configure ( String configFilename) :读取使用Java的特性文件编写的配置文件。
例:PropertyConfigurator.configure(".//src//log4j.properties")
DOMConfigurator.configure ( String filename ) :读取XML形式的配置文件。
DOMConfigurator.configure ( String filename ) :读取XML形式的配置文件。
③插入记录信息(格式化日志信息)
当上两个必要步骤执行完毕,就可轻松地使用不同优先级别的日志记录语句插入到您想记录日志的任何地方,其语法如下:
Logger.debug ( Object message ) ;
Logger.info ( Object message ) ;
Logger.warn ( Object message ) ;
Logger.error ( Object message ) ;
log4j范例程序
下面将使用一个最简单的范例程序来进一步说明log4j的使用方法。程序代码如下:
import org.apache.log4j.*; public class LogTest { static Logger logger = Logger.getLogger(LogTest.class.getName()); public static void main(String[] args) { PropertyConfigurator.configure ( “./srclog4j.properties”);
logger.debug("Debug ..."); logger.info("Info ..."); logger.warn("Warn ..."); logger.error("Error ..."); } }
介绍一个小插件
对于使用Eclipse的程序员Log4e将是我们最得力的log4j日志编写助手,Log4e是一个免费的Eclipse Plugin,它可帮助你在你的Java工程中快速加入Log;
我们可以在http://log4e.jayefem.de/index.php/Download网站上下载Log4e最新版本。下载后将相应文件夹拷贝到Eclipse的插件目录下,重新Eclipse,在首选项中会多出一个Log4e选项。
Log4e可以有多个插入Log为一个方法、类,当然也可以在当前位置插入Log,同时其也可以把Sysout.out.println()的转换为log;所有的这一切只需要你点点鼠标或者按一次快捷键。
(2)与spring集成(web)
Spring的做法是使用一个Servlet Listener
①在web.xml中插入
<!--log4j配置文件加载--> <context-param> <param-name>log4jConfigLocation</param-name> <param-value>classpath:/log4j.properties</param-value> </context-param> <!--启动一个watchdog线程每1800秒扫描一下log4j配置文件的变化--> <context-param> <param-name>log4jRefreshInterval</param-name> <param-value>1800000</param-value> </context-param> <!--spring log4j监听器--> <listener> <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> </listener>
②把log4j.properties配置文件放在上面配置的指定的目录下,如resources文件夹下。
注意:spring默认加载的是classpath根目录下面的log4j.properties(如果这样放可以不配),如果要放在其他目录或者名字不同,则需要按如上配置。且该Listener一定要放在spring的Listener之前。
③两种方式实现日志控制
spring中的拦截器:自定义拦截器
AOP
最后一个不错的log4j.properties配置文件模板
######################################
# log4j配置相关说明
######################################
#%p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL
#%r 输出自应用启动到输出该log信息耗费的毫秒数
#%c 输出所属的类目,通常就是所在类的全名
#%t 输出产生该日志事件的线程名
#%m 输出代码中指定的信息
#%n 输出一个回车换行符,Windows平台为“
”,Unix平台为“
”
#%d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyyy MM dd HH:mm:ss,SSS},输出类似: 2002年10月18日 22:10:28,921
#%l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10)
#log4j提供4种布局:
#org.apache.log4j.HTMLLayout(以HTML表格形式布局)
#org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
#org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
#org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息
#log4j中有五级logger 输出级别:
#FATAL 0
#ERROR 3
#WARN 4
#INFO 6
#DEBUG 7
######################################
# log4j相关配置
######################################
#日志输出级别
log4j.rootLogger=INFO,stdout,other
#设置stdout的日志输出控制台
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
#输出日志到控制台的方式,默认为System.out
log4j.appender.stdout.Target = System.out
#设置使用灵活布局
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
#灵活定义输出格式
log4j.appender.stdout.layout.ConversionPattern=[%p][%d{yyyy-MM-dd HH:mm:ss}] %l %m %n
#设置other的日志输出控制台
log4j.appender.other=org.apache.log4j.RollingFileAppender
#设置other的输出日志
log4j.appender.other.File=${webapp.root}/WEB-INF/logs/log.log
#设置other的日志最大限制
log4j.appender.other.MaxFileSize=1024KB
#最多只保存20个备份文件
log4j.appender.other.MaxBackupIndex=1000
#输出INFO级别以上的日志
og4j.appender.other.Threshold=INFO
#设置使用灵活布局
log4j.appender.other.layout=org.apache.log4j.PatternLayout
#灵活定义输出格式
log4j.appender.other.layout.ConversionPattern=[%p][%d{yyyy-MM-dd HH:mm:ss}] %l %t %m %n
######################################
# hibernate相关配置
######################################
#输出hibernate调试过程中的错误日志
log4j.logger.org.hibernate=other
#输出HQL查询调试日志
log4j.logger.org.hibernate.hql.ast.AST=other
#输出SQL语句调试日志
log4j.logger.org.hibernate.SQL=other
#输出 JDBC参数查询的日志
log4j.logger.org.hibernate.type=other
#输出缓存日志
log4j.logger.org.hibernate.cache=other
#输出事务日志
log4j.logger.org.hibernate.transaction=other
#输出获取JDBC资源日志
log4j.logger.org.hibernate.jdbc=other