Spring中log4j的使用

常用的日志方式

Java中给项目程序添加log主要有三种方式,一使用JDK中的java.util.logging包,一种是log4j,一种是commons-logging。其中log4j和commons-logging都是apache软件基金会的开源项目。这三种方式的区别如下:

Java.util.logging,JDK标准库中的类,是JDK 1.4 版本之后添加的日志记录的功能包。

log4j,最强大的记录日志的方式。可以通过配置 .properties 或是 .xml 的文件, 配置日志的目的地,格式等等。

commons-logging,最综合和常见的日志记录方式,是Java中的一个日志接口,一般会与log4j一起使用。自带SimpleLog可用于日志记录。

log4j配置由三个部分组成

输出级别的种类(level)

日志记录的优先级,分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定义的级别。Log4j建议只使用四个级别:

ERROR、WARN、INFO、DEBUG

ERROR 为严重错误 主要是程序的错误

WARN 为一般警告,比如session丢失

INFO 为一般要显示的信息,比如登录登出

DEBUG 为程序的调试信息

配置日志信息输出目的地(appender)

Log4j提供的appender有以下几种:

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(将日志信息以流格式发送到任意指定的地方)

要写日志信息到一个文件中,必须使用org.apache.log4j.FileAppender。有以下FileAppender的配置参数

属性

描述

immediateFlush

标志的默认设置为true,这意味着输出流的文件被刷新,在每个追加操作

encoding

它可以使用任何字符编码。默认情况下是特定于平台的编码方案

threshold

这个 appender 阈值级别

Filename

日志文件的名称

fileAppend

默认设置为true,这意味着记录的信息被附加到同一文件的末尾

bufferedIO

此标志表示是否需要写入缓存启用。默认设置为false

bufferSize

如果 bufferedI/O 启用,这表示缓冲区的大小,默认设置为8KB

RollingFileAppender的可配置参数除了上面FileAppender已有的以外,还有下面两个

属性

描述

maxFileSize

上述的文件的回滚临界尺寸。默认值是10MB

maxBackupIndex

此属性表示要创建的备份文件的数量。默认值是1

1:org.apache.log4j.RollingFileAppender 这是文件方式的输出,但可能是多个文件。

2:log4j.appender.R.MaxFileSize=1024KB 规定最大到1024K,就生成新文件。

log4j.appender.R.MaxBackupIndex=10 最多生成10个,

这种方式下,日志文件名会是:xx.log xx.log.1 xx.log.2……

DailyRollingFileAppender除了有FileAppender已有的以外,还有

Property

描述

DatePattern

这表示在滚动的文件,并按命名惯例来执行。默认情况下,在每天午夜滚动

DatePattern控制使用下列滚动的时间表方式之一:

DatePattern

描述

‘.’ yyyy-MM

滚动在每个月的结束和下一个月初

‘.’ yyyy-MM-dd

这是默认值,每天午夜滚动

‘.’ yyyy-MM-dd-a

滚动每一天的午夜和中午

‘.’ yyyy-MM-dd-HH

滚动在每一个小时

‘.’ yyyy-MM-dd-HH-mm

滚动在每一个分钟

‘.’ yyyy-ww

滚动每个星期取决于区域设置时的第一天

配置日志信息的格式(layout)

Log4j提供的layout有以e几种:

1.org.apache.log4j.HTMLLayout(以HTML表格形式布局),

2.org.apache.log4j.PatternLayout(可以灵活地指定布局模式),

3.org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),

4.org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)

如果想生成基于模式的特定格式的日志信息,那么可以使用 org.apache.log4j.PatternLayout 格式化日志信息。

PatternLayout类扩展抽象 org.apache.log4j.Layout 类并覆盖format()方法根据提供的模式构建日志信息。

PatternLayout也是一个简单的布局对象,它提供下列Bean属性,可以通过配置文件进行设置:

S.N.

属性和说明

1

conversionPattern设置转换模式。默认为 %r [%t] %p %c %x - %m%n

模式转换字符:

下表说明了以上模式使用的字符和所有其他字符,可以在自定义模式中使用:

转换字符

表示的意思

c

用于输出的记录事件的类别。例如,对于类别名称”a.b.c” 模式 %c{2} 会输出 “b.c”

C

用于输出呼叫者发出日志请求的完全限定类名。例如,对于类名 “org.apache.xyz.SomeClass”, 模式 %C{1} 会输出 “SomeClass”.

d

用于输出的记录事件的日期。例如, %d{HH:mm:ss,SSS} 或 %d{dd MMM yyyy HH:mm:ss,SSS}.

F

用于输出被发出日志记录请求,其中的文件名

l

用于将产生的日志事件调用者输出位置信息

L

用于输出从被发出日志记录请求的行号

m

用于输出使用日志事件相关联的应用程序提供的消息

M

用于输出发出日志请求所在的方法名称

n

输出平台相关的行分隔符或文字

p

用于输出的记录事件的优先级

r

用于输出毫秒从布局的结构经过直到创建日志记录事件的数目

t

用于输出生成的日志记录事件的线程的名称

x

用于与产生该日志事件的线程相关联输出的NDC(嵌套诊断上下文)

X

在X转换字符后面是键为的MDC。例如 X{clientIP} 将打印存储在MDC对键clientIP的信息

%

文字百分号 %%将打印%标志

