问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

log4j的详解

发布网友 发布时间:2022-07-24 20:42

我来回答

1个回答

热心网友 时间:2023-10-09 22:02

Log4j支持两种配置文件格式,一种是XML(标准通用标记语言下的一个应用)格式的文件,一种是Java特性文件log4j.properties(键=值)。下面将介绍使用log4j.properties文件作为配置文件的方法:
①、配置根Logger
Logger 负责处理日志记录的大部分操作。
其语法为:
log4j.rootLogger = [ level ] , appenderName, appenderName, …
其中,level 是日志记录的优先级,分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者自定义的级别。Log4j建议只使用四个级别,优先级从高到低分别是ERROR、WARN、INFO、DEBUG。通过在这里定义的级别,您可以控制到应用程序中相应级别的日志信息的开关。比如在这里定义了INFO级别,只有等于及高于这个级别的才进行处理,则应用程序中所有DEBUG级别的日志信息将不被打印出来。ALL:打印所有的日志,OFF:关闭所有的日志输出。 appenderName就是指定日志信息输出到哪个地方。可同时指定多个输出目的地。
②、配置日志信息输出目的地 Appender
Appender 负责控制日志记录操作的输出。
其语法为:
log4j.appender.appenderName = fully.qualified.name.of.appender.class
log4j.appender.appenderName.option1 = value1

log4j.appender.appenderName.optionN = valueN
这里的appenderName为在①里定义的,可任意起名。
其中,Log4j提供的appender有以下几种:
org.apache.log4j.ConsoleAppender(控制台),
org.apache.log4j.FileAppender(文件),
org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),
org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件),可通过log4j.appender.R.MaxFileSize=100KB设置文件大小,还可通过log4j.appender.R.MaxBackupIndex=1设置为保存一个备份文件。
org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
例如:log4j.appender.stdout=org.apache.log4j.ConsoleAppender
定义一个名为stdout的输出目的地,ConsoleAppender为控制台。
③、配置日志信息的格式(布局)Layout
Layout 负责格式化Appender的输出。
其语法为:
log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
log4j.appender.appenderName.layout.option1 = value1

