Java中 log4j日志级别配置详解

网友投稿 681 2023-02-28


Java中 log4j日志级别配置详解

1.1 前言

说出来真是丢脸,最近被公司派到客户公司面试外包开发岗位,本来准备了什么redis、rabbitMQ、SSM框架的相关面试题以及自己做过的一些项目回顾,信心满满地去面试,结果别人一上来就问到了最近项目使用的日志系统是什么?日志级别是怎么配置的?当时我都蒙X了,平时都是项目经理搭的,我自己也是随便上网一搜往配置文件一黏贴就OK了。我就这么说完后面试官深深定了我一眼,当时我的内心羞愧到......

1.2 闲话少说,讲讲日志的发展故事(如果已经了解的可以跳过,直接看1.3日志配置)

要想对日志技术实现深入了解,我个人建议去看:logback + slf4j。至于日志配置,还是了解log4j比较好,因为目前绝大部分的项目还是使用log4j的。好了,下面开始讲讲日志的发展故事:

1.3 进入正题,log4j日志基本配置

1.在项目的classpath下或者resource包下(maven项目)新建一个log4j.properties文件,初始项目配置如下参数就足够了,更详细配置可继

续看1.4 log4j日志级别配置;

#通过根日志记录器指定日志级别及输出源

#日志输出的优先级: debug < info < warn < error < fatal

#定义根日志记录器的日志级别(info)及输出源的别名(console,myFile)

#该定义让日志在控制台和文件输出,并且只输出info级别以上的日志

log4j.rootLogger=info,console,myFile

#######配置输出源console的具体实现为控制台输出#######

#定义输出源别名console(即根日志记录器定义的输出源)

#的实现类是ConsoleAppender(控制台输出源)log4j.appender.console=org.apache.log4j.ConsoleAppender

#指定日志输出格式的格式转换器为PatternLayout实现类

log4j.appender.console.layout=org.apache.log4j.PatternLayout

#定义日志输出的具体格式

log4j.appender.console.layout.ConversionPattern=%d %-5p [%c.%M()] - %m%n

#######配置输出源myFile的具体实现为文件输出#######

#定义输出源别名myFile(即根日志记录器定义的输出源)

#的实现类是RollingFileAppender(文件输出源)log4j.appender.myFile=org.apache.log4j.RollingFileAppender

#定义日志文件的存储路径

log4j.appender.myFile.File=src/log/logProperties/log4j.log

#定义日志文件的大小

log4j.appender.myFile.MaxFileSize=1024kb

#定义日志文件最多生成几个(从0开始算1个,即此处最多3个文件)

#超过该大小则会覆盖前面生成的文件

log4j.appender.myFile.MaxBackupIndex=2

#指定日志输出格式的格式转换器为PatternLayout实现类

log4j.appender.myFile.layout=org.apache.log4j.PatternLayout

#定义日志输出的具体格式

log4j.appender.console.layout.ConversionPattern=%d %-5p [%c.%M()] - %m%n

#######输出格式解释#######

#%d: 日志打印的时间点,默认格式为ISO8601,也可以另外指定格式,

#定义如下: %d{yyy年MM月dd日 HH时mm分ss秒SSS},则会输出:

#2018年01月06日 14时47分45秒590

#%p: 输出日志级别,即DEBUG,INFO,WARN,ERROR,FATAL

#%-5p:表示字符小于5位,则字符居左(不加“-”号则字符居右),你可以举一反三

#%c: 日志所在类的全名

#%M: 日志所在方法的名字

#%m: 日志信息

#%n: 输出一个回车换行符

#%L: 输出代码中的行号

2.调用日志测试配置结果。

import org.apache.log4j.LogManager;

import org.apache.log4j.Logger;

import org.apache.log4j.PropertyConfigurator;

public class LogPropertiesTest {

public static void main(String[] args) {

/*解析非classpath下的配置文件

String log4jPath=System.getProperty("user.dir")+"\\src\\log\\logProperties\\log4j.properties";

PropertyConfigurator.configure(log4jPath);*/

Logger log = LogManager.getLogger(LogPropertiesTest.class);

log.debug("调试");

log.info("信息");

log.warn("警告");

log.error("错误");

log.fatal("致命错误");

}

}

1.4日志级别配置

日志级别配置可分为3类,一类如上配置是配置父类日志记录器的日志级别,第二类是配置子类日志记录器的日志级别,第三类是配置输出源(控制台、文件等)的日志级别。他们的日志级别解析优先级由低到高排列。具体表述原谅我说不清楚,直接

上案例,大家应该能够懂!

1.如果配置(也必须要配置)了父类日志记录器(rootLogger)的日志级别(假设是INFO级别),没有配置子类日志记录器的日志级别,也没有配置输出源的日志级别,则输出源只能输出INFO级别以上的;

2.如果配置(也必须要配置)了父类日志记录器(rootLogger)的日志级别(假设是INFO级别),配置了子类日志记录器的日志级别(假设是DEBUG级别),没有配置输出源的日志级别,则输出源输出DEBUG级别以上的;

3.如果配置(也必须要配置)了父类日志记录器(rootLogger)的日志级别(假设是INFO级别),配置了子类日志记录器的日志级别(假设是DEBUG级别),配置了输出源的日志级别(假设是INFO级别),则输出源输出INFO级别以上的;

4.如果配置(也必须要配置)了父类日志记录器(rootLogger)的日志级别(假设是INFO级别),没有配置子类日志记录器的日志级别,配置

了输出源的日志级别(假设是DEBUG级别),则输出源输出INFO级别以上的;

因此,从上述的案例中我们可以知道日志记录器和输出源输出日志级别存在2个逻辑关系:

1.输出源如果没有定义日志级别,它会继承最接近它的子类日志记录器的日志级别;子类日志记录器没有定义日志级别,它会继承最接近它的父类日志记录器。

2.打印日志时输出源会根据自身定义的日志级别与最接近它的子类日志记录器定义的日志级别比较,如果输出源定义的级别高于子类日志记录器,则按输出源定义的日志级别输出日志,反之则按子类日志记录器的日志级别输出。

所以在项目中可以按日下配置方式配置日志级别:

#控制父类日志记录器的日志级别为info,默认所有模块下只输出info级别以上的日志

log4j.rootLogger=info,console

#单独控制某个模块下的日志级别为error,只有发生异常的时候才输出日志

log4j.logger.log.logProperties=error

#单独控制某个类的日志级别debug,方便输出调试信息

log4j.logger.log.logProperties.LogPropertiesTest=debug

############# 日志输出到控制台 #############

#日志输出到控制台使用的api类

log4j.appender.console=org.apache.log4j.ConsoleAppender

#指定当前输出源的日志级别,有了前面的配置,就不需要配置该项了

#log4j.appender.console.Threshold = info

#指定日志输出的格式:灵活的格式

log4j.appender.console.layout=org.apache.log4j.PatternLayout

#具体格式的内容

log4j.appender.console.layout.ConversionPattern=%d %-2p [%c.%M()] - %m%n

1.5结束语

到此,相信你日志配置有了基本的掌握了。文中有很多地方可能会有不对的地方,欢迎各位大侠指出。我也是为了能够深刻理解该技术的配置,才撰文总结,这样我就会对它有更深层次的理解了。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:关于开发https接口的信息
下一篇:Java基于二维数组实现的数独问题示例
相关文章

 发表评论

暂时没有评论,来抢沙发吧~