Log4J:Log4J三大组件:Logger+Appender+Layout 格式化编程详解
快速了解Log4J
Log4J的三个组件:
Logger:日志记录器,负责收集处理日志记录 (如何处理日志)
Appender:日志输出目的地,负责日志的输出 (输出到什么 地方)
Layout:日志格式化,负责对输出的日志格式化(以什么形式展现)

类结构图(来自http://www.blogjava.net/DLevin/archive/2012/06/28/381667.html)
一个logger可以对应多个appender,一个appender只能对应一个layout。
1、Logger:
logger可以有选择的启动和禁用日志的输出,我们经常会在各种框架中看到如:
- private static final Logger log = LoggerFactory.getLogger(XX.class);
log就代表了一个Logger实例,他的name就是类“XX”的full quailied name(类的全限定名),按照上图所述,这个log就可以指定多个appender和layout。Logger的名字大小写敏感,其命名有继承机制:例如:name为org.apache.commons的logger会继承name为org.apache的logger。
Log4J中有一个特殊的logger叫做“root”,他是所有logger的根,也就意味着其他所有的logger都会直接或者间接地继承自root。root logger可以用Logger.getRootLogger()方法获取,但是不能通过Logger.getLogger("root")获得。可以代码测试验证:
- Logger root = Logger.getRootLogger();
- Logger log = Logger.getLogger("root");
- System.out.println(log==root); //false 说明root无法通过name获取
- Logger log2 = Logger.getLogger("root");
- System.out.println(log==log2); //true,说明一个name唯一对应一个logger
2、Level:
level为logger服务,用来定义日志的级别,他的值可以是: OFF(关闭)FATAL(致命的) ERROR(错误)WARN(警告) INFO(信息)DEBUG (调试) ALL(所有),输出日志的策略由此Level决定,例如:如果logger的Level设置为INFO,那么系统只输出INFO以及以上(WARN、ERROR、FATAL)信息。如果当前logger没有设定Level,那么它在输出日志时采用的策略是:它会使用它继承的Logger的Level作为它自己的Level来处理。如果它的上级也没有设置Level,那么就找上上级,几次类推,直到root为止,(root的Level是不能设为空的,所以最终一定会找到一个Level)。默认root的Level是INFO,其他logger的Level默认都是null,需要手动指定。
Level对应的logger输出级别对应的方法有:
- logger.debug(message); Log4J:Log4J三大组件:Logger+Appender+Layout 格式化编程详解
- logger.info(message);
- logger.warn(message);
- logger.error(message);
- logger.fatal(message);
3、Appender:
Appender可以控制日志的输出的目的地,一个输出源就叫一个Appender,appender的类别有:Console(控制台)File(文件)JDBC、JMS等等,logger可以通过方法logger.addAppender(appender);配置多个appender,对logger来说,每个有效的日志请求结果都将输出到logger本身以及父logger的appender上。例如:
- Logger com = Logger.getLogger("com");
- Appender appender = new FileAppender(new SimpleLayout(),"hello.log");
- com.addAppender( appender);
- Logger iteye = Logger.getLogger("com.iteye");
- iteye.addAppender(new ConsoleAppender(new SimpleLayout(), "System.out")); //target:sys.out(default) 或 sys.err
- iteye.info("hello world");
上例中,“iteye”是继承“com ”logger的,"com"定义的appender是FileAppender,而"iteye"定义的appender是ConsoleAppender,这里我并没有设置他们的Level,那么自动使用root默认的INFO作为日志的的等级,因此此处iteye.info(“hello world")会被输出到指定的appender上。注意:这里"iteye" 并没有设置FileAppender作为自己的appender,但是最终日志信息会显示在控制台,而且也会输出到文件hello.log中去。不过这里可以通过设置logger ”iteye"的additivity(附加标记)设为false ==》iteye.setAdditivity(false);这样日志信息“hello world”就不会写入到hello.log中去了。
常用的集中appender有:
org.apache.log4j.ConsoleAppender(控制台)
org.apache.log4j.FileAppender(文件)
org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)
org.apache.log4j.RollingFileAppender((文件大小到达指定尺寸的时候产生一个新的文件)
org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
4、Layout:
使用指定的Layout来展示(格式化)日志,常见的Layout有:
org.apache.log4j.HTMLLayout(以HTML表格形式布局)
org.apache.log4j.PatternLayout(可以灵活地指定布局模式)
org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串)
org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息),更多
5、配置:
理解了以上几个组建后,我们就可以了解一下log4j的配置log4j.properties了。
- #配置根Logger
- log4j.rootLogger = [ level ] , appenderName1 , appenderName2 , …
- #例子:
- log4j.rootLogger = DEBUG , stdout ,file
- #配置日志信息输出目的地(Appender)
- log4j.appender.appenderName = fully.qualified.name.of.appender.class
- log4j.appender.appenderName.option1 = value1
- …
- log4j.appender.appenderName.optionN = valueN
- #例子
- ### 输出到控制台 ###
- log4j.appender.stdout = org.apache.log4j.ConsoleAppender
- log4j.appender.stdout.Target = System.out #默认就是System.out,另外一个值是System.error
- log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
- log4j.appender.stdout.layout.ConversionPattern = %d{ABSOLUTE} %5p %c{ 1 }:%L - %m%n
- ### 输出到文件 ###
- log4j.appender.file = org.apache.log4j.DailyRollingFileAppender
- log4j.appender.file.File = logs/log.log
- log4j.appender.file.Append = true #默认就是true,系统启动时追加至文件中,否则会覆盖原有内容
- log4j.appender.file.Threshold = INFO ## 输出IFNO级别以上的日志,这里的意思是rootLogger设置为DEBUG时,只输出INFO以上(INFO、WARN、ERROR、FATAL)的信息到文件中去,而DEBUG信息就不会输出了
- log4j.appender.file.layout = org.apache.log4j.PatternLayout
- log4j.appender.file.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
- #配置日志信息的格式(Layout)
- log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
- log4j.appender.appenderName.layout.option1 = value1
- …
- log4j.appender.appenderName.layout.optionN = valueN
- #例子
- log4j.appender.file.layout = org.apache.log4j.PatternLayout
- log4j.appender.file.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
- ConversionPattern参数的格式含义
- 格式名 含义
- %c 输出日志信息所属的类的全名
- %d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy-MM-dd HH:mm:ss },输出类似:2002-10-18- 22:10:28
- %f 输出日志信息所属的类的类名
- %l 输出日志事件的发生位置,即输出日志信息的语句处于它所在的类的第几行
- %m 输出代码中指定的信息,如log(message)中的message
- %n 输出一个回车换行符,Windows平台为“rn”,Unix平台为“n”
- %p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL。如果是调用debug()输出的,则为DEBUG,依此类推
- %r 输出自应用启动到输出该日志信息所耗费的毫秒数
- %t 输出产生该日志事件的线程名
最后如果你看到此类错误应该有不再感到疑惑了吧:
- public static org.slf4j.Logger log = LoggerFactory.getLogger(Test.class);
- log.error("erro");
log4j:WARN No appenders could be found for logger (Test).
log4j:WARN Please initialize the log4j system properly.
Log4J:Log4J三大组件:Logger+Appender+Layout 格式化编程详解的更多相关文章
- Android-Universal-Image-Loader三大组件DisplayImageOptions、ImageLoader、ImageLoaderConfiguration详解
一.介绍 Android-Universal-Image-Loader是一个开源的UI组件程序,该项目的目的是提供一个可重复使用的仪器为异步图像加载,缓存和显示.所以,如果你的程序里需要这个功能的话, ...
- ORACLE——日期时间格式化参数详解 之一
2.日期格式化参数详解 2.1 -/,.;: 指定返回字串分隔符 SQL> select to_char(sysdate,'yyyy.mm.dd') from dual; TO_CHAR(SYS ...
- SpringBoot2 整合Kafka组件,应用案例和流程详解
本文源码:GitHub·点这里 || GitEE·点这里 一.搭建Kafka环境 1.下载解压 -- 下载 wget http://mirror.bit.edu.cn/apache/kafka/2.2 ...
- python接口自动化(三十九)- logger 日志 - 上(超详解)
简介 Python的logging模块提供了通用的日志系统,可以方便第三方模块或者是应用使用.这个模块提供不同的日志级别,并可以采用不同的方式记录日志,比如文件,HTTP GET/POST,SMTP, ...
- ExtJS布局方式(layout)图文详解
Auto默认布局 不给下级组件指定大小和位置 Absolute绝对布局 可使用坐标(x.y)进行布局 Accordion手风琴布局 实现Accordion效果的布局,也可叫可折叠布局.也就是说使用该布 ...
- Android layout 布局 属性详解
第一类:属性值 true或者 false android:layout_centerHrizontal 水平居中 android:layout_centerVertical ...
- string.Format格式化用法详解
1.格式化货币(跟系统的环境有关,中文系统默认格式化人民币,英文系统格式化美元) string.Format("{0:C}",0.2) 结果为:¥0.20 (英文操作系统结果:$0 ...
- Magento布局layout.xml文件详解
解析顺序 布局xml文件一般位于app/design/{area}/{package}/{theme}/layout/目录下.Layout文件一般包含block.reference.action三种标 ...
- React Native - 网页组件(WebView)的使用详解
一.WebView组件介绍 使用 WebView 组件我们可以通过 url 来加载显示一个网页,也可以传入一段 html 代码来显示.下面对其主要属性和方法进行介绍. 1,属性介绍 source: ...
随机推荐
- iOS app 的 ASLR
这两天逆向一个程序,发现每次image list -o -f 之后,它的基地址都是0x00000,也就是偏移地址是0. 想到这个应该是载入内存时有没有启用偏移有关,于是找了下答案:aslr 百度百科 ...
- oracle撤销表空间和回滚段
/* 撤销表空间 */ 通过使用撤销技术,能够为Oracle数据库提供以下功能: * 使用ROLLBACK语句撤销事务 * 进行数据库恢复 * 提供数据的读一致性 Oracle强烈建议DBA在Orac ...
- Maven详解(六)------ 生命周期
1.什么是 生命周期? Maven 强大的原因是有一个十分完善的生命周期,生命周期可以理解为项目构建步骤的集合,它定义了各个构建环节的执行顺序,有了这个顺序,Maven 就可以自动化的执行构建命令. ...
- 转每天一个linux命令(7):mv命令
mv命令是move的缩写,可以用来移动文件或者将文件改名(move (rename) files),是Linux系统下常用的命令,经常用来备份文件或者目录. 1.命令格式: mv [选项] 源文件或目 ...
- 最大流dinic模板
循环版,点的编号从0开始: ; ; const int INF = 0x3f3f3f3f; struct Edge { int to, next, cap, flow; }edge[MAXM]; in ...
- Java开发相关命名规范
JAVA文件命名规范 1.类命名 抽象类以 Abstract 或者 Base 开头.异常类以 Exception 作为后缀.枚举类以 Enum 作为后缀.工具类以 Utils 作为后缀(相应的包名最后 ...
- spring boot / cloud (八) 使用RestTemplate来构建远程调用服务
spring boot / cloud (八) 使用RestTemplate来构建远程调用服务 前言 上周因家里突发急事,请假一周,故博客没有正常更新 RestTemplate介绍: RestTemp ...
- 利用WHID为隔离主机建立隐秘通道
0 引言 从2014年BADUSB出现以后,USB-HID攻击就这一直被关注,且具争议.争议的焦点是USB-HID的实战效果过于“鸡肋”,无论从早期的BADUSB,还是到后来的各种USB-HID设备, ...
- Git安装配置(完整版)
首先安装Windows客户端的git和TortoiseGit. 安装这两个软件还是蛮重要的,很多选项不能乱选. 为了写个完整的博客,我是装了又卸,卸了又装. 1.安装git 下载:https://gi ...
- 转载 远程用户连接mysql授权
授权法: 在安装mysql的机器上运行: 1.d:\mysql\bin\>mysql -h localhost -u root //这样应该可以进入MySQL服务器 2.mysql> ...