log4j.appender.appenderName.layout.optionN = valueN
其中,Log4j提供的layout有以下几种:
org.apache.log4j.HTMLLayout(以HTML表格形式布局),
org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息) Log4J采用类似C语言中的printf函数的打印格式格式化日志信息,打印参数如下:
%m 输出代码中指定的消息;
%M 输出打印该条日志的方法名;
%p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL;
%r 输出自应用启动到输出该log信息耗费的毫秒数;
%c 输出所属的类目,通常就是所在类的全名;
%t 输出产生该日志事件的线程名;
%n 输出一个回车换行符,Windows平台为"rn”,Unix平台为"n”;
%d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyyy-MM-dd HH:mm:ss,SSS},输出类似:2002-10-18 22:10:28,921;
%l 输出日志事件的发生位置,及在代码中的行数。 我们在需要输出日志信息的类中做如下的三个工作:
1、导入所有需的commons-logging类:
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
2、在自己的类中定义一个org.apache.commons.logging.Log类的私有静态类成员:
private final Log log = LogFactory.getLog(getClass());
LogFactory.getLog()方法的参数使用的是当前类的class。
3、使用org.apache.commons.logging.Log类的成员方法输出日志信息:
if (log.isDebugEnabled()){
log.debug("111");
}
if (log.isInfoEnabled()){
log.info("222");
}
if (log.isWarnEnabled()){
log.warn("333");
}
if (log.isErrorEnabled()){
log.error("444");
}
if (log.isFatalEnabled()){
log.fatal("555");
}
2.3 如何应用记录器的层次
2.3.1 如何定义及获取不同层次的记录器
任何一个记录器的使用都有两个步骤:
1) 在配置文件中定义相应的记录器。
在配置文件中定义记录器的格式有两种
? 定义根记录器的格式为
log4j.rootLogger = [ level ], appendName1, appendName2, …appendNameN
? 定义一个非根记录器的格式为
log4j.logger.loggerName1 = [ level ], appendName1,…appendNameN
……
log4j.logger.loggerNameM = [ level ], appendName1, …appendNameN
我们可以定义任意个非根记录器。
2) 在代码中调用Logger类的取得记录器方法取得相应的记录器对象。
要取得根记录器对象可通过Logger.getRootLogger()函数,要取得非根记录器可通过Logger.getLogger()函数。
理论知道就讲到这里,纸上得来终觉浅,下面,我们来小小演练一下。
例4-a: package TestLog4j;import org.apache.log4j.Logger;import org.apache.log4j.PropertyConfigurator;import org.apache.log4j.Priority;import TestLog4j.TestLog4j2.TestLog4j2;public class TestLog4j{static Logger logger = Logger.getLogger(TestLog4j.class.getName()); //(2)public TestLog4j(){}public static void main(String[] args){//同时输出到控制台和一个文件的实例并实现了Logger的继承PropertyConfigurator.configure("F:\\nepalon\\log4j2.properties");logger.debug("Start of the main() in TestLog4j");logger.info("Just testing a log message with priority set to INFO");logger.warn("Just testing a log message with priority set to WARN");logger.error("Just testing a log message with priority set to ERROR");logger.fatal("Just testing a log message with priority set to FATAL");logger.log(Priority.WARN, "Testing a log message use a alternate form");logger.debug(TestLog4j.class.getName());TestLog4j2 testLog4j2 = new TestLog4j2(); //(1)testLog4j2.testLog();}}在类TestLog4j中我们调用了另一个类TestLog4j2,下面看一下类TestLog4j2的代码。例4-b:package TestLog4j.TestLog4j2;import org.apache.log4j.Logger;import org.apache.log4j.PropertyConfigurator;import org.apache.log4j.Priority;public class TestLog4j2{static Logger logger = Logger.getLogger(TestLog4j2.class.getName()); //(1)public TestLog4j2(){}public void testLog(){//同时输出到控制台和一个文件的实例PropertyConfigurator.configure("F:\\nepalon\\log4j2.properties");logger.debug("2Start of the main()");logger.info("2Just testing a log message with priority set to INFO");logger.warn("2Just testing a log message with priority set to WARN");logger.error("2Just testing a log message with priority set to ERROR");logger.fatal("2Just testing a log message with priority set to FATAL");logger.log(Priority.DEBUG, "Testing a log message use a alternate form");logger.debug("2End of the main()");}}最后我们来看一下配置文件。
例4-c:
log4j2.properties文件内容
#1区
#### Use two appenders, one to log to console, another to log to a file
log4j.rootLogger = debug, stdout,R
#2区
#Print only messages of priority WARN or higher for your category
log4j.logger.TestLog4j= , R
log4j.logger.TestLog4j.TestLog4j2=WARN
#3区
#### First appender writes to console
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
#4区
#### Second appender writes to a file
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=F:\\nepalon\\classes\\TestLog4j\\example.log
# Control the maximum log file size
log4j.appender.R.MaxFileSize=100KB
# Archive log files (one backup file here)
log4j.appender.R.MaxBackupIndex=1
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%d{yyyy-MM-dd hh:mm:ss}:%p %t %c - %m%n
先看一下运行结果。
在控制台中的结果为:
DEBUG [main] (?:?) - Start of the main() in TestLog4j
INFO [main] (?:?) - Just testing a log message with priority set to INFO
WARN [main] (?:?) - Just testing a log message with priority set to WARN
ERROR [main] (?:?) - Just testing a log message with priority set to ERROR
FATAL [main] (?:?) - Just testing a log message with priority set to FATAL
WARN [main] (?:?) - Testing a log message use a alternate form
DEBUG [main] (?:?) - TestLog4j.TestLog4j
WARN [main] (?:?) - 2Just testing a log message with priority set to WARN
ERROR [main] (?:?) - 2Just testing a log message with priority set to ERROR
FATAL [main] (?:?) - 2Just testing a log message with priority set to FATAL
输出文件的结果为:
2003-12-19 04:19:44:DEBUG main TestLog4j.TestLog4j - Start of the main() in TestLog4j
2003-12-19 04:19:44:INFO main TestLog4j.TestLog4j - Just testing a log message with priority set to INFO
2003-12-19 04:19:44:WARN main TestLog4j.TestLog4j - Just testing a log message with priority set to WARN
2003-12-19 04:19:44:ERROR main TestLog4j.TestLog4j - Just testing a log message with priority set to ERROR
2003-12-19 04:19:44:FATAL main TestLog4j.TestLog4j - Just testing a log message with priority set to FATAL
2003-12-19 04:19:44:WARN main TestLog4j.TestLog4j - Testing a log message use a alternate form
2003-12-19 04:19:44:DEBUG main TestLog4j.TestLog4j - TestLog4j.TestLog4j
2003-12-19 04:19:44:WARN main TestLog4j.TestLog4j2.TestLog4j2 - 2Just testing a log message with priority set to WARN
2003-12-19 04:19:44:ERROR main TestLog4j.TestLog4j2.TestLog4j2 - 2Just testing a log message with priority set to ERROR
2003-12-19 04:19:44:FATAL main TestLog4j.TestLog4j2.TestLog4j2 - 2Just testing a log message with priority set to FATAL
首先,先来看一下配置文件都有些什么东西。
1) 在1区中定义了一个根记录器。这个根记录器具有DEBUG级别并有一个名称为stdout的输出端appender。
2) 2区中的内容是这一节的重点,也是应用到记录器层次的地方,但其实也只有两句,充分体现了log4j的简单性。在这里,我们定义了两个名称分别为TestLog4j和TestLog4j.TestLog4j2设计器。
? 在定义TestLog4j记录器时没有指定级别,所以它的级别继承自它的父记录器,即根记录器,所以它的级别也为DEBUG。在定义TestLog4j记录器时又定义了一个名称为R的输出端,所以它的输出端有两个,一个从根记录器继承而来的名为stdout的输出端,另一个为在此定义的名为R的输出端。在此需要注意的是,在定义记录器时必须先定义记录器的级别,然后才是记录器的输出端。如果只想定义输出端而不定义级别,则虽然级别可以为空,但逗号分隔符不能省略。如定义TestLog4j记录器的做法。
? 在定义TestLog4j.TestLog4j2记录器时又指定了它的级别,由于一个记录器的级别只能有一个,所以新指定的级别将覆写掉它的父记录器的级别(这就象Java中的多态)。我们没有定义TestLog4j.TestLog4j2记录器的输出端,所以它的输出端将从它的父记录器中继承而来。它的父记录器为estLog4j记录器,所以它和estLog4j记录器一样具有两个名称分别为 stdout和R的输出端。
3) 剩下的3区和4区分别设置了两个输出端的参数值。
接下来,回到我们的代码,看一下是如何取得记录器,在取记录器时又发生了什么。
1) 例4-a中的代码(2)中,语句Logger.getLogger()中的参数TestLog4j.class.getName()的值为 TestLog4j. TestLog4j,所以此语句的结果是取得一个名为TestLog4j. TestLog4j的记录器的对象。但在配置文件中并没有定义这样的记录器,所以最终将返回与所需的名称TestLog4j. TestLog4j最接近的记录器对象,即名为TestLog4j的记录器的对象。
2) 例4-b中的代码(1)的原理与例4-a中的代码(2)相似,期望取得的是名为TestLog4j.TestLog4j2. TestLog4j2的记录器对象,但最终返回的是TestLog4j.TestLog4j2记录器的对象。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
2024年9月走亲访友黄道吉日 2024年9月哪天适合走亲访友 2024年7月5日是走亲访友的黄道吉日吗 2024年7月5日适合走亲访友吗 交强险还需要交车船税吗 测评| 平安家易保(家财险):限商品房,自住版、房东版、租客版 女的23岁去读大学年龄是不是太大了? 请问中国石化怎么操作?23.00元买入的,能继续持有吗?中国石化的股改是怎... 600028我是21元买入的,现已经跌到15元多了,怎么办呀?赔死了!!_百度知 ... 请问600028中国石化现在还可以买吗? ...一个游戏机插在电视上耍的那种小游戏,超级玛丽,冒险岛等,你们还玩... 最难小游戏排行榜(十大最难玩的家庭小游戏) log4j的配置问题 魔方cfop公式这么用啊 梦见脚后跟有个洞里面有只虫子 m.sosuo.name 梦见脚后跟有个洞,里边全是红豆,外边全是蚂蚁。。。吓死我了,好可怕好可怕。。。怎么回事??? 四阶魔方棱还原 四阶魔方对棱 四阶魔方如何一次对多棱 四阶魔方怎么对棱? 国家权力机关执行机关是什么 从佛山运大概一吨多点货去珠海斗门,请大家介绍口碑好的物流公司,如有价格表更好 珠海荣达物流有限公司怎么样? 珠海斗门天地华宇物流 珠海市德邦物流有限公司斗门井岸分公司怎么样? 广东申通物流有限公司珠海斗门分公司怎么样? 珠海斗门比较便宜的物流 珠海市德邦物流有限公司斗门新青分公司介绍? 梦见脚趾被砍掉,满是血。好不好? 梦见自已把自己的小脚趾砍掉一节 三阶魔方教程!点。横。v。三种情况公式 魔方v字公式 log4j配置问题 泰晶科技为什么一直不涨?2021年泰晶科技业绩预增?泰晶科技(603738)股民交流? 为什么泰晶科技 涨?泰晶科技2021年业绩预增?603738泰晶科技诊股同花顺? 603738 泰晶科技走势?泰晶科技的宏观经济分析?泰晶科技股票诊股手机? 泰晶科技为什么天天跌?2021年第三季度泰晶科技的业绩?603738泰晶科技诊股? 泰晶科技为什么连跌?泰晶科技什么时候出半年报?603738 泰晶科技诊股? 泰晶科技为什么没有涨?泰晶科技什么时候中报?603738泰晶科技个股诊断? 泰晶科技现在能买进吗?603738泰晶科技资金流向如何?泰晶科技股票估价上不去? 泰晶科技股票现在指数?泰晶科技现在股价是多少?泰晶科技603738新消息? 泰晶科技为什么几块钱?泰晶科技三季报披露时间?603738 泰晶科技年k线? 泰晶科技603738今日价格走势?泰晶科技股票的行业分析?603738泰晶科技 雪球? 中国特色社会主义政治建设的必然要求 中国近现代史纲要 中什么是 两个了解、三个必然选择 走中国特色社会主义政治发展道路应该做到哪三个必须 火命是什么意思 火命人的财富运势解析 火命代表什么意思 百度一下梦见自已的老公走上不归路是什么意思? 梦见脚有一个大洞,前段时间是脚指头有个洞,昨天梦见脚后跟有个洞 梦见自己脚破了窟窿,都看见里面的东西 一个手机怎么登录两个