软件开发和维护过程中,日志是必不可少的工具,对于一个10万行规模的产品,要分析它的某一部分,最简单的方法是将log4j配置文件的rootLogger的输出级别设置为debug,但这样将使产品的所有部分的debug信息都输出,一方面会对产品性能产生巨大影响,另一方面所关心部分的debug信息会淹没在其他debug日志里,比较好的解决方法是 将这一部分的debug日志单独输出到一个新的日志文件里进行分析 ,下面 以指令平台为例说明实现方法。原始的log4j.properties文件如下:

log4j.rootLogger=INFO,stdout,R,errorlogger

log4j.appender.stdout=org.apache.log4j.ConsoleAppender

log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

log4j.appender.stdout.layout.ConversionPattern=[%p] [%d] [%c - %L] - [%m]%n

log4j.appender.stdout.Threshold=INFO

log4j.appender.R=org.apache.log4j.RollingFileAppender

log4j.appender.R.layout=org.apache.log4j.PatternLayout

log4j.appender.R.layout.ConversionPattern=[%p] [%d] [%c - %L] - [%m]%n

log4j.appender.R.Threshold=INFO

log4j.appender.R.File=../log/godu.log

log4j.appender.R.MaxFileSize=20MB

log4j.appender.R.MaxBackupIndex=5

log4j.appender.errorlogger=org.apache.log4j.RollingFileAppender

log4j.appender.errorlogger.layout=org.apache.log4j.PatternLayout

log4j.appender.errorlogger.layout.ConversionPattern=[%p] [%d] [%c] - [%m]%n

log4j.appender.errorlogger.Threshold=ERROR

log4j.appender.errorlogger.File=../log/error.log

log4j.appender.errorlogger.MaxFileSize=20MB

log4j.appender.errorlogger.MaxBackupIndex=5

可以看到这里定义了3个rootLogger(默认输出级别是INFO):stdout向屏幕输出,R记录普通信息(指向godu.log,输出级别为INFO),errorlogger指向error.log,用来记录错误日志(ERROR及以上级别的日志)。现在我们要分析鉴权部分的工作过程,鉴权类都在com.boco.godu.framework.auth包里,要将这个包下所有类的debug信息输出到auth.log里。实现方法是在配置文件中增加一个专门处理auth包的logger:

log4j.logger.com.boco.godu.framework.auth=DEBUG,authDebuger

log4j.additivity.com.boco.godu.framework.auth=false

log4j.appender.authDebuger=org.apache.log4j.RollingFileAppender

log4j.appender.authDebuger.File=../log/auth.log

log4j.appender.authDebuger.Append=false

log4j.appender.authDebuger.MaxFileSize=2MB

log4j.appender.authDebuger.MaxBackupIndex=10

log4j.appender.authDebuger.layout=org.apache.log4j.PatternLayout

log4j.appender.authDebuger.layout.ConversionPattern=%d{MM-dd HH:mm:ss,SSS} %t %c,%L %p - %m%n

所以, 包一级定制logger的方法是 :

log4j.logger.=OUTPUT_LEVEL, logger_name

此logger的appender, layout的定义方法与rootLogger一样。上面第二行的作用是 避免详细日志写入rootLogger日志 ,否则新产生的大量debug日志会将之前已有的godu.log(以及godu.log.1等)冲掉,在现场环境下尤其要注意。它的一般形式是:

log4j.additivity.=false

这样就保证了auth包的debug日志不写入godu.log,additivity的默认值是true,所以如果不定义additivity,默认debug日志分别写入godu.log和auth.log中。实验发现指定rootLogger的输出级别(log4j.appender.R.Threshold=INFO)也可以避免debug日志写入godu.log里,但定义additivity更明确,是更好的方法。

除了用来输出详细日志, 包一级定制还有一个用处:屏蔽输出 。如果不需要某些包的日志,只要将它的输出级别调高就可以了。例如我们不想看到mina包的info日志,只有mina报错才写日志,可以做如下处理:

log4j.logger.org.apache.mina=WARN

