log4j
来源:原创 发布时间:2015-05-16 归档:logging
环境 :
JDK 7
Log4j 1.2.16
Maven 3
Junit 4.11
Eclipse Luna
[+]
目录
<dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.16</version> </dependency>日志级别
org.apache.log4j.Level 提供了 8 种日志信息的级别, 它们按从小到大的关系为:
ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF
假设配置的日志级别为 X, 使用的级别为 Y, 当且仅当 Y >= X 时, 日志请求才会被处理,否则被忽略。
ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF
假设配置的日志级别为 X, 使用的级别为 Y, 当且仅当 Y >= X 时, 日志请求才会被处理,否则被忽略。
public class LogLevelTest { private Logger log = Logger.getLogger(LogLevelTest.class); @Test public void testLevel() { log.setLevel(Level.INFO); log.info("log info message"); log.error("log error message"); log.debug("log debug message"); } }
这里设置了日志的级别为 INFO, 那么, INFO 和 ERROR 级别的信息将被处理, DEBUG 级别的信息将被忽略。执行单元测试的结果 :
log info message
log error message
PatternLayout
log error message
org.apache.log4j.PatternLayout 的 conversionPattern 属性可以设置日志信息格式化的模式串, 可以灵活的控制日志信息的格式布局。
属性配置文件语法
Format | Desc |
---|---|
%c | 输出发出日志请求的类的完全限定名 |
%d | 输出日志发生的时间, 如 %d{yyyy-MM-dd HH:mm:ss} |
%F | 输出发出日志请求的类的文件名 |
%l | 输出发出日志请求的位置信息 |
%L | 输出发出日志请求的行的行号 |
%m | 输出运用程序提供的日志信息 |
%M | 输出发出日志请求的方法名称 |
%n | 输出一个换行符 |
%p | 输出日志的级别 |
%t | 输出记录日志的线程的名称 |
%-5p | 输出日志的级别, 如果长度少于 5 个字符, 用空格右补足 |
%5p | 输出日志的级别, 如果长度少于 5 个字符, 用空格左补足 |
root logger 配置, 其中 appender1, appender2 是 Appender 组件, 可以配置多个, 用 "," 隔开 :
log4j.rootLogger = [日志级别], appender1, appender2 . . .
appender 配置, 常见的如 ConsoleAppender, DailyRollingFileAppender, RollingFileAppender 等 :
log4j.appender.appender1 = org.apache.log4j.ConsoleAppender
appender 属性配置, 如 ConsoleAppender 的 target 属性 :
log4j.appender.appender1.target = System.out
layout 配置, 常见的如 PatternLayout, HTMLLayout, TTCCLayout 等 :
log4j.appender.appender1.layout = org.apache.log4j.PatternLayout
layout 属性配置, 如 PatternLayout 的 conversionPattern 属性 :
log4j.appender.appender1.layout.conversionPattern = %-5p %d{yyyy-MM-dd HH:mm:ss} %c : %L %n%m%n
ConsoleAppender
log4j.rootLogger = [日志级别], appender1, appender2 . . .
log4j.appender.appender1 = org.apache.log4j.ConsoleAppender
log4j.appender.appender1.target = System.out
log4j.appender.appender1.layout = org.apache.log4j.PatternLayout
log4j.appender.appender1.layout.conversionPattern = %-5p %d{yyyy-MM-dd HH:mm:ss} %c : %L %n%m%n
用于在控制台输出日志信息, log4j.properties 文件的配置如下 :
log4j.rootLogger = INFO, console log4j.appender.console = org.apache.log4j.ConsoleAppender log4j.appender.console.target = System.out log4j.appender.console.layout = org.apache.log4j.PatternLayout log4j.appender.console.layout.conversionPattern = %p %d{yyyy-MM-dd HH:mm:ss} %c : %L %n%m%n%n
public class Log4jTest { private Logger log = Logger.getLogger(Log4jTest.class); @Test public void testInfo() { log.info("log info message"); } @Test public void testError() { log.error("log error message"); } }执行单元测试 :
INFO 2015-05-16 08:43:10 org.lychie.log4j.tutorial.Log4jTest : 13
log info message
ERROR 2015-05-16 08:43:10 org.lychie.log4j.tutorial.Log4jTest : 18
log error message
log info message
log error message
org.apache.log4j.RollingFileAppender 日志文件大小达到指定大小时, 产生一个新的文件。
log4j.rootLogger = INFO, roll log4j.appender.roll = org.apache.log4j.RollingFileAppender # 日志文件名称 log4j.appender.roll.file = my.log # 日志文件大小 log4j.appender.roll.maxFileSize = 5KB # 备份日志文件的个数 log4j.appender.roll.maxBackupIndex = 3 log4j.appender.roll.layout = org.apache.log4j.PatternLayout log4j.appender.roll.layout.conversionPattern = %p %d{yyyy-MM-dd HH:mm:ss} %c : %L %n%m%n%n
日志文件大小默认是 1MB, 可以指定为 KB、MB、GB。备份日志文件的个数默认是 1 个, 如果设置为 0 个, 则表示不备份, 当文件大小达到指定大小时, 将覆盖当前日志文件的内容。
public class RollingFileAppenderTest { private static final int MAX_COUNT = 500; private Logger log = Logger.getLogger(RollingFileAppenderTest.class); @Test public void test() throws Throwable { for (int i = 0; i < MAX_COUNT; i++) { log.info("log info message - index : " + i); Thread.sleep(100); } } }
执行单元测试, 在项目根目录下产生 4 个文件, my.log, my.log.1, my.log.2, my.log.3。my.log.3 是最早产生的文件, my.log 是最晚产生的文件, 它们按时间从早到晚的顺序依次是 :my.log < my.log.1 < my.log.2 < my.log.3
org.apache.log4j.DailyRollingFileAppender 每天产生一个新的日志文件。
log4j.rootLogger = INFO, daily log4j.appender.daily = org.apache.log4j.DailyRollingFileAppender log4j.appender.daily.file = my.log log4j.appender.daily.datePattern = '.'yyyy-MM-dd log4j.appender.daily.layout = org.apache.log4j.PatternLayout log4j.appender.daily.layout.conversionPattern = %p %d{yyyy-MM-dd HH:mm:ss} %c : %L %n%m%n%n
my.log 记录的是当天的日志内容, 今天是2015年5月16日, 那么昨天的日志内容就会被备份到 my.log.2015-05-15 文件中。
org.apache.log4j.net.SMTPAppender 具有发送邮件的能力。使用时, 需要引入 mail 依赖包 :
<dependency> <groupId>javax.mail</groupId> <artifactId>mail</artifactId> <version>1.4.7</version> </dependency>
log4j.properties 配置文件配置 :
log4j.rootLogger = INFO, mail, console log4j.appender.mail = org.apache.log4j.net.SMTPAppender # 日志的级别 log4j.appender.mail.threshold = ERROR # 缓冲区大小 log4j.appender.mail.bufferSize = 512 # 邮件标题 log4j.appender.mail.subject = Log Error Message # 发件人 log4j.appender.mail.from = lychie@yeah.net # 收件人 log4j.appender.mail.to = lychie@yeah.net # 抄送人 log4j.appender.mail.cc = fanejob@163.com,fanejob@126.com # 使用的协议 log4j.appender.mail.SMTPProtocol = smtp # 邮件服务器 log4j.appender.mail.SMTPHost = smtp.yeah.net # 邮件账户名 log4j.appender.mail.SMTPUsername = lychie # 邮件账户密码 log4j.appender.mail.SMTPPassword = ****** log4j.appender.mail.layout = org.apache.log4j.PatternLayout log4j.appender.mail.layout.conversionPattern = %p %d{yyyy-MM-dd HH:mm:ss} %c : %L %n%m%n%n
public class SMTPAppenderTest { private Logger log = Logger.getLogger(SMTPAppenderTest.class); @Test public void testInfo() { log.info("log info message"); } @Test public void testError() { try { int randomNumber = ThreadLocalRandom.current().nextInt(2); randomNumber = 1 / randomNumber; } catch (Throwable e) { log.error("log error message", e); } } }
执行单元测试, 只要当运用程序发生 ERROR 或更高级别的错误, lychie@yeah.net、fanejob@163.com、fanejob@126.com 将分别得到一个邮件通知:
org.apache.log4j.jdbc.JDBCAppender 具有能够将日志信息存储到数据库的能力。这里使用 mysql 数据库, 引入驱动依赖包 :
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.17</version> </dependency>
创建表结构 :
CREATE TABLE logs ( id int(11) NOT NULL AUTO_INCREMENT, level varchar(5) NOT NULL, logger varchar(128) NOT NULL, message text NOT NULL, date_time datetime NOT NULL, PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
log4j.properties 配置文件配置 :
log4j.rootLogger = INFO, db log4j.appender.db = org.apache.log4j.jdbc.JDBCAppender log4j.appender.db.URL = jdbc:mysql://localhost:3306/log4j_schema log4j.appender.db.driver = com.mysql.jdbc.Driver log4j.appender.db.user = root log4j.appender.db.password = root log4j.appender.db.sql = insert into logs(level, logger, message, date_time) values('%p', '%c', '%m', '%d{yyyy-MM-dd HH:mm:ss}') log4j.appender.db.layout = org.apache.log4j.PatternLayout
public class JDBCAppenderTest { private Logger log = Logger.getLogger(JDBCAppenderTest.class); @Test public void testInfo() { log.info("log info message"); } @Test public void testError() { try { int randomNumber = ThreadLocalRandom.current().nextInt(2); randomNumber = 1 / randomNumber; } catch (Throwable e) { log.error(e); } } }
执行单元测试, 数据库表数据 :