log日志

常用log4j配置

常用log4j配置,一般可以采用两种方式,.properties和.xml,下面举两个简单的例子:

最简单的配置是只要取下面的log4j.properties文件中带下划线的四行就行,它完成日志输出到控制台。

一、log4j.properties

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
### 设置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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<? 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 >

 

三、配置文件加载方法:

对于properties文件,一般都不用手工去加载,由Log4j第一次初始化时自动就加载了

01
02
03
04
05
06
07
08
09
10
11
12
13
import  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+Logback

前面讲的 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 文件内容

01
02
03
04
05
06
07
08
09
10
11
12
<? 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 Blog
01
02
03
04
05
06
07
08
09
10
11
12
package 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 一样的,定义高层 API slf4j-api-1.5.11.jar
logback-classic-0.9.20.jar 都是用绑定,
左边这里用作
Logback 绑定
slf4j-log4j12-1.5.11.jar
logback-classic-0.9.20.jar 左边这里用作
日志实现
log4j-1.2.15.jar
logback-test.xml/logback.xml 相当,logback 增加
了 log4j
log4j.properties/log4j.xml
程序代码中:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

 

Logger logger = LoggerFactory.getLogger(TestSlf4j.class);
logger.info("Hello {}","SLF4J");

完全一样,实质上只是
SLF4J API
侵入到了应用组件
中了,与 Logback
没有关系。
程序代码中:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

 

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 的项目。

猜你喜欢

转载自goahead2010.iteye.com/blog/1908302