log4j已经是古董了,但是现在项目还在用,需要用到不同级别输出到不同文件,所以把几种实现方式记录下来,备忘!
下面的几种配置都是使用properties的情况,但是xml的原理也一样.

  1. 使用LevelRangeFilter
  2. 使用LevelMatchFilter
  3. 自定义Appender

    最后再贴出下面一种需求的配置文件

    1. 项目info和error级别日志分开记录为 allInfo,allError文件
    2. 其中A模块的日志单独记录为afile
    3. 其中A模块的info级别日志只在afile记录,不在allinfo记录(info只记录一次)
    4. 其中A模块的error级别日志在afile,allError中都记录

    下面详细说明:

1.使用LevelRangeFilter
这个应该是3种里面最方便的,配置如下
log4j.appender.InfoFile = org.apache.log4j.RollingFileAppender
log4j.appender.InfoFile.File = logs/info1.log
log4j.appender.InfoFile.MaxFileSize = 10MB
log4j.appender.InfoFile.Threshold = INFO
log4j.appender.InfoFile.layout = org.apache.log4j.PatternLayout
log4j.appender.InfoFile.layout.ConversionPattern =[%p] [%d{yyyy-MM-dd HH\:mm\:ss}][%c]%m%n
log4j.appender.InfoFile.filter.F1=org.apache.log4j.varia.LevelRangeFilter
log4j.appender.InfoFile.filter.F1.LevelMin=INFO
log4j.appender.InfoFile.filter.F1.LevelMax=INFO

这里通过Threshold指定输出级别为INFO,但是默认的大于INFO的也会输出.
下面增加的filter指定了最大级别和最小级别,都为INFO,所以最终只会输出INFO级别.

2.使用LevelMatchFilter
这个配置就稍微多点了,例如,我们输出INFO级别的,需要下面配置
log4j.appender.InfoFile2 = org.apache.log4j.RollingFileAppender
log4j.appender.InfoFile2.File = logs/info2.log
log4j.appender.InfoFile2.MaxFileSize = 10MB
log4j.appender.InfoFile2.Threshold = INFO
log4j.appender.InfoFile2.layout = org.apache.log4j.PatternLayout
log4j.appender.InfoFile2.layout.ConversionPattern =[%p] [%d{yyyy-MM-dd HH\:mm\:ss}][%c]%m%n
log4j.appender.InfoFile2.filter.F1=org.apache.log4j.varia.LevelMatchFilter
log4j.appender.InfoFile2.filter.F1.levelToMatch=INFO
log4j.appender.InfoFile2.filter.F1.AcceptOnMatch=true
log4j.appender.InfoFile2.filter.F2=org.apache.log4j.varia.LevelMatchFilter
log4j.appender.InfoFile2.filter.F2.levelToMatch=ERROR
log4j.appender.InfoFile2.filter.F2.AcceptOnMatch=false
log4j.appender.InfoFile2.filter.F3=org.apache.log4j.varia.LevelMatchFilter
log4j.appender.InfoFile2.filter.F3.levelToMatch=WARN
log4j.appender.InfoFile2.filter.F3.AcceptOnMatch=false
log4j.appender.InfoFile2.filter.F4=org.apache.log4j.varia.LevelMatchFilter
log4j.appender.InfoFile2.filter.F4.levelToMatch=DEBUG
log4j.appender.InfoFile2.filter.F4.AcceptOnMatch=false  

这里要注意的就是指定匹配级别INFO为true后,还需要把其他级别都设置为false,否则其他级别还是会输出(包括低于Threshold指定的级别).

3.自定义Appender
一种常见的配置文件如下
log4j.rootLogger=INFO,InfoFile3,errorFile3log4j.appender.InfoFile3 = org.apache.log4j.RollingFileAppender
log4j.appender.InfoFile3.File = logs/info3.log
log4j.appender.InfoFile3.MaxFileSize = 10MB
log4j.appender.InfoFile3.Threshold = INFO
log4j.appender.InfoFile3.layout = org.apache.log4j.PatternLayout
log4j.appender.InfoFile3.layout.ConversionPattern =[%p] [%d{yyyy-MM-dd HH\:mm\:ss}][%c]%m%nlog4j.appender.errorFile3 = org.apache.log4j.RollingFileAppender
log4j.appender.errorFile3.File = logs/error3.log
log4j.appender.errorFile3.MaxFileSize = 10MB
log4j.appender.errorFile3.Threshold = ERROR
log4j.appender.errorFile3.layout = org.apache.log4j.PatternLayout
log4j.appender.errorFile3.layout.ConversionPattern =[%p] [%d{yyyy-MM-dd HH\:mm\:ss}][%c]%m%n

