java log4j基本配置及日志级别配置详解
java log4j日志级别配置详解
1.1 前言
说出来真是丢脸,最近被公司派到客户公司面试外包开发岗位,本来准备了什么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日志基本配置
- 在项目的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: 输出代码中的行号 - 调用日志测试配置结果。
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类,一类如上配置是配置父类日志记录器的日志级别,第二类是配置子类日志记录器的日志级别,第三类是配置输出源(控制台、文件等)的日志级别。他们的日志级别解析优先级由低到高排列。具体表述原谅我说不清楚,直接
上案例,大家应该能够懂!
- 如果配置(也必须要配置)了父类日志记录器(rootLogger)的日志级别(假设是INFO级别),没有配置子类日志记录器的日志级别,也没有配置输出源的日志级别,则输出源只能输出INFO级别以上的;
- 如果配置(也必须要配置)了父类日志记录器(rootLogger)的日志级别(假设是INFO级别),配置了子类日志记录器的日志级别(假设是DEBUG级别),没有配置输出源的日志级别,则输出源输出DEBUG级别以上的;
- 如果配置(也必须要配置)了父类日志记录器(rootLogger)的日志级别(假设是INFO级别),配置了子类日志记录器的日志级别(假设是DEBUG级别),配置了输出源的日志级别(假设是INFO级别),则输出源输出INFO级别以上的;
- 如果配置(也必须要配置)了父类日志记录器(rootLogger)的日志级别(假设是INFO级别),没有配置子类日志记录器的日志级别,配置了输出源的日志级别(假设是DEBUG级别),则输出源输出INFO级别以上的;
因此,从上述的案例中我们可以知道日志记录器和输出源输出日志级别存在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结束语
到此,相信你日志配置有了基本的掌握了。文中有很多地方可能会有不对的地方,欢迎各位大侠指出。我也是为了能够深刻理解该技术的配置,才撰文总结,这样我就会对它有更深层次的理解了。
java log4j基本配置及日志级别配置详解的更多相关文章
- 52. spring boot日志升级篇—log4j多环境不同日志级别的控制【从零开始学Spring Boot】
在上一章节中我们介绍了,仅通过log4j-spring.properties对日志级别进行控制,对于需要多环境部署的环境不是很方便,可能我们在开发环境大部分模块需要采用DEBUG级别,在测试环境可能需 ...
- 《手把手教你》系列基础篇(八十六)-java+ selenium自动化测试-框架设计基础-Log4j实现日志输出(详解教程)
1.简介 自动化测试中如何输出日志文件.任何软件,都会涉及到日志输出.所以,在测试人员报bug,特别是崩溃的bug,一般都要提供软件产品的日志文件.开发通过看日志文件,知道这个崩溃产生的原因,至少知道 ...
- Java学习-007-Log4J 日志记录配置文件详解及实例源代码
此文主要讲述在初学 Java 时,常用的 Log4J 日志记录配置文件详解及实例源代码整理.希望能对初学 Java 编程的亲们有所帮助.若有不足之处,敬请大神指正,不胜感激!源代码测试通过日期为:20 ...
- 《手把手教你》系列基础篇(九十五)-java+ selenium自动化测试-框架之设计篇-java实现自定义日志输出(详解教程)
1.简介 前面宏哥一连几篇介绍如何通过开源jar包Log4j.jar.log4j2.jar和logback实现日志文件输出,Log4j和logback确实很强大,能生成三种日志文件,一种是保存到磁盘的 ...
- GPIO 配置之ODR, BSRR, BRR 详解
STM32 GPIO 配置之ODR, BSRR, BRR 详解 用stm32 的配置GPIO 来控制LED 显示状态,可用ODR,BSRR,BRR 直接来控制引脚输出状态. ODR寄存器可读可写:既能 ...
- centos7.2环境nginx+mysql+php-fpm+svn配置walle自动化部署系统详解
centos7.2环境nginx+mysql+php-fpm+svn配置walle自动化部署系统详解 操作系统:centos 7.2 x86_64 安装walle系统服务端 1.以下安装,均在宿主机( ...
- STM32 GPIO 配置之ODR, BSRR, BRR 详解
STM32 GPIO 配置之ODR, BSRR, BRR 详解 用stm32 的配置GPIO 来控制LED 显示状态,可用ODR,BSRR,BRR 直接来控制引脚输出状态. ODR寄存器可读可写:既能 ...
- JAVA 注解的几大作用及使用方法详解
JAVA 注解的几大作用及使用方法详解 (2013-01-22 15:13:04) 转载▼ 标签: java 注解 杂谈 分类: Java java 注解,从名字上看是注释,解释.但功能却不仅仅是注释 ...
- Java开源生鲜电商平台-盈利模式详解(源码可下载)
Java开源生鲜电商平台-盈利模式详解(源码可下载) 该平台提供一个联合买家与卖家的一个平台.(类似淘宝购物,这里指的是食材的购买.) 平台有以下的盈利模式:(类似的平台有美菜网,食材网等) 1. 订 ...
随机推荐
- CCF-201503-2-数字排序
问题描述 试题编号: 201503-2 试题名称: 数字排序 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 给定n个整数,请统计出每个整数出现的次数,按出现次数从多到少的顺序 ...
- 【本地资源路径&&网络资源路径&&正反斜杠在Java中的用法】
一.概念和用法 左正右反 先来看看转义字符的概念:通过 \ ,?来转变后面字母或符号的含义.意思就是改变字母本身的含义. 以"\"符号为例,JAVA中有很多操作,例如文件操作等,需 ...
- vue页面切换效果(slide效果切换)
最近碰到一个需求,单页应用里面页面切换的效果需要做成跟轮播图滑动slide一样,让这个页面在切换时感觉是一个页面.反复琢磨的vue里面的transition,最终将实现的核心代码贴出来.这里实现的是上 ...
- 》》ajax加蒙版
在与后台交互时,用时过长.禁止页面操作等,有提示,增强页面体验: $.ajax({ type:'POST',url:url,data:obj,dataType:'json',beforeSend: f ...
- 八皇后問題 (C語言递归實現 回溯法)
八皇后问题是一个以国际象棋为背景的问题:怎样可以在 8×8 的国际象棋棋盘上放置八个皇后,使得不论什么一个皇后都无法直接吃掉其它的皇后?为了达到此目的.任两个皇后都不能处于同一条横行.纵行或斜线上.現 ...
- Implement Queue using Stacks(用栈实现队列)
Implement the following operations of a queue using stacks. push(x) -- Push element x to the back of ...
- Linux基础:xargs命令
简介 xargs可以将输入内容(通常通过命令行管道传递),转成后续命令的参数,通常用途有: 命令组合:尤其是一些命令不支持管道输入,比如ls. 避免参数过长:xargs可以通过-nx来将参数分组,避免 ...
- cs231n --- 3 : Convolutional Neural Networks (CNNs / ConvNets)
CNN介绍 与之前的神经网络不同之处在于,CNN明确指定了输入就是图像,这允许我们将某些特征编码到CNN的结构中去,不仅易于实现,还能极大减少网络的参数. 一. 结构概述 与一般的神经网络不同,卷积神 ...
- intellij idea 在什么地方打开终端Terminal
File→Plugins→Terminal 勾选它,点击Apply,点击Restart即可如果是要启动terminal则必须先做完上面动作,才可以点击Tools→Open Terminal... 来达 ...
- JaveScript用二分法与普通遍历(冒泡)
二分法 查找 概念: 从有序的数列中,折半查找. 思路: --> 找到数组中最中间的元素,将其作为基准 --> 从0开始判断数组中的元素,与基准进行比较 --> 比基准小的元素,存入 ...