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