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日志基本配置

  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结束语

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


 

原文地址:https://www.cnblogs.com/tanshaoxiaoji/p/log4j_config.html

时间: 2024-10-27 09:01:20

java log4j基本配置及日志级别配置详解的相关文章

Java学习-007-Log4J 日志记录配置文件详解及实例源代码

此文主要讲述在初学 Java 时,常用的 Log4J 日志记录配置文件详解及实例源代码整理.希望能对初学 Java 编程的亲们有所帮助.若有不足之处,敬请大神指正,不胜感激!源代码测试通过日期为:2015-1-30 13:54:02,请知悉. 所需的 jar 包下载链接为:http://yunpan.cn/cKE56sxqtQCfP  访问密码 63d8 有关 Log4J 日志文件中日志级别及文件配置的详细情况,在 Log4J 的配置文件(xml.properties)中有详细的介绍,敬请参阅!

GPIO 配置之ODR, BSRR, BRR 详解

STM32 GPIO 配置之ODR, BSRR, BRR 详解 用stm32 的配置GPIO 来控制LED 显示状态,可用ODR,BSRR,BRR 直接来控制引脚输出状态. ODR寄存器可读可写:既能控制管脚为高电平,也能控制管脚为低电平. 管脚对于位写1 gpio 管脚为高电平,写 0 为低电平 BSRR 只写寄存器:[color=Red]既能控制管脚为高电平,也能控制管脚为低电平.对寄存器高 16bit 写1 对应管脚为低电平,对寄存器低16bit写1对应管脚为高电平.写 0 ,无动作 BR

197vpn配置热门pc端步骤详解

197vpn配置热门pc端步骤详解 在使用197vpn的时候会面临到各种的系统情况,不同的系统配置vpn进行使用的方法也是不同的,下面我们来看看当前热门的pc端系统中vpn是如何配置的呢? Windows 7 在画面右下角,点选网络连接,然后选择"打开网络共享中心": 在弹出的对话窗口中,选择"设置新的连接或网络": 选择"连接到工作区",然后选择"使用我的Internet连接(VPN),通过Internet使用虚拟专用网络(VPN)来

(转)STM32 GPIO 配置之ODR, BSRR, BRR 详解

用stm32 的配置GPIO 来控制LED 显示状态,可用ODR,BSRR,BRR 直接来控制引脚输出状态.ODR寄存器可读可写:既能控制管脚为高电平,也能控制管脚为低电平.管脚对于位写1 gpio 管脚为高电平,写 0 为低电平BSRR 只写寄存器:既能控制管脚为高电平,也能控制管脚为低电平.对寄存器高 16bit 写1 对应管脚为低电平,对寄存器低16bit写1对应管脚为高电平.写 0 ,无动作BRR 只写寄存器:只能改变管脚状态为低电平,对寄存器 管脚对于位写 1 相应管脚会为低电平.写

新书《Nginx实战:基于Lua语言的配置、开发与架构详解》开始发售

新书<Nginx实战:基于Lua语言的配置.开发与架构详解>开始发售https://item.jd.com/12487157.html#none <Nginx实战:基于Lua语言的配置.开发与架构详解>主要讲解了Nginx在反向代理和应用开发中的作用,阅读本书可以了解Nginx在互联网开发中扮演的多个角色,充分利用这些角色的各项功能有助于提升服务的整体性能.<Nginx实战:基于Lua语言的配置.开发与架构详解>所介绍的大部分功能是通过Nginx+Lua进行开发和配置的

Linux01-Linux日志系统syslog详解55

一.日志系统 1.日志系统:syslog() 信息详细程序:日志级别 日志子系统:facility 日志记录动作:Action Linux上的日志系统: syslog syslog-ng: syslog-ng作为syslog的替代工具,可以完全替代syslog的服务,并且通过定义规则,实现更好的过滤功能 系统启动过程的日志: kernel --> 物理终端(/dev/console) --> /var/log/dmesg 查看日志命令: dmesg /var/log/dmesg cat /va

JAVA 注解的几大作用及使用方法详解

JAVA 注解的几大作用及使用方法详解 (2013-01-22 15:13:04) 转载▼ 标签: java 注解 杂谈 分类: Java java 注解,从名字上看是注释,解释.但功能却不仅仅是注释那么简单.注解(Annotation) 为我们在代码中添加信息提供了一种形式化的方法,是我们可以在稍后 某个时刻方便地使用这些数据(通过 解析注解 来使用这些数据),常见的作用有以下几种: 1.生成文档.这是最常见的,也是java 最早提供的注解.常用的有@see @param @return 等:

Java研究之学习设计模式-简单工厂模式详解

 简介: 从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一.简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例. 类图: 从UML类图中,可以看出,简单工厂模式的意思,就是把一个类内部,需要生成的部分,提取出来,变为一个工厂,通过工厂来new对象. 假设我们要吃苹果了,我们可以在代码中new一个苹果出来:当我们需要吃香蕉了,我们在代码中new一个香蕉出来.这种做法你会不会觉得麻烦

JSch - Java实现的SFTP(文件上传详解篇) 转

JSch是Java Secure Channel的缩写.JSch是一个SSH2的纯Java实现.它允许你连接到一个SSH服务器,并且可以使用端口转发,X11转发,文件传输等,当然你也可以集成它的功能到你自己的应用程序. 本文只介绍如何使用JSch实现的SFTP功能. SFTP是Secure File Transfer Protocol的缩写,安全文件传送协议.可以为传输文件提供一种安全的加密方法.SFTP 为 SSH的一部份,是一种传输文件到服务器的安全方式.SFTP是使用加密传输认证信息和传输