热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

log4jlogger,Threshold,additivity细节注意

log4j使用比较简单,但是有许多需要注意的事项,这些事情不清楚经常会有日志出不来的问题,本文列举了常见的一些问题,阅读本文需要有一些log4j的使用经验。1.log4j下载,

log4j使用比较简单,但是有许多需要注意的事项,这些事情不清楚经常会有日志出不来的问题,本文列举了常见的一些问题,阅读本文需要有一些log4j的使用经验。

1.log4j下载,本文使用了slf4j作为接口,log4j作为实现类,maven配置


org.slf4j
slf4j-log4j12
1.6.4

2.根目录的配置

技术分享log4j.rootLogger=debug, A1 ,R
这个意思是日志的根日志的级别为debug,具体的日志的A1,R。什么是根日志呢?根日志就是所有的日志的父类,如果在代码中写入了没有配置的日志,这个时候就会找到根日志,如果输出的级别大于根日志的级别就会输出到根日志中,相当于根日志是默认的日志。

上面跟日志定义了两个输出源A1和R,这里需要对A1和R进行配置

A1的配置


log4j.appender.A1 = org.apache.log4j.DailyRollingFileAppender
log4j.appender.A1.File = d:/abc/test.log
log4j.appender.A1.Append = true
log4j.appender.A1.DatePattern=yyyy-ww
log4j.appender.A1.Threshold = info 
log4j.appender.A1.layout = org.apache.log4j.PatternLayout
log4j.appender.A1.layout.COnversionPattern=%5p %10d{yyyy-MM-dd HH:mm:ss} {%l} %m%n

对于以上配置不明白的可以google,这里要说的Threshold的配置,这里threshold的配置是info,但是rootlogger是debug。

代码:

Logger logger = LoggerFactory.getLogger("A1");
logger.debug("D");

logger.info("E");

这里只会输出info的日志,不会输出debug的日志,原因是rootLogger虽然定义了级别是debug,但是threshold的级别是info,info>debug所以只会输出info的日志,如果将rootlogger和A1的级别颠倒过来呢。

技术分享log4j.rootLogger=info, A1

    log4j.appender.A1.Threshold = debug


logger.debug("D");

logger.info("E");

这里只会输出info的日志,不会输出debug的日志,通过代码可以得到的结论是logger和threshold两者取中间日志级别大的.

除了rootlogger自己需要定义一个日志需要如何定义呢?

模仿A1写了一个B,如下:

log4j.appender.B= org.apache.log4j.DailyRollingFileAppender
log4j.additivity.C=false
log4j.appender.B.File = d:/abc/B.log
log4j.appender.B.Append = true
log4j.appender.B.DatePattern=yyyy-ww
log4j.appender.B.Threshold = INFO 
log4j.appender.B.layout = org.apache.log4j.PatternLayout
log4j.appender.B.layout.COnversionPattern=%5p %10d{yyyy-MM-dd HH:mm:ss} {%c:%l} %m%n

代码中使用Logger logger = LoggerFactory.getLogger("B")会输出日志么?答案是否定的。

因为只定了日志B但是没有定义在代码中的使用,需要加上以下配置:

log4j.logger.C=debug,B

这里定义了代码使用的配置,问题来了,我们在代码中使用的是C还是B。

答案是C,log4j.logger.name定义了代码中需要使用的名字,这里名字是C,日志级别是debug,appender的名字B,因为这里定义了appender的名字是B所以需要配置B的appender的配置。

配置好了,代码中这样使用Logger logger = LoggerFactory.getLogger("C");


日志C相当于新配置的日志,他的父日志就是我们开始说的rootlogger,也就是A1和R。在log4j中子日志输出,父日志也会相应的输出代码:

Logger logger = LoggerFactory.getLogger("C");

logger.debug("D");

logger.info("E");

在C的日志中debug的日志和info的日志都输出了,但是在A1的日志中只有info的日志,为什么呢?因为A1的threshold级别是info>debug所以只会输出info的信息。

如果A1没有设置自己的日志级别,但是log4j.rootLogger配置的日志级别高于C的级别会输出么,如下

log4j.rootLogger=error,A1

log4j.logger.C=debug,B

Logger logger = LoggerFactory.getLogger("C");

logger.debug("D");

logger.info("E");

rootlogger级别error大于C的级别debug,但是在A1的日志中debug和info的信息都输出了,这一块是相对难理解的,我的理解是如果rootlogger的实现日志中没有配置日志级别,即使rootlogger配置了日志级别对子日志的输出也没有限制全部输出。这一块需要记住。如果实现日志配置了threshold,则输出比实现日志级别大的日志。

如果子类不想让父类输出怎么办?需要一下配置:

 log4j.additivity.C=false

这样父类不管日志级别都不会输出了。

在log4j中rootlogger不配置也是可以的,不会报错,但是配置rootlogger是一个好的习惯,代码中如果出现了没有配置的日志,至少还有rootlogger可以记录日志。



log4j logger,Threshold,additivity细节注意


推荐阅读
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • 在project.properties添加#Projecttarget.targetandroid-19android.library.reference.1..Sliding ... [详细]
  • 本文介绍了一种解析GRE报文长度的方法,通过分析GRE报文头中的标志位来计算报文长度。具体实现步骤包括获取GRE报文头指针、提取标志位、计算报文长度等。该方法可以帮助用户准确地获取GRE报文的长度信息。 ... [详细]
  • 深入理解CSS中的margin属性及其应用场景
    本文主要介绍了CSS中的margin属性及其应用场景,包括垂直外边距合并、padding的使用时机、行内替换元素与费替换元素的区别、margin的基线、盒子的物理大小、显示大小、逻辑大小等知识点。通过深入理解这些概念,读者可以更好地掌握margin的用法和原理。同时,文中提供了一些相关的文档和规范供读者参考。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文介绍了指针的概念以及在函数调用时使用指针作为参数的情况。指针存放的是变量的地址,通过指针可以修改指针所指的变量的值。然而,如果想要修改指针的指向,就需要使用指针的引用。文章还通过一个简单的示例代码解释了指针的引用的使用方法,并思考了在修改指针的指向后,取指针的输出结果。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • PDF内容编辑的两种小方法,你知道怎么操作吗?
    本文介绍了两种PDF内容编辑的方法:迅捷PDF编辑器和Adobe Acrobat DC。使用迅捷PDF编辑器,用户可以通过选择需要更改的文字内容并设置字体形式、大小和颜色来编辑PDF文件。而使用Adobe Acrobat DC,则可以通过在软件中点击编辑来编辑PDF文件。PDF文件的编辑可以帮助办公人员进行文件内容的修改和定制。 ... [详细]
  • CentOS 6.5安装VMware Tools及共享文件夹显示问题解决方法
    本文介绍了在CentOS 6.5上安装VMware Tools及解决共享文件夹显示问题的方法。包括清空CD/DVD使用的ISO镜像文件、创建挂载目录、改变光驱设备的读写权限等步骤。最后给出了拷贝解压VMware Tools的操作。 ... [详细]
author-avatar
手机用户2502938557
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有