格式修饰符:

默认情况下,相关资料原样输出。然而,随着格式修饰符的帮助下,可以改变最小字段宽度,最大字段宽度和对齐。

下表涵盖了各种各样的修饰符的情况:

Format modifier

left justify

minimum width

maximum width

注释

%20c

false

20

none

用空格左垫,如果类别名称少于20个字符长

%-20c

true

20

none

用空格右垫,如果类别名称少于20个字符长

%.30c

NA

none

30

从开始截断,如果类别名称超过30个字符长

%20.30c

false

20

30

用空格左侧垫,如果类别名称短于20个字符。但是,如果类别名称长度超过30个字符,那么从开始截断。

%-20.30c

true

20

30

用空格右侧垫,如果类别名称短于20个字符。但是,如果类别名称长度超过30个字符,那么从开始截断。

配置文件log4j.properties

1.配置根Logger,其语法为:

log4j.rootLogger = [ level ] , appenderName, appenderName, …

如: log4j.rootLogger = debug,stdout,D,E , debug是日志级别, stdout, ,D,E是输出目的地appender,每一个appender会在下面单独配置。

2.配置日志信息输出目的地Appender,其语法为:

log4j.appender.appenderName = 完全类限定名,如:org.apache.log4j.ConsoleAppender
log4j.appender.appenderName.属性1 = 值1  
…  
log4j.appender.appenderName.属性N = 值N
如:
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = E://logs/log.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG 
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n

3.配日志信息的格式(layout),如上面最后一行的配置属性ConversionPattern

一个完整的示例

### set log levels ###  
log4j.rootLogger = debug,stdout,D,E  

# 控制台输出的配置,所有日志输出,都会显示在控制台
log4j.appender.stdout = org.apache.log4j.ConsoleAppender  
log4j.appender.stdout.Target = System.out  
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout  
log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n  

# DEBUG级别及以上级别的日志,会写到F://logs/log.log文件中,文件不存在的时候会自动创建
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender  
log4j.appender.D.File = F://logs/log.log  
log4j.appender.D.Append = true  
log4j.appender.D.Threshold = DEBUG   
log4j.appender.D.layout = org.apache.log4j.PatternLayout  
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n  

# ERROR级别及以上级别的日志,会写到F://logs/error.log文件中,文件不存在的时候会自动创建
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender  
log4j.appender.E.File =F://logs/error.log   
log4j.appender.E.Append = true  
log4j.appender.E.Threshold = ERROR   
log4j.appender.E.layout = org.apache.log4j.PatternLayout  
log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n

# 指定com.neusoft包下的所有类的等级为DEBUG。可以把com.neusoft改为自己项目所用的包名。
log4j.logger.com.neusoft =DEBUG
# 类似其他包也可以针对包指定日志级别
log4j.logger.com.opensymphony.oscache=ERROR
log4j.logger.net.sf.navigator=ERROR

Spring-web项目中使用log4j的步骤

第一步:添加log4j的相关包

第二步:在spring的环境中添加log4j的配置

<context-param>  
        <param-name>webAppRootKey</param-name>  
        <param-value>webapp.root</param-value>  
    </context-param>  

    <context-param>  
        <param-name>log4jConfigLocation</param-name>  
        <param-value>WEB-INF/log4j.properties</param-value>  
    </context-param>  

    <context-param>  
        <param-name>log4jRefreshInterval</param-name>  
        <param-value>3000</param-value>  
    </context-param>  

    <listener>  
        <listener-class>  
            org.springframework.web.util.Log4jConfigListener  
        </listener-class>  
    </listener>

“webapp.root”这个字符串可以随便写任何字符串。如果不配置默认值是”webapp.root”。可以用System.getProperty(“webapp.root”)来动态获项目的运行路径。一般是打包项目的根目录。

第三步:当于就是log4j本身的配置了,上面讲的一大堆都是,log4j.properties.

第四步: 配置好以后日志就跟随web项目窗口启动而启动了,在服务器启动的控制台可以看到日志信息。

在代码中使用的时候如下: Logger类不允许实例化一个新的记录器实例,但它提供了两个静态方法获得一个 Logger 对象:

  • public static Logger getRootLogger();
  • public static Logger getLogger(String name);

此处两种方法的第一个返回应用程序实例根记录器并没有名字。任何其他命名的Logger对象实例是通过第二种方法通过记录器的名称获得。

import org.apache.log4j.Logger;  
private static Logger log = Logger.getLogger(SessionListener.class);  

log.info("SessionListener contextInitialized!");

SN

方法及描述

1

public void debug(Object message)这种方法打印使用 Level.DEBUG 消息级别

2

public void error(Object message)这种方法打印使用 Level.ERROR 消息级别

3

public void fatal(Object message);这种方法打印使用 Level.FATAL 消息级别

4

public void info(Object message);这种方法打印使用 Level.INFO 消息级别

5

public void warn(Object message);这种方法打印使用 Level.WARN 消息级别

6

public void trace(Object message);这种方法打印使用Level.TRACE消息级别

其他

log4j 的rootLogger与rootCategory的区别

一句话

rootLogger是新的使用名称,对应Logger类

rootCategory是旧的使用名称,对应原来的Category类

log4j日志文件中文乱码处理方法

配置文件中加上这句

log4j.appender.file.encoding=UTF-8