log日志
常用log4j配置,一般可以采用两种方式,.properties和.xml,下面举两个简单的例子:
最简单的配置是只要取下面的log4j.properties文件中带下划线的四行就行,它完成日志输出到控制台。
一、log4j.properties
010203040506070809101112131415161718192021222324252627282930### 设置com.unmi域对应的级别INFO,DEBUG,WARN,ERROR和输出地A1,A2 ##
log4j.category.com.unmi = ERROR,A1
log4j.category.com.unmi = INFO,A2
??### 一般把上面两行写如下方式,统一控制日志输出,再用log4j.logger设置包独立的输出级别 ##
log4j.rootLogger = DEBUG,A1
log4j.logger.com.unmi.special = ERROR
?### 设置输出地A1,为ConsoleAppender(控制台) ##
log4j.appender.A1 = org.apache.log4j.ConsoleAppender
?### 设置A1的输出布局格式PatterLayout,(可以灵活地指定布局模式)##
log4j.appender.A1.layout = org.apache.log4j.PatternLayout
?### 配置日志输出的格式##
log4j.appender.A1.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss,SSS} [%c]-[%p] %m%n
?### 设置输出地A2到文件(文件大小到达指定尺寸的时候产生一个新的文件)##
log4j.appender.A2 = org.apache.log4j.RollingFileAppender
?### 文件位置##
log4j.appender.A2.File = E:/study/log4j/log.html
?### 文件大小##
log4j.appender.A2.MaxFileSize = 500KB
?log4j.appender.A2.MaxBackupIndex = 1
?##指定采用html方式输出
log4j.appender.A2.layout = org.apache.log4j.HTMLLayout
二、log4j.xml
010203040506070809101112131415161718192021222324252627282930313233343536<?
xml
version
=
"1.0"
encoding
=
"GB2312"
?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
?<
log4j:configuration
xmlns:log4j
=
"http://jakarta.apache.org/log4j/"
>
?????
<
appender
name
=
"com.unmi.all"
class
=
"org.apache.log4j.RollingFileAppender"
>
???????
<!-- 设置 appender Name:com.unmi.all和输出方式:org.apache.log4j.RollingFileAppender -->
???????
<
param
name
=
"File"
value
=
"E:/study/log4j/all.output.log"
/ >
<!-- 设置File参数:日志输出文件名 -->
???????
<
param
name
=
"Append"
value
=
"false"
/ >
<!-- 设置是否在重新启动服务时,在原有日志的基础添加新日志 -->
???????
<
param
name
=
"MaxBackupIndex"
value
=
"10"
/ >
???????
<
layout
class
=
"org.apache.log4j.PatternLayout"
>
???????????
<
param
name
=
"ConversionPattern"
value
=
"%p (%c:%L)- %m%n"
/ >
<!-- 设置输出文件项目和格式 -->
???????
</
layout
>
????
</
appender
>
?????
<
appender
name
=
"com.unmi.xyz"
class
=
"org.apache.log4j.RollingFileAppender"
>
???????
<
param
name
=
"File"
value
=
"E:/study/log4j/xyz.output.log"
/ >
???????
<
param
name
=
"Append"
value
=
"true"
/ >
???????
<
param
name
=
"MaxFileSize"
value
=
"10240"
/ >
<!-- 设置文件大小 -->
???????
<
param
name
=
"MaxBackupIndex"
value
=
"10"
/ >
???????
<
layout
class
=
"org.apache.log4j.PatternLayout"
>
???????????
<
param
name
=
"ConversionPattern"
value
=
"%p (%c:%L)- %m%n"
/ >
???????
</
layout
>
????
</
appender
>
?????
<
logger
name
=
"unmi.log"
>
<!-- 设置包名限制,即unmi.log域及以下的日志均输出到下面对应的 appender 中 -->
???????
<
level
value
=
"debug"
/ >
<!-- 设置级别 -->
???????
<
appender-ref
ref
=
"com.unmi.xyz"
/ >
<!-- 与前面的配置的 appender name 相对应 -->
????
</
logger
>
?????
<
root
>
<!-- 设置接收所有输出的 appender -->
???????
<
appender-ref
ref
=
"com.unmi.all"
/ >
<!-- 与前面的 appender name 相对应 -->
????
</
root
>
?</
log4j:configuration
>
?
三、配置文件加载方法:
本文原始链接:http://unmi.cc/log4j-common-config, 来自:隔叶黄莺 Unmi Blog对于properties文件,一般都不用手工去加载,由Log4j第一次初始化时自动就加载了
01020304050607080910111213import
? org.apache.log4j.Logger;
import
? org.apache.log4j.PropertyConfigurator;
import
? org.apache.log4j.xml.DOMConfigurator;
?public
class
Log4jApp {
???
public
static
void
main(String[] args) {
????????
DOMConfigurator.configure(
"E:/study/log4j/log4j.xml"
);
//加载.xml文件
???????
//PropertyConfigurator.configure("E:/study/log4j/log4j.properties");//加载.properties文件
?????????
Logger log = Logger.getLogger(
"com.unmi.test"
);
???????
log.info(
"测试"
);
????
}
}
四、项目使用log4j
在web应用中,可以将配置文件的加载放在一个单独的servlet中,并在web.xml中配置该servlet在应用启动时候加载。对于在多人项目中,可以给每一个人设置一个输出通道,这样在每个人在构建Logger时,用自己的域名称,让调试信息输出到自己的log文件中。
五、常用输出格式
%c?? 列出logger名字空间的全称,如加上{<层数>}表示出从最内层算起的指定层数的名字空间
%X? 按MDC(Mapped Diagnostic Context,线程映射表)输出日志。通常用于多个客户端连接同一台服务器,方便服务器区分是那个客户端访问留下来的日志。
%p??日志信息级别
%d?? %d{<日期格式>}:日志信息产生时间,使用ISO8601定义的日期格式
%C?? 日志信息所在地(全限类名)
%m?? 产生的日志具体信息
%n??? 输出日志信息换行
%F 显示调用logger的源文件名
%l?????输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数
%L????显示调用logger的代码行
%M?? 显示调用logger的方法名
%r???? 显示从程序启动时到记录该条日志时已经经过的毫秒数
%t???? 输出产生该日志事件的线程名
%% 显示一个百分号
补充:在配置文件中可以用变量用于引用系统属性,如
?
log4j.appender.A2.File = ${user.home}/${app.name}.log
如果你在启动程序时加了 -Dapp.name=UnmiLog4jTest? JVM 参数,或者在初始化 Log4j 之前,往 System.getProperties() 中 put 了 "app.name" 属性为 UnmiLog4jTest,那么就会输出日志文件到用户主目录/UnmiLog4jTest.log。user.home 属性一般都存在于系统属性中,你也可以在程序中改变它。
如果在 web.xml 中初始化 log4j,你可以在 log4j 的配置文件中更轻松的取到 web 应用的绝对路径。
前面讲的 SLF4J 的用法之一是 SLF4J+Log4J,而这里要推出的组合是 SLF4J+LogBack。不用 Log4J?难道还有比 Log4J 更好的日志实现吗?是的,答案就是?LogBack。假如你知道 LogBack 和 Log4J 是同出一位大师之手,你就不会觉得惊讶了。LogBack 对 Log4J 进行了增强,并投入了 SLF4J 的怀抱,它还被作者认定为 Log4J 的继任者。
为什么叫做 Logback,我就不知道了,反正不要叫做 Brokeback 就行。这里是推崇用 Logback 替代 Log4J 的十几个理由:Reasons to prefer logback over log4j,说的大至是更快;好测试;与 SLF4J 关系紧;文档丰富;能自动加载配置文件;多个 JVM 写一个日志文件,或其他 I/O 错误时不影响程序执行;配置文件中加入条件控制;强大的日志过滤;更强的日志切分功能;自动压缩、删除日志文件;异常栈中更多的数据信息。
Logback 分为三个模块:logback-core,logback-classic,logback-access。logback-core 是核心;logback-classic 改善了 log4j,且自身实现了 SLF4J API,所以即使用 Logback 你仍然可以使用其他的日志实现,如原始的 Log4J,java.util.logging 等;logback-access 让你方便的访问日志信息,如通过 http 的方式。
还得提一点,Logback 能更好的放到 OSGI 环境中。好了,简单绍完了 Logback,就来看看具体怎么用它。
需要的配置文件和组件包,下面三个 jar 文件和一个 xml文件都是要放在项目的 ClassPath 上。
1. slf4j-api-1.5.11.jar
2. logback-core-0.9.20.jar
3. logback-classic-0.9.20.jar
4. logback.xml 或 logback-test.xml (类似于 log4j.properties/log4j.xml)
前一个包在?http://www.slf4j.org/download.html?处下载,第二第三个包在?http://logback.qos.ch/download.html?下载,可能包文件名中的版本号有些差,不要紧。由于这里不演示 HTTP 访问日志信息,所以不需要用到 logback-access-0.9.20.jar。
Logback 先找 logback-test.xml,没有则找 logback.xml 文件,都找不到就使用 BasicConfigurator 基本配置,BasicConfigurator 就是相当于等会贴出的 logback.xml 文件内容的配置。这里我们用 logback.xml 配置文件,以前的 log4j.properties? 文件可以用?PropertiesTranslator?转换成 logback.xml 文件内容。
下面是一个最简单的 logback.xml 文件内容
010203040506070809101112<?
xml
version
=
"1.0"
encoding
=
"UTF-8"
?>
<
configuration
>
??
<
appender
name
=
"stdout"
class
=
"ch.qos.logback.core.ConsoleAppender"
>
??????
<
encoder
charset
=
"GBK"
>
??????????
<
pattern
>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</
pattern
>
??????
</
encoder
>
??
</
appender
>?
???
<
root
level
=
"DEBUG"
>
????
<
appender-ref
ref
=
"stdout"
/>
??
</
root
>
</
configuration
>
在 log4j.xml 能做的配置,logback.xml 中也能做到,而且还增强了诸如 <if><then><else>、<filter>、<sift> 等更强的控制,请参考 logback 的手册?http://logback.qos.ch/manual/index.html。
使用?Logback??的代码
本文原始链接:http://unmi.cc/slf4j-logback, 来自:隔叶黄莺 Unmi Blog010203040506070809101112package
com.unmi;
?import
org.slf4j.Logger;
import
org.slf4j.LoggerFactory;
?public
class
TestLogback {
????
private
static
final
Logger logger = LoggerFactory.getLogger(TestLogback.
class
);
?????
public
static
void
main(String[] args) {
????????
logger.info(
"Hello {}"
,
"TestLogback"
);
????
}
}
可以看到与使用 SLF4J 的代码没有任何区别,因为本来用的通用日志框架就是 SLF4J,说到底,这里的 Logback 就相当于 SLF4J+Log4J 使用方式中的 Log4J 绑定和 Log4J 的功能。
执行上面的代码,输出:
21:38:43.031 [main] INFO? com.unmi.TestLogback - Hello TestLogback
还是和上次一样,这里就拿 SLF4J+Logback 和 SLF4J+Log4J 两种方式作下比较:
SLF4J+Logback 组合对比SLF4J+Log4J 组合slf4j-api-1.5.11.jar一样的,定义高层 APIslf4j-api-1.5.11.jarlogback-classic-0.9.20.jar都是用绑定,?
Logger logger = LoggerFactory.getLogger(TestSlf4j.class);
logger.info("Hello {}","SLF4J");
?
Logger logger = LoggerFactory.getLogger(TestLogback.class);
logger.info("Hello {}","Logback");
通过上面我们更清楚的发现,SLF4J+Logback 这样的组合与 SLF4J+Log4J 这样的用法其实没有什么差异。SLF4J 在使用其他日志实现框架的时候都是 SLF4J+相应绑定+日志实现,这里缩写成的 SLF4J+Log4J,中间是有一个 SLF4J 到 Log4J 的绑定的。完整表述它们就是:
SLF4J+Log4J 的方式:??? slf4j-api-1.5.11.jar + slf4j-log4j12-1.5.11.jar + log4j-1.2.15.jar
SLF4J+Logback 的方式:slf4j-api-1.5.11.jar + logback-classic-0.9.20.jar + logback-classic-0.9.20??? 前一个 logback-classic-0.9.20.jar 是作为绑定用的,后一个是作为日志实现用的,也就是 logback-classic-0.9.20.jar 把前面的 slf4j-log4j12-1.5.11.jar 和 log4j-1.2.15.jar?两个包的功能揉合在了一起。
搞明白了 Logback 在其中所担当的角色后,我们就知道,说使用了 Logback 应用组件,实际它们所用的统一日志组件只是 SLF4J。也可以说 Logback 就是 Log4J 那样,只是自身带了绑定的日志实现。
在 Logback 官方首页?http://logback.qos.ch/?面中可以看到使用了 Logback 的项目。