当前位置: 首页 > news >正文

Log4J 如何分开Logger输出

今天和两个同事讨论Log4j,他们都需要解决一个问题,怎么分开输出Logger。这么讲不清楚,举个例子:

package com.gmail.at.ankyhe.log4jtest;

import org.apache.log4j.Logger;

public class ClassA {
	
	private static Logger logger = Logger.getLogger(ClassA.class.getName());
	
	public ClassA() {
		logger.info("ENTER ClassA()");
	}
	
	public void foo() {
		logger.info("foo()");
		bar();
	}
	
	public void bar() {
		Logger myLog = Logger.getLogger("bar");
		myLog.debug("bar()D");
		myLog.info("bar()I");
	}

}

 我希望bar可以输出到一个地方,其他的logger可以输出到一个地方。一般的配置文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/' >

  <appender name="myConsole" class="org.apache.log4j.ConsoleAppender">
    <layout class="org.apache.log4j.PatternLayout">
      <param name="ConversionPattern"  
        value="[%d{dd HH:mm:ss,SSS\} %-5p] [%t] %c{2\} - %m%n" />
    </layout>
  </appender>

  <appender name="myFile" class="org.apache.log4j.RollingFileAppender">  
    <param name="File" value="xml.log" />
    <param name="Append" value="false" />
    <param name="MaxBackupIndex" value="10" />
    <layout class="org.apache.log4j.PatternLayout">
      <param name="ConversionPattern" value="%p (%c:%L)- %m%n" />
    </layout>
  </appender>


  <logger name="bar">
    <level value="info" /> 
    <appender-ref ref="myConsole" /> 
  </logger>
  
  <root>
    <priority value="debug" />
    <appender-ref ref="myFile" />
  </root>
</log4j:configuration>

 这样会发现一个问题,myLog的输出又会在文件,又会在终端。原因在Log4J官方的Introduction讲的很清楚:

http://logging.apache.org/log4j/1.2/manual.html  搜索Appender Additivity. 我解释一下就是默认情况下bar会集成root的输出。知道了原因,那怎么修改就简单了。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/' >

  <appender name="myConsole" class="org.apache.log4j.ConsoleAppender">
    <layout class="org.apache.log4j.PatternLayout">
      <param name="ConversionPattern"  
        value="[%d{dd HH:mm:ss,SSS\} %-5p] [%t] %c{2\} - %m%n" />
    </layout>
  </appender>

  <appender name="myFile" class="org.apache.log4j.RollingFileAppender">  
    <param name="File" value="xml.log" />
    <param name="Append" value="false" />
    <param name="MaxBackupIndex" value="10" />
    <layout class="org.apache.log4j.PatternLayout">
      <param name="ConversionPattern" value="%p (%c:%L)- %m%n" />
    </layout>
  </appender>


  <logger name="bar" additivity="false">
    <level value="info" /> 
    <appender-ref ref="myConsole" /> 
  </logger>
  
  <root>
    <priority value="debug" />
    <appender-ref ref="myFile" />
  </root>
</log4j:configuration>

 唯一的区别是在bar那个logger后面加了一个 additivity="false"。我试了一下,可以按照要求工作。这是xml的配置,一般的property的配置如下:

log4j.rootLogger=DEBUG, FA
log4j.category.bar = INFO, CA
log4j.additivity.bar = false

#Console Appender

log4j.appender.CA=org.apache.log4j.ConsoleAppender
log4j.appender.CA.layout=org.apache.log4j.PatternLayout
log4j.appender.CA.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n

#File Appender
log4j.appender.FA=org.apache.log4j.FileAppender
log4j.appender.FA.File=property.log
log4j.appender.FA.layout=org.apache.log4j.PatternLayout
log4j.appender.FA.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n

           

 

相关文章:

  • github开源库(三)
  • Windows 的 SHELL 程序 Babun
  • Android手机字体自适应屏幕大小
  • 虚拟化之vmware DirectPath I/O
  • 個人資料管理的網頁系統
  • 正则表达式的使用
  • REHL LINUX 配置本地yum源的方法
  • 排序算法整理__参考MoreWindows
  • JavaScript中模块“写法”
  • JavaScript操作XML文档
  • 利用windows批处理文件定时备份数据库
  • LINUX网络编程(TCP)(3)
  • 项目私活 【抢小米手机软件】能够做的朋友,能够联系社区
  • 二进制文件和ASCII文件有何差别
  • 实战6 Nginx的web日志导入到MongoDB数据库
  • [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  • angular学习第一篇-----环境搭建
  • Apache Spark Streaming 使用实例
  • C++类中的特殊成员函数
  • CSS3 变换
  • Netty 4.1 源代码学习:线程模型
  • 阿里云Kubernetes容器服务上体验Knative
  • 闭包--闭包之tab栏切换(四)
  • 记录一下第一次使用npm
  • 记一次删除Git记录中的大文件的过程
  • 坑!为什么View.startAnimation不起作用?
  • 力扣(LeetCode)21
  • 面试总结JavaScript篇
  • 事件委托的小应用
  • 这几个编码小技巧将令你 PHP 代码更加简洁
  • FaaS 的简单实践
  • zabbix3.2监控linux磁盘IO
  • 宾利慕尚创始人典藏版国内首秀,2025年前实现全系车型电动化 | 2019上海车展 ...
  • ​ArcGIS Pro 如何批量删除字段
  • ​七周四次课(5月9日)iptables filter表案例、iptables nat表应用
  • #《AI中文版》V3 第 1 章 概述
  • $(function(){})与(function($){....})(jQuery)的区别
  • (52)只出现一次的数字III
  • (8)Linux使用C语言读取proc/stat等cpu使用数据
  • (c语言)strcpy函数用法
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (三)Pytorch快速搭建卷积神经网络模型实现手写数字识别(代码+详细注解)
  • (转)scrum常见工具列表
  • (转)我也是一只IT小小鸟
  • .NET 6 Mysql Canal (CDC 增量同步,捕获变更数据) 案例版
  • .net 使用$.ajax实现从前台调用后台方法(包含静态方法和非静态方法调用)
  • .net 微服务 服务保护 自动重试 Polly
  • .net 桌面开发 运行一阵子就自动关闭_聊城旋转门家用价格大约是多少,全自动旋转门,期待合作...
  • .NetCore Flurl.Http 升级到4.0后 https 无法建立SSL连接
  • .net打印*三角形
  • .Net转Java自学之路—SpringMVC框架篇六(异常处理)
  • .xml 下拉列表_RecyclerView嵌套recyclerview实现二级下拉列表,包含自定义IOS对话框...
  • @GlobalLock注解作用与原理解析
  • [ vulhub漏洞复现篇 ] JBOSS AS 4.x以下反序列化远程代码执行漏洞CVE-2017-7504
  • [ACTF2020 新生赛]Include