前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >细说log4j之log4j 1.x

细说log4j之log4j 1.x

作者头像
编程随笔
发布2019-09-11 15:34:38
7080
发布2019-09-11 15:34:38
举报
文章被收录于专栏:后端开发随笔

官网:http://logging.apache.org/log4j/1.2/manual.html

三大组件:loggers,appenders,layouts。

Loggers Logger是一个层次化的结构,例如:“java”是“java.util”的父亲,是“java.util.Vector”的祖先。 在log4j中存在一个根Logger,它具备2个属性:(1)总是存在;(2)不能通过名称获取到,但是通过静态方法Logger.getRootLogger()获取到。 除了根Logger之外的其他Logger可以通过Logger.getLogger()方法实例化并返回实例化后的对象。 Logger可以指定级别,可选的日志级别包括:TRACE, DEBUG, INFO, WARN, ERROR,FATAL,这些日志级别在类org.apache.log4j.Level中定义。 log4j中的日志级别是有序的,他们的顺序关系是:TRACE < DEBUG < INFO < WARN < ERROR < FATAL。 而且,只能是低级别的日志可以记录高级别的日志。例如:如果C是一个Logger示例,且它被声明为INFO级别,那么它只能记录INFO及以上级别的日志:INFO,WARN,FATAL;不能记录比INGO级别低的日志:TRACE,DEBUG。 只要参数相同:static public Logger getLogger(String name)或static public Logger getLogger(Class clazz)将返回同一个示例对象,即:

代码语言:javascript
复制
Logger logger1 = Logger.getLogger(Test.class);
Logger logger2 = Logger.getLogger(Test.class);
System.out.println(logger1 == logger2); # 输出结果为true

实际上,getLogger(String name)和getLogger(Class clazz)实例化对象时调用的是同一个方法:LogManager.getLogger(clazz.getName())。

代码语言:javascript
复制
static public Logger getLogger(String name) {
  return LogManager.getLogger(name);
}

static public Logger getLogger(Class clazz) {
  return LogManager.getLogger(clazz.getName());
}

Appenders/Layouts Appender定义了日志输出目的地,log4j允许将日志输出到任何目的地(且可以同时将日志消息输出到多个目的地,及配置多个appender)。目前已经实现的输出路径如下:

代码语言:javascript
复制
- SyslogAppender:将日志消息发送到远程syslog程序
- SocketAppender:将日志消息发送远程日志服务器
- ConsoleAppender:将日志消息输出到控制台,默认为System.out
- DailyRollingFileAppender:按天为单位记录日志消息,存在线程同步问题(会丢失数据),建议使用RollingFileAppender
- RollingFileAppender:将日志消息输出到指定大小的文件中,可以根据指定大小将系统日志切割为多个文件

Layout则用于格式化日志消息,常用日志输出格式有:%d,%p,%t,%c,%m,%n。

举个例子:org.apache.log4j.PatternLayout指定格式为:%r [%t] %-5p %c - %m%n,则输出的日志结果为:

176 [main] INFO org.foo.Bar - Located nearest gas station

日志输出格式解释:

代码语言:javascript
复制
- %r:程序启动时间毫秒数
- %t:输出日志线程名称
- %-5p:日志级别
- %c:输出日志的logger实例名称
- %m%n:日志描述

更加详细的日志输出格式见:http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/PatternLayout.html

log4j配置 log4j 1.x配置可以有2种方式: (1)编程方式进行配置,不推荐。 (2)文件方式配置,支持xml和properties两种文件格式。

properties配置文件示例1(输出到控制台):

代码语言:javascript
复制
# Set root logger level to DEBUG and its only appender to A1.
log4j.rootLogger=DEBUG, A1

# A1 is set to be a ConsoleAppender.
log4j.appender.A1=org.apache.log4j.ConsoleAppender

# A1 uses PatternLayout.
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n

# 明确设置某个包及其子包下的输出的日志级别
log4j.logger.com.foo=WARN

properties配置文件示例2(输出到控制台以及文件):

代码语言:javascript
复制
log4j.rootLogger=debug, stdout, R
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
# Pattern to output the caller's file name and line number.
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n

log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=example.log
log4j.appender.R.MaxFileSize=100KB
# Keep one backup file
log4j.appender.R.MaxBackupIndex=1
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n

properties配置文件示例3(输出不同级别日志到不同文件)

代码语言:javascript
复制
### set log levels ###
log4j.rootLogger = DEBUG,CONSOLE,D,E

### 输出到控制台 ###
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 = %-d{yyyy-MM-dd HH:mm:ss} [%t] [%c] [%p] %m%n

### 输出到日志文件 ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = ${user.home}/log/test.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} [%p] %m%n

### 输出错误日志到指定文件 ###
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File = ${user.home}/log/test.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} [%p] %m%n

log4j初始化过程 (1)log4j根据系统变量值log4j.defaultInitOverride决定是否进行初始化过程,默认为true。 (2)根据变量值log4j.configuration指定配置文件,默认值为:log4j.properties。 (3)尝试将log4j.configuration变量值转换为URL。 (4)如果第(3)失败,即出现异常MalformedURLException,将调用org.apache.log4j.helpers.Loader.getResource(resource, Logger.class)方法在classpath路径下查找配置文件并返回URL。 (5)如果第(4)失败,放弃初始化;否则使用找到的该URL初始化log4j。默认使用PropertyConfigurator初始化,如果配置文件为xml格式,则使用DOMConfigurator初始化。

【参考】: http://www.codeceo.com/article/log4j-usage.html 最详细的Log4j使用教程

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-02-05 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
日志服务
日志服务(Cloud Log Service,CLS)是腾讯云提供的一站式日志服务平台,提供了从日志采集、日志存储到日志检索,图表分析、监控告警、日志投递等多项服务,协助用户通过日志来解决业务运维、服务监控、日志审计等场景问题。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档