这里我们通过Threshold已经指定了级别,但是由于默认的实现会输出大于等于指定级别的,所以我们可以修改下这个默认实现.

package com.dingcheng.log;import org.apache.log4j.Priority;
import org.apache.log4j.RollingFileAppender;public class MyRollingFileAppender extends RollingFileAppender {  @Override  public boolean isAsSevereAsThreshold(Priority priority) {  return this.getThreshold().equals(priority);  }
}

然后配置文件中使用自定义的类

log4j.rootLogger=INFO,InfoFile3,errorFile3log4j.appender.InfoFile3 = com.dingcheng.log.MyRollingFileAppender
log4j.appender.InfoFile3.File = logs/info3.log
log4j.appender.InfoFile3.MaxFileSize = 10MB
log4j.appender.InfoFile3.Threshold = INFO
log4j.appender.InfoFile3.layout = org.apache.log4j.PatternLayout
log4j.appender.InfoFile3.layout.ConversionPattern =[%p] [%d{yyyy-MM-dd HH\:mm\:ss}][%c]%m%nlog4j.appender.errorFile3 = com.dingcheng.log.MyRollingFileAppender
log4j.appender.errorFile3.File = logs/error3.log
log4j.appender.errorFile3.MaxFileSize = 10MB
log4j.appender.errorFile3.Threshold = ERROR
log4j.appender.errorFile3.layout = org.apache.log4j.PatternLayout
log4j.appender.errorFile3.layout.ConversionPattern =[%p] [%d{yyyy-MM-dd HH\:mm\:ss}][%c]%m%n

这样就可以了.

当然除了上面的3种方法,还有自定义一个类,里面不同级别指向不同的文件

public class LogUtil{public static void error(String msg) {Logger.getLogger("error").error(msg);}
}

方法很多,找个最简单的就可以了.

最后再贴出下面一种需求的配置文件
1. 项目info和error级别日志分开记录为 allInfo,allError文件
2. 其中A模块的日志单独记录为afile
3. 其中A模块的info级别日志只在afile记录,不在allinfo记录(info只记录一次)
4. 其中A模块的error级别日志在afile,allError中都记录

#根设置,输出级别为info级别, 输出文件为 allInfo,allError
log4j.rootLogger=INFO,allInfo,allError  #定义allInfo的详细配置,只记录info级别
log4j.appender.allInfo = org.apache.log4j.RollingFileAppender
log4j.appender.allInfo.File = /logs/allInfo.log
log4j.appender.allInfo.MaxFileSize = 50MB
log4j.appender.allInfo.Threshold = INFO
log4j.appender.allInfo.layout = org.apache.log4j.PatternLayout
log4j.appender.allInfo.layout.ConversionPattern =[%p] %-d{yyyy-MM-dd HH:mm:ss} [%t] [%l]--> %m %x %n
log4j.appender.allInfo.filter.F1=org.apache.log4j.varia.LevelRangeFilter
log4j.appender.allInfo.filter.F1.LevelMin=INFO
log4j.appender.allInfo.filter.F1.LevelMax=INFO#定义allError的详细配置,只记录error级别
log4j.appender.allError = org.apache.log4j.RollingFileAppender
log4j.appender.allError.File = /data/wuliu-provider/logs/order-error.log
log4j.appender.allError.MaxFileSize = 50MB
log4j.appender.allError.Threshold = ERROR
log4j.appender.allError.layout = org.apache.log4j.PatternLayout
log4j.appender.allError.layout.ConversionPattern=[%p] %-d{yyyy-MM-dd HH:mm:ss} [%t] [%l]--> %m %x %n#A模块单独配置,输出级别为INFO,输出文件为 afile,allError ; additivity=false指定不继承根设置
log4j.logger.AMODULE=INFO,afile,allError
log4j.additivity.AMODULE = false
log4j.appender.afile = org.apache.log4j.RollingFileAppender
log4j.appender.afile.File = /data/wuliu-provider/logs/YuanCheng.log
log4j.appender.afile.MaxFileSize = 50MB
log4j.appender.afile.Threshold = INFO
log4j.appender.afile.layout = org.apache.log4j.PatternLayout
log4j.appender.afile.layout.ConversionPattern =[%p] %d{yyyy-MM-dd HH\:mm\:ss} [%c]%m%n

在代码中使用A模块的单独输出,则

private static Logger logger = Logger.getLogger("AMODULE");//指定配置文件中的名称

