使用log4j配置将业务功能日志分离

      最近在查找一个第三方jar包程序异常的原因,通过导出插桩输出日志跟踪参数信息,在海量日志中查找输出内容非常不方便,考虑到log4j支持分类记录日志,将关心的包日志输出到专有的日志文件可以提高跟踪效率,在此记录下处理方法,以一个至简的Hello World为例进行记录。

      首先为了引入依赖的简便,直接使用Maven模板新建Java项目,在此之前应该在Eclipse的Window->Preferences->Maven中正确设置Maven的安装目录和本地库,新建项目采用Maven Project的Quikstart模板,这里命名为MyApp.hello,首先引入日志框架依赖,pom.xml文件内容如下所示。

<project xmlns="http://maven.apache.org/POM/4.0.0"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<groupId>MyApp</groupId>
	<artifactId>hello</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>

	<name>hello</name>
	<url>http://maven.apache.org</url>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
	</properties>

	<dependencies>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>3.8.1</version>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-log4j12</artifactId>
			<version>1.7.2</version>
		</dependency>
	</dependencies>
</project>

      然在新建代表不同业务功能的Java类置于不同的包,涉及的三个类源码如下。

package MyApp.hello;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import MyApp.hello.sub1.DomainOne;
import MyApp.hello.sub2.DomainTwo;

public class App {
	private static final Logger logger = LoggerFactory.getLogger(App.class);

	public static void main(String[] args) throws Exception {
		for (int i = 0; i < 20; i++) {
			logger.debug("This is a debug message in root logger.");
			DomainOne.printLog("This is a debug message in domain one logger.");
			DomainTwo.printLog("This is a debug message in domain two logger.");
			Thread.sleep(1000);
		}
		System.out.println("Hello World!");
	}
}
package MyApp.hello.sub1;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class DomainOne {
	private static final Logger logger = LoggerFactory.getLogger(DomainOne.class);

	public static void printLog(String message) {
		logger.debug(message);
	}
}
package MyApp.hello.sub2;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class DomainTwo {
	private static final Logger logger = LoggerFactory.getLogger(DomainTwo.class);

	public static void printLog(String message) {
		logger.debug(message);
	}
}

      在src/main/java目录下新建log4j.properties文件,配置一个根日志输出,分别至控制台和日志文件,另分别对两个子包配置单独的日志输出。

log4j.rootLogger = DEBUG,console,logfile

#Console output
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.ImmediateFlush = true
log4j.appender.console.Target = System.err
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern = %d - %c - %-4r [%t] %-5p %c %x - %m %n

#File output
log4j.appender.logfile = org.apache.log4j.RollingFileAppender
log4j.appender.logfile.File = log.txt
log4j.appender.logfile.Append = true
log4j.appender.logfile.MaxFileSize = 1MB
log4j.appender.logfile.MaxBackupIndex = 3
log4j.appender.logfile.layout = org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern =%d - %c - %-5r [%t] %-5p %c %x - %m %n

#Domain one
log4j.logger.MyApp.hello.sub1= DEBUG, sub1
log4j.additivity.MyApp.hello.sub1=false
log4j.appender.sub1=org.apache.log4j.RollingFileAppender
log4j.appender.sub1.File = log_sub1.txt
log4j.appender.sub1.Append = true
log4j.appender.sub1.MaxFileSize = 1MB
log4j.appender.sub1.MaxBackupIndex = 3
log4j.appender.sub1.layout = org.apache.log4j.PatternLayout
log4j.appender.sub1.layout.ConversionPattern =%d - %c - %-5r [%t] %-5p %c %x - %m %n

#Domain two
log4j.logger.MyApp.hello.sub2= DEBUG, sub2
log4j.additivity.MyApp.hello.sub2=false
log4j.appender.sub2=org.apache.log4j.RollingFileAppender
log4j.appender.sub2.File = log_sub2.txt
log4j.appender.sub2.Append = true
log4j.appender.sub2.MaxFileSize = 1MB
log4j.appender.sub2.MaxBackupIndex = 3
log4j.appender.sub2.layout = org.apache.log4j.PatternLayout
log4j.appender.sub2.layout.ConversionPattern =%d - %c - %-5r [%t] %-5p %c %x - %m %n

      其中log4j.additivity.MyApp.hello.sub1=false表示该日志不输出到父日志中,缺省为true,这样就会重复记录。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值