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: ...
随机推荐
- python自动化运维四:nmap端口扫描
p { margin-bottom: 0.25cm; line-height: 120% } a:link { } 端口扫描器: Python的第三方模块python-nmap可以实现高效的端口扫描. ...
- Appium元素定位
一.定位工具(UIAutomator) 运行系统条件: 1)Android Studio 2)系统版本:sdk 要求api18以及以上 打开:Android SDK ---Too ...
- Ngnix+tomcat负载均衡
系统环境 Centos6.5 nginx1.4.7 https://nginx.org/download/nginx-1.4.7.tar.gz tomcat7.0.79 http://apache. ...
- elasticsearch映射
前面讲到,无论是关系型数据库还是非关系型数据库,乃至elasticsearch这种事实上承担着一定储存作用的搜索引擎,数据类型都是非常重要而基础的概念.但elasticsearch与其它承担着数据存储 ...
- Python学习笔记之运算符之一
算数运算符 +加法运算符 -减法运算符 *乘法运算符 /除法运算符 //整除运算符 **乘积运算符(幂运算符) %取模运算符(取余) #!/usr/bin/python # -*- coding: U ...
- Groovy Script in SoapUI REST Testing
1. Run special step: testRunner.runTestStepByName("stepName/requestName") get it's respons ...
- docfx (一)
什么是docFX? DocFX 是一个基于.NET的API文档生成器,当前支持 C# 和 VB.它可以通过你的代码中的三斜杠注释生成 API 参考文档.同样也支持你使用 Markdown 文件创建一些 ...
- SVG视野
前面的话 SVG中坐标系统非常关键,但在介绍坐标系统之前,首先要了解视野.本文将详细介绍SVG视野 视野 下面来区分视窗.世界和视野 [视窗] SVG的属性width.height来控制视窗的大小,也 ...
- MVC导入命名空间
为什么要导入 一次性导入,避免每个页面都要导入,代码看起来更为清晰,不再带一个长长的命名空间,视图里面可以直接写类名了. 导入方法 在Views文件夹的web.config的namespaces里面配 ...
- union-find算法Java实现
package practice; /*在一个全是点的图中,循环选择两点连通,之后判断两点是否在同一通路*/ public class Testmain { public static void ma ...