Log4j不同级别输出到不同文件的几种方式相关推荐

  1. linux 命令输出保存为文件的三种方式

    一.ls >2.txt        将ls命令直接保存到home文件夹下的2.txt,命令窗口无显示 二.ls | tee 2.txt    也是直接保存在了home文件夹下的2.txt,命令 ...

  2. spark中将数据输出到json文件的两种方式

    在学习spark时,我们经常遇到要将数据写进一个json文件中的案例.通常的案例就是,给我们一个普通文件,然后我们用sparkcore或者sparkSQL,遍历文件内容后,按照需求将再将遍历后得到的数 ...

  3. 查看binlog文件的2种方式

    2019独角兽企业重金招聘Python工程师标准>>> 查看binlog文件的2种方式 1.使用show binlog events a.获取binlog文件列表 mysql> ...

  4. Java下载文件的几种方式

    public HttpServletResponse download(String path, HttpServletResponse response) {try {// path是指欲下载的文件 ...

  5. C# 读取XML文件的几种方式

    在开发过程中,我们有时会需要保存到本地一些结构化数据或者配置信息,这时就可以选择用xml文件.当然xml的用途也不仅仅是这些. 这一篇来谈一谈关于读取xml文件的几种方式: 我们有以下两个文件,一个是 ...

  6. KEIL / MDK生成BIN文件的两种方式

    KEIL / MDK生成BIN文件的两种方式 1 KEIL工程配置入口 点击"魔术棒"图标(Option for Target) 在After Build/Rebuild选项卡中, ...

  7. java解析xml文件的几种方式(DOM解析)

    好久不用的东西,今天居然被面试官问到了.那既然这样,我们就一起回顾下java解析xml文件的几种方式吧. DOM解析 dom解析所需依赖是我们jdk自带的,所以只需要使用jdk为我们提供的接口即可上手 ...

  8. linux 删除文件的几种方式

    linux 删除文件的几种方式 创建.删除和修改文件是用户在 Linux 系统中执行的非常常见操作.大家都知道,在 Linux 系统里使用 rm 命令删除单个文件时,几乎一瞬间就完成了.但是如果文件数 ...

  9. JVM 在遇到OOM(OutOfMemoryError)时生成Dump文件的三种方式

    JVM 在遇到OOM(OutOfMemoryError)时生成Dump文件的三种方式,以及如何使用Eclips Memory Analyzer(MAT)插件进行堆内存分析. 方法一: jmap -du ...

  10. java读取XML文件的四种方式

    java读取XML文件的四种方式 Xml代码 <?xml version="1.0" encoding="GB2312"?> <RESULT& ...

最新文章

  1. kafka的一些常用命令
  2. 逆向工程、软件后门……原来美剧《硅谷》里藏着这么多知识点
  3. mysql三个字段最优索引_mysql 多列索引优化
  4. Create a PCL visualizer in Qt with QtDesigner
  5. opencv java match_OpenCV模板匹配函数matchTemplate详解
  6. 决胜大数据时代:HadoopYarnSpark企业级最佳实践(3天)
  7. BZOJ 3043 IncDec Sequence:反向差分
  8. Android ListView几个重要属性
  9. python处理ncdc气象数据并利用arcgis可视化
  10. 【POJ - 3624 】Charm Bracelet (dp,0-1背包裸题)
  11. projecteuler_介绍#ProjectEuler100挑战:编码成就的“黑暗灵魂”
  12. #C++初学记录(阶乘#递归)
  13. Andrew Ng机器学习公开课笔记 -- Logistic Regression
  14. mac上好用的下载器有哪些,mac下载种子用什么软件
  15. JavaScript页面跳转
  16. SIM800A 建立网络
  17. 一个免费在线文件处理网站-HEIC转JPG Word转长图 PPT转长图 转成JPG 转成PNG 转成BMP(保姆级图文)
  18. html,css使用表格制作课程表
  19. 标准差(standard deviation)和标准误差(standard error)你能解释清楚吗?
  20. idea环境:Could not initialize class net.sf.cglib.beans.BeanMap

热门文章

  1. 在Python环境下使用pgmpy构建动态贝叶斯网络并进行参数学习(附详细代码)
  2. 如何制作自己的Visio图标
  3. SWF是什么文件,SWF文件用什么软件可以打开
  4. 成人高考计算机基础历年真题,成人高考历年真题及答案
  5. C#,SharpGL开发的3D图表控件
  6. 3D控件Aspose.3D 8月新版V17.8发布 | 支持6面多维地图
  7. LFSR(线性反馈移位寄存器)
  8. ansys_apdl使用教程
  9. 【数学建模】模糊综合评价模型
  10. Oracle开发实战经典教程(教学视频)