`
ajwyyan
  • 浏览: 2893 次
  • 性别: Icon_minigender_1
  • 来自: 江西
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

Log4j动态输出日志

阅读更多
项目中有这么一个需求,要求对要对指定包的所有下一级包的类进行日志隔离。如要对package1的下级包进行日志隔离,然后有package1.subpackage1,package1.subpackage2........等包,需要将subpackage1下所有类(包括所有下级包的类)产生的日志输出到subpackage1.log文件中,subpackage2下的日志输出到subpackage2.log中。问过一些同事,也在网上问过一些朋友,最终找到了解决方案,重写一个Appender。所有代码如下:

DynamicWtriteLogAppender.java

package com.xiaoyf.loger
import java.text.MessageFormat;

import org.apache.log4j.Category;
import org.apache.log4j.Logger;
import org.apache.log4j.helpers.LogLog;
import org.apache.log4j.spi.LocationInfo;
import org.apache.log4j.spi.LoggingEvent;

/**
 * 
 * @author xiaoYF
 *
 */
public class DynamicWtriteLogAppender extends FileAppender{
	
	/**
	 * 输出日志方式
	 */
	private int type = 0;
	
	/**
	 * 设置日志输出方式
	 * @param type </br>
	 *        <strong>0:</strong>将日志统一输出到以当前Logger的别名为文件名的文件中,</br>
	 *          如配置为:log4j.category.package1 = info , package1,日志就都输出到package1.log中</br>
	 *        <strong>1:</strong>按下级包分别输出么各自的文件中</br>
	 *          如配置为:log4j.category.package1 = info , package1,</br>
	 *          日志是由package1.subpackage1包下的类(包括下级包的类)产生的产生的,日志统一输出到</br>
	 *          subpackage1.log中</br>
	 *        <strong>2:</strong>按包输出日志,如配置为:log4j.category.package1 = info , package1,</br>
	 *          日志是由package1.subpackage1.package1包下的类产生的产生的日志统一输出到package1.log中,</br>
	 *          package1.subpackage1下包下的类产生的产生的日志统一输出到subpackage1.log中</br>
	 *        <strong>3:</strong>按类输出日志,不同的类输出到以各自类名为文件名的日志文件中</br>
	 */
	public void setType(int type){
		this.type = type;
	}
	
	public int getType(){
		return type;
	}
	
	private String outFileName;
	public String getOutFileName() {
		return outFileName;
	}

	public void setOutFileName(String outFileName) {
		this.outFileName = outFileName;
	}
	
	public DynamicWtriteLogAppender(){
	}
	
	private synchronized void apendLog(String fileName,LoggingEvent event)  {
		try {
			String oldFileName = this.getFile();
			super.setFile(fileName);
			super.activateOptions();
			super.subAppend(event);
			super.setFile(oldFileName);
		} catch (Exception e) {
			LogLog.error("append log error",e);
		}
	}
	
	protected void subAppend(LoggingEvent event) {
		
		String outPutTagFile = null;
		if(getType() == 0){
			outPutTagFile = getName();
		}
		else
		{
			String logName = event.getLoggerName();//日志名
			LocationInfo locationInfo = event.getLocationInformation();
			String className = null != locationInfo ? locationInfo.getClassName() : logName;
			String simpleClassName = className.substring(className.lastIndexOf(".")+1);
			if(getType() == 3){
				outPutTagFile = simpleClassName;
			}
			else{
				Category parentPogger = Logger.getLogger(logName).getParent();
				String parentLogName = null != parentPogger ? parentPogger.getName() : logName;//此 Logger 的父 logger名称
				String subPackage = className.replace(parentLogName, "").replaceFirst("\\.","");
				String[] packStructure = subPackage.split("\\.");
				int structLenth = packStructure.length;
				if(getType() == 1){
					outPutTagFile = structLenth > 1?packStructure[0]:null;
				}
				else{
					outPutTagFile = structLenth > 1?packStructure[structLenth-1]:null;
				}
			}
			

		}
		/**
		 * 如果最后得到的日志输出目标名为null,日志输出到默认的文件中
		 */
		MessageFormat formatter = new MessageFormat(null == outPutTagFile?getFile():getOutFileName());
		apendLog(formatter.format(new String[]{outPutTagFile}),event);
		
	}
}

LOG4J配置文件 log4j.properties

log4j.category.com.xiaoyf.plugin = info, plugin
log4j.additivity.com.seeyon.v3x.plugin = false

log4j.appender.plugin = com.xiaoyf.loger.DynamicWtriteLogAppender
log4j.appender.plugin.outFileName = ${A8ApplicationRoot}/logs/{0}.log
log4j.appender.plugin.file = ${A8ApplicationRoot}/logs/plugin.log
log4j.appender.plugin.layout = org.apache.log4j.PatternLayout
log4j.appender.plugin.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss} [%t] %5p %c{1}:%L - %m%n
log4j.appender.plugin.append = true
log4j.appender.plugin.type = 1

分享到:
评论
1 楼 laitaogood 2010-09-09  
这个确实不错,哈哈

相关推荐

    log4j(二):动态配置日志输出路径

    Log4j是Apache提供的一款广泛使用的日志框架,它提供了丰富的功能和灵活的配置,使得我们可以根据需要动态地改变日志的输出路径。本文将深入探讨如何在Log4j中实现日志输出路径的动态配置。 首先,我们要理解Log4j...

    log4j自定义日志文件名及日志输出格式

    Log4j是Apache提供的一款广泛使用的日志框架,它提供了丰富的配置选项,允许开发者灵活地控制日志输出。当我们面对特定项目需求,比如需要自定义日志文件名和日志输出格式时,Log4j同样提供了相应的解决方案。 首先...

    使用log4j2实现日志数据脱敏

    使用Log4j2的Layout组件定义日志输出格式。例如,我们可以使用PatternLayout,并自定义模式来指定哪些字段需要脱敏。例如,`%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n` 是一个基本的日志...

    log4j配置 输出日志 案例

    本文将深入讲解如何配置log4j以实现日志输出到控制台和文件,并提供相关代码实例和案例分析。** ### 一、Log4j简介 Log4j是Apache组织开发的一个开源项目,用于生成日志信息。它提供了灵活的配置方式,支持多种输出...

    log4j按功能保存日志

    - **Logger**: 日志记录器,是Log4j的核心组件,负责实际的日志输出。你可以为每个功能模块创建一个独立的Logger,以便区分日志来源。 - **Appender**: 输出目的地,用于定义日志信息被发送到哪里,如控制台、文件...

    log4j中配置日志文件相对路径方法(PDF)

    ### Log4j中配置日志文件相对路径方法详解 #### 概述 在软件开发过程中,日志记录是一项重要的功能,它有助于开发者调试程序、监控应用程序的运行状态以及追踪问题。`Log4j`作为一款优秀的日志管理工具,被广泛应用...

    动态设置log4j的日志级别

    总结来说,动态设置Log4j的日志级别是提高应用灵活性的重要手段,可以根据运行时的需求调整日志输出的详细程度,同时避免不必要的重启操作。通过配置文件、API、JMX以及Web界面等多种方式,开发者可以方便地实现这一...

    kettle使用log4j管理输出日志

    参照了几个网上大神配置,部分教程的描述有误,最终调试完成,可以实现kettle日志输出,测试版本...需要替换的文件为,Kettle的程序目录下data-integration-6.0\plugins\kettle5-log4j-plugin中有一个log4j.xml文件。

    mybatis,log4j打印日志到后台和文件

    本文将深入探讨如何在 MyBatis 中配置 Log4j,实现日志同时输出到后台控制台和文件。 1. **日志框架集成** 在 MyBatis 中,我们通常会依赖日志框架如 Log4j、Logback 或 JDK 内置的日志系统。Log4j 以其强大的功能...

    tomcat9 slf4j+log4j2 写日志.zip

    Log4j2相比Log4j 1.x有许多改进,包括性能提升、更丰富的配置选项、异步日志记录支持以及动态日志配置等。 在Tomcat 9中配置SLF4J和Log4j2,你需要以下步骤: 1. **添加依赖**:确保你的项目中包含SLF4J和Log4j2的...

    SSM整合中的Log4j日志的配置详情

    Log4j 是一个功能强大且广泛使用的日志记录工具,特别是在 SSM(Spring、Spring MVC、Mybatis)整合项目中,合理地配置 Log4j 对项目的日志记录和输出至关重要。本文将详细介绍 SSM 整合中的 Log4j 配置详情,帮助...

    log4j2.xml记录日志到到数据库

    1. **配置文件**:如`log4j2.xml`,这是Log4j2的配置中心,定义了日志记录的策略、级别、输出目标等。 2. **日志记录器(Logger)**:负责收集和处理日志事件。 3. **日志级别(Level)**:如`TRACE`, `DEBUG`, `...

    log4j日志配置以及配置文件详解

    这是log4j框架的配置文件,使用Java Properties格式,用于定义日志输出的行为。主要包括以下几个核心部分: 1. **Logger**: 定义日志级别,例如DEBUG、INFO、WARN、ERROR和FATAL。日志级别决定了哪些信息会被记录。...

    log4j记录Debug日志

    Log4j提供了一个灵活且高效的日志系统,允许开发者自定义日志级别、输出格式和存储位置。 1. **日志级别**:Log4j支持多种日志级别,包括TRACE, DEBUG, INFO, WARN, ERROR, FATAL, OFF。其中,DEBUG用于调试信息,...

    无法打出log4j日志的问题排查

    Log4j通过配置文件(通常是log4j.properties或log4j.xml)来设定日志输出级别、格式、目的地等参数。如果日志没有按预期输出,我们需要检查以下几个方面: 1. **配置文件**:确认配置文件是否正确包含在项目中,...

    打log4j日志-ibatis的sql输出

    Log4j的配置文件通常是`log4j.properties`或`log4j.xml`,在这里你可以设置不同级别的日志输出,例如DEBUG、INFO、WARN、ERROR等。 对于Ibatis,这是一个轻量级的持久层框架,它将SQL语句与Java代码分离,提供了...

    tomcat下的log4j日志配置

    4. **创建 log4j.properties 文件**:在 `WEB-INF/classes` 目录下创建 `log4j.properties` 文件,并指定日志的级别、输出目的地等。 ```properties log4j.rootLogger=DEBUG, A1 log4j.appender.A1=org.apache....

    log4j日志包日志包

    `log4j`的设计理念是将日志输出与应用程序代码分离,使得日志级别和格式可以根据需要动态调整,而无需修改源代码。 **log4j.properties与log4j.xml配置** 在`log4j`中,有两种主要的配置方式:`log4j.properties`...

    log4j使用与java中log4j记录日志如何写入数据库

    1. **配置文件**:Log4j的配置文件通常是`log4j.properties`或`log4j.xml`,它定义了日志的级别(如DEBUG、INFO、WARN、ERROR、FATAL)、输出目的地(控制台、文件、数据库等)以及布局格式。 2. **日志类**:在...

    Log4j分包输出日志

    《Log4j分包输出日志详解》 在IT行业中,日志记录是软件开发中的一个关键环节,它能够帮助开发者追踪程序运行状态、定位错误和异常,从而提高软件的可维护性和稳定性。Log4j作为Java领域内广泛应用的日志框架,其...

Global site tag (gtag.js) - Google Analytics