热门标签 | 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细节注意


推荐阅读
  • 本文介绍了如何通过C#语言调用动态链接库(DLL)中的函数来实现IC卡的基本操作,包括初始化设备、设置密码模式、获取设备状态等,并详细展示了将TextBox中的数据写入IC卡的具体实现方法。 ... [详细]
  • 在1995年,Simon Plouffe 发现了一种特殊的求和方法来表示某些常数。两年后,Bailey 和 Borwein 在他们的论文中发表了这一发现,这种方法被命名为 Bailey-Borwein-Plouffe (BBP) 公式。该问题要求计算圆周率 π 的第 n 个十六进制数字。 ... [详细]
  • 本文将从基础概念入手,详细探讨SpringMVC框架中DispatcherServlet如何通过HandlerMapping进行请求分发,以及其背后的源码实现细节。 ... [详细]
  • 如何在PHP中安装Xdebug扩展
    本文介绍了如何从PECL下载并编译安装Xdebug扩展,以及如何配置PHP和PHPStorm以启用调试功能。 ... [详细]
  • 本文通过一个具体的实例,介绍如何利用TensorFlow框架来计算神经网络模型在多分类任务中的Top-K准确率。代码中包含了随机种子设置、模拟预测结果生成、真实标签生成以及准确率计算等步骤。 ... [详细]
  • 嵌套列表的扁平化处理
    本文介绍了一种方法,用于遍历嵌套列表中的每个元素。如果元素是整数,则将其添加到结果数组中;如果元素是一个列表,则递归地遍历这个列表。此方法特别适用于处理复杂数据结构中的嵌套列表。 ... [详细]
  • 本文探讨了程序员这一职业的本质,认为他们是专注于问题解决的专业人士。文章深入分析了他们的日常工作状态、个人品质以及面对挑战时的态度,强调了编程不仅是一项技术活动,更是个人成长和精神修炼的过程。 ... [详细]
  • 本文介绍了SIP(Session Initiation Protocol,会话发起协议)的基本概念、功能、消息格式及其实现机制。SIP是一种在IP网络上用于建立、管理和终止多媒体通信会话的应用层协议。 ... [详细]
  • 二维码的实现与应用
    本文介绍了二维码的基本概念、分类及其优缺点,并详细描述了如何使用Java编程语言结合第三方库(如ZXing和qrcode.jar)来实现二维码的生成与解析。 ... [详细]
  • 在日常生活中,支付宝已成为不可或缺的支付工具之一。本文将详细介绍如何通过支付宝实现免费提现,帮助用户更好地管理个人财务,避免不必要的手续费支出。 ... [详细]
  • 我的读书清单(持续更新)201705311.《一千零一夜》2006(四五年级)2.《中华上下五千年》2008(初一)3.《鲁滨孙漂流记》2008(初二)4.《钢铁是怎样炼成的》20 ... [详细]
  • 解决JavaScript中法语字符排序问题
    在开发一个使用JavaScript、HTML和CSS的Web应用时,遇到从SQLite数据库中提取的法语词汇排序不正确的问题,特别是带重音符号的字母未按预期排序。 ... [详细]
  • 探索AI智能机器人自动盈利系统的构建
    用户可通过支付198元押金及30元设备维护费租赁AI智能机器人,推荐他人加入可获得相应佣金。随着推荐人数的增加,用户将逐步解锁更高版本,享受更多收益。 ... [详细]
  • empty,isset首先都会检查变量是否存在,然后对变量值进行检测。而is_null只是直接检查变量值,是否为null,因此如果变量未定义就会出现错误!检测一个变量是否是null ... [详细]
  • 在处理大数据量的SQL分页查询时,通常需要执行两次查询来分别获取数据和总记录数。本文介绍了一种优化方法,通过单次查询同时返回分页数据和总记录数,从而提高查询效率。 ... [详细]
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社区 版权所有