说出来真是丢脸,最近被公司派到客户公司面试外包开发岗位,本来准备了什么 redis、rabbitMQ、SSM 框架的相关面试题以及自己做过的一些项目回顾,信心满满地去面试,结果别人一上来就问到了最近项目使用的日志系统是什么?日志级别是怎么配置的?当时我都蒙 X 了,平时都是项目经理搭的,我自己也是随便上网一搜往配置文件一黏贴就 OK 了。我就这么说完后面试官深深定了我一眼,当时我的内心羞愧到......
1.2 闲话少说,讲讲日志的发展故事(如果已经了解的可以跳过,直接看 1.3 日志配置)要想对日志技术实现深入了解,我个人建议去看:logback + slf4j。至于日志配置,还是了解 log4j 比较好,因为目前绝大部分的项目还是使用 log4j 的。好了,下面开始讲讲日志的发展故事:
1999 年,Apache 开源社区发布了 log4j,一时轰动整个程序界,从此成为日志的标准并广泛为 java 程序员所使用。随后 Sun 公司也在 JDK1.4 版本时发布了 Logging 机制(java.util.logging,以下简称 JUL),但是该机制并未获得公众的认可,真是可怜。不久 Apache 又推出了 commons-logging 日志框架(能够让开发者抽象日志实现方式而不必关注具体使用哪个日志技术,通俗地说就是你要用手机叫滴滴,如果你是在北京你就会叫来北京的滴滴,在香港你就会叫来香港的滴滴),该框架仿佛是对 Sun 公司的鄙睨,其可以自动查找调用当前环境下的日志技术进行日志输出,该日志框架可支持 log4j 或 JUL。commons-logging+log4j 在其后的很长一段时间内成为了 Java 日志的经典组合。然而之后 commons-logging 有一段时间没更新了,不知道是不是 commons-logging 当初的设计不够好,想再优化也比较多困难,为什么这么说呢?因为接下来一个优秀的日志框架 slf4j 诞生了,该作者 (Ceki Gülcü) 就是 log4j 的作者之一,他的 slf4j 设计上更优雅,并且他还实现了 logback 技术,也是比 log4j 更前沿。至此,日志体系由 commons-logging+log4j 一家独大的局面开始受到动摇,各种 commons-logging+log4j?slf4j+log4j?slf4j+logback?搭配,真是让人揪心。更恐怖的是,Ceki Gülcü 大佬又帮忙优化了 log4j,从此世界又多了一项日志技术 --log4j2。这是要学腾讯搞微信和 QQ 吗,真是 666。因此,如果大家想对日志技术深入了解的话,可以去找找 logback + slf4j 的相关资料。至于配置文件,我认为你就了解下我下面写的 log4j 配置详解就好了,毕竟现在还是比较多公司用 log4j 框架的。
1.3 进入正题,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: 输出代码中的行号
- 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类,一类如上配置是配置父类日志记录器的日志级别,第二类是配置子类日志记录器的日志级别,第三类是配置输出源(控制台、文件等)的日志级别。他们的日志级别解析优先级由低到高排列。具体表述原谅我说不清楚,直接
- 上案例,大家应该能够懂!
因此,从上述的案例中我们可以知道日志记录器和输出源输出日志级别存在 2 个逻辑关系:
所以在项目中可以按日下配置方式配置日志级别:
1.5 结束语
- #控制父类日志记录器的日志级别为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
到此,相信你日志配置有了基本的掌握了。文中有很多地方可能会有不对的地方,欢迎各位大侠指出。我也是为了能够深刻理解该技术的配置,才撰文总结,这样我就会对它有更深层次的理解了。
来源: https://www.cnblogs.com/tanshaoxiaoji/p/log4j_config.html