在包一级定制log4j日志输出的更多相关文章

  1. log4j日志输出级别变更

    1.   现阶段log4j日志输出配置 示例:基础服务日志配置 #DEBUG < INFO < WARN < ERROR < FATAL\u65E5\u5FD7\u7684\u ...

  2. web项目Log4j日志输出路径配置问题

    问题描述:一个web项目想在一个tomcat下运行多个实例(通过修改war包名称的实现),然后每个实例都将日志输出到tomcat的logs目录下实例名命名的文件夹下进行区分查看每个实例日志,要求通过尽 ...

  3. log4j日志输出使用教程

    Log4j是帮助开发人员进行日志输出管理的API类库.它最重要的特点就可以配置文件灵活的设置日志信息的优先级.日志信息的输出目的地以及日志信息的输出格式.Log4j除了可以记录程序运行日志信息外还有一 ...

  4. Mybatis 的Log4j日志输出问题 - 以及有关日志的所有问题

    使用Mybatis的时候,有些时候能输出(主要是指sql,参数,结果)日志.有些时候就不能. 无法输出日志的时候,无论怎么配置log4j,不管是properties的还是xml的,都不起作用. 有些时 ...

  5. log4j日志输出框架

    什么是log4j框架呢? log4j是一个日志输出框架,用于输出日志的.比如MyBatis的日志就是通过log4j输出的,主流框架都是log4j输出的,Spring框架 也可以通过log4j输出日志! ...

  6. log4j日志输出到日志文件中和控制台中 +log4j配置详解

    1.引入log4j的jar包 https://mvnrepository.com/,可以找到log4j的jar和依赖. 2.创建log4j.properties,并配置log4j #设置日志的级别 , ...

  7. log4j日志输出使用_1

    转自https://www.cnblogs.com/sky230/p/5759831.html Log4j是帮助开发人员进行日志输出管理的API类库.它最重要的特点就可以配置文件灵活的设置日志信息的优 ...

  8. log4j日志输出到文件的配置

    1.Maven的dependency 2.log4j.properties的配置 3.Junit的Test类 4.web.xml的配置(非必要) 5.spring的db.config的配置(非必要) ...

  9. Log4j 日志输出学习(Eclipse)

    学习网址1:http://www.cnblogs.com/licheng/archive/2008/08/23/1274566.html 一.快速入手 1.官网下载log4j压缩包,本地加压 2.Ec ...

随机推荐

  1. Docker:Centos7更新yum源下载docker

    前言: Docker 要求 CentOS 系统(6.5及以上)的内核版本高于 3.10 ,查看本页面的前提条件来验证你的CentOS 版本是否支持 Docker . 通过 uname -r 命令查看你 ...

  2. Vector ArrayList LinkedList

    三者都实现了List接口! Vector与ArrayList:采用顺序存储的方式,但是Vector是线程安全的,ArrayList是线程不安全的,按需使用: 当存储空间不足的时候,ArrayList默 ...

  3. [小技巧] Notepad++关闭拼写检查

    From : http://blog.csdn.net/xuefeng0707/article/details/18272989 把[插件]-[DSpellCheck]-[Spell Check Do ...

  4. take for granted

    解释含义1 Take for granted是一句地道的英语口语,意思是to expect someone to always be there and do things for you even ...

  5. ESP32-websocket笔记

    基于ESP-IDF4.1 #include <stdio.h> #include "esp_wifi.h" #include "esp_system.h&qu ...

  6. Java | this的本质 和 static的本质

    this 在说this之前先说一下,对象创建的过程: 1.分配对象空间,并将对象成员变量初始化. 2.执行属性值的显式初始化. 3.执行构造方法. 4.返回相关的地址给相关的对象.   this的本质 ...

  7. IBM刀箱服务器的SW

    刀箱交换机说明: 1.刀箱交换机可以看到的24个口都是ext端口,其中因为授权原因,只激活了前10个端口. 2.交换机配置中的inta端口为服务器直接连接的端口,inta1-inta14,这些都是对应 ...

  8. Python装饰器、迭代器&生成器、re正则表达式、字符串格式化

    Python装饰器.迭代器&生成器.re正则表达式.字符串格式化 本章内容: 装饰器 迭代器 & 生成器 re 正则表达式 字符串格式化 装饰器 装饰器是一个很著名的设计模式,经常被用 ...

  9. 【LeetCode】930. 和相同的二元子数组

    930. 和相同的二元子数组 知识点:数组:前缀和: 题目描述 给你一个二元数组 nums ,和一个整数 goal ,请你统计并返回有多少个和为 goal 的 非空 子数组. 子数组 是数组的一段连续 ...

  10. Python+Requests+Re(正则)爬取某糗事百科图片(数据分析一)

    1.博客目前在学习爬虫课程,使用正则表达式来爬取网页的图片信息 2.下面我们一起来回归下Python中的正则使用方式/方法 3.糗事百科图片爬取源码如下: import requestsimport ...