Java日志

引言

  • 最近在做资源库管理系统,由于这个系统涉及一些复杂的操作,比如增删改查数据库表、用户申请新版本、审批和通过用户申请、导入和导出资源表,需要将每次操作的日志记录在专门的文件中,已被查阅和追责;
  • 需求中提出的日志记录功能不是JVM或者是glassfish层面的日志,而是业务层面的日志,需要用专门的类完成这一功能;
  • 顺便学习了java日志记录的相关知识;

log4j

  • 日志的记录一般是用Apache的Log4j包,log4j的优点在于:线程安全、可记录多个层次的日志信息、支持国际化、速度经过优化;
  • 本文参考这篇文章

log4j下载和使用步骤

  • 这里下载;
  • 将其中的jar包复制到eclipse工程中,并通过右键>build path>configuration>library添加jar包进入工程;
  • 在src直接下级目录创建并设置log4j.properties文件

log1

  • log4j.properties文件可写成诸如下面的结构:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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

log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = C:\\Users\\changsiyuan\\Desktop\\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

log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File = C:\\Users\\changsiyuan\\Desktop\\log.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
  • 程序需要先初始化log4j,然后再需要记录日志的地方调用相应的方法即可:
1
2
3
4
5
6
7
8
9
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
package testlog;

import java.io.File;

import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;

/**
*
* @author changsiyuan
*
*/

public class Test {
//获取日志记录器
private static Logger logger = Logger.getLogger(Test.class);

/**
*
* @param args
*/

public static void main(String[] args) {
//配置log4j环境,自动快速地使用缺省Log4j环境
BasicConfigurator.configure();

// 记录debug级别的信息
logger.debug("This is debug message.");
// 记录info级别的信息
logger.info("This is info message.");
// 记录warn级别的信息
logger.warn ("This is warn message.") ;
// 记录error级别的信息
logger.error("This is error message.");
}
}

配置文件参数说明

  • 优先级说明
    • 日志优先级从高到低为ERROR、WARN、INFO、DEBUG
  • 根配置信息
    • 下面的配置信息表明将登记大于等于INFO的日志信息输出到stdout和R两个目的地;
1
log4j.rootCategory=INFO,stdout,R
  • 配置日志输出目的地信息
    • 目的地参数如下:org.apache.log4j.ConsoleAppender(控制台),org.apache.log4j.FileAppender(文件),org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件), org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件), org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
    • 语法如下:
1
2
3
4
log4j.appender.appenderName = fully.qualified.name.of.appender.class  
log4j.appender.appenderName.option1 = value1
...
log4j.appender.appenderName.option = valueN
  • 布局信息的配置
    • 布局参数:org.apache.log4j.HTMLLayout(以HTML表格形式布局),org.apache.log4j.PatternLayout(可以灵活地指定布局模式),org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串), org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)
    • 语法如下:
1
2
3
4
log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class  
log4j.appender.appenderName.layout.option1 = value1
...
log4j.appender.appenderName.layout.option = valueN
  • 打印信息
    • 语法:log4j.appender.appenderName.layout.ConversionPattern=...;
    • 参数:
参数 含义
%m 输出代码中指定的消息
%p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL
%r 输出自应用启动到输出该log信息耗费的毫秒数
%c 输出所属的类目,通常就是所在类的全名
%t 输出产生该日志事件的线程名
%n 输出一个回车换行符,Windows平台为“rn”,Unix平台为“n”
%d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921
%l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数

配置文件示例

  • log写入控制台
1
2
3
4
5
6
7
8
# Root logger option
log4j.rootLogger=INFO, stdout

# Direct log messages to stdout
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=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
  • log写入文件
1
2
3
4
5
6
7
8
### set log levels ###  
log4j.rootLogger = debug,mylog

log4j.appender.mylog=org.apache.log4j.FileAppender
log4j.appender.mylog.append=true
log4j.appender.mylog.file= C://Users/changsiyuan/Desktop/log.txt
log4j.appender.mylog.layout=org.apache.log4j.PatternLayout
log4j.appender.mylog.layout.ConversionPattern=%-5p %c: %m%n

  • log写入文件并限制文件大小
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Root logger option
log4j.rootLogger=INFO, file

# Direct log messages to a log file
log4j.appender.file=org.apache.log4j.RollingFileAppender

#Redirect to Tomcat logs folder
#log4j.appender.file.File=${catalina.home}/logs/logging.log

log4j.appender.file.File=C:\\logigng.log
log4j.appender.file.MaxFileSize=10MB
log4j.appender.file.MaxBackupIndex=10
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
  • log同时写入日志和文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# Root logger option
log4j.rootLogger=INFO, file, stdout

# Direct log messages to a log file
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=C:\\logging.log
log4j.appender.file.MaxFileSize=10MB
log4j.appender.file.MaxBackupIndex=10
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

# Direct log messages to stdout
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=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
您的支持是对我最大的鼓励!