`

Log4j自已配置

阅读更多

配置方法:

导入log4j包。

log4j.properties文件内容

 # set log levels #
log4j.rootLogger = debug , stdout 
log4j.logger.newLoger = stdout,debug,info,warn,error,MAIL
# 输出到控制台 #
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.Threshold = DEBUG
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern =  [%d{yyyy-MM-dd HH:mm:ss}] [%5p] [%C:%L] -> %m%n
# 输出到文件:DEBUG #
log4j.appender.debug = org.apache.log4j.DailyRollingFileAppender
log4j.appender.debug.File =log/debug.txt
log4j.appender.debug.Append = false
log4j.appender.debug.Threshold = DEBUG
log4j.appender.debug.layout = org.apache.log4j.PatternLayout
log4j.appender.debug.layout.ConversionPattern  =  [%d{yyyy-MM-dd HH:mm:ss}] [%5p] [%C:%L] -> %m%n
# 输出到文件:INFO #
log4j.appender.info = org.apache.log4j.DailyRollingFileAppender
log4j.appender.info.File =log/info.txt
log4j.appender.info.Append = false
log4j.appender.info.Threshold = INFO
log4j.appender.info.layout = org.apache.log4j.PatternLayout
log4j.appender.info.layout.ConversionPattern  =  [%d{yyyy-MM-dd HH:mm:ss}] [%5p] [%C:%L] -> %m%n
# 输出到文件:WARN #
log4j.appender.warn = org.apache.log4j.DailyRollingFileAppender
log4j.appender.warn.File =log/warn.txt
log4j.appender.warn.Append = false
log4j.appender.warn.Threshold = WARN
log4j.appender.warn.layout = org.apache.log4j.PatternLayout
log4j.appender.warn.layout.ConversionPattern  =  [%d{yyyy-MM-dd HH:mm:ss}] [%5p] [%C:%L] -> %m%n
# 输出到文件:ERROR #
log4j.appender.error = org.apache.log4j.DailyRollingFileAppender
log4j.appender.error.File =log/error.txt
log4j.appender.error.Append = false
log4j.appender.error.Threshold = ERROR
log4j.appender.error.layout = org.apache.log4j.PatternLayout
log4j.appender.error.layout.ConversionPattern  =  [%d{yyyy-MM-dd HH:mm:ss}] [%5p] [%C:%L] -> %m%n


# 邮件发送:MAIL #
#发送mail需下载及引入activation.jar和mail.jar
log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender 
log4j.appender.MAIL.Threshold=ERROR 
log4j.appender.MAIL.BufferSize=512
log4j.appender.MAIL.From=luweifeng1983@126.com
log4j.appender.MAIL.SMTPUsername=luweifeng1983
log4j.appender.MAIL.SMTPPassword=**
log4j.appender.MAIL.SMTPHost=smtp.126.com
log4j.appender.MAIL.Subject=Log4J Message 
log4j.appender.MAIL.To=luweifeng@sz.tom.com
log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout 
log4j.appender.MAIL.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n

 

测试代码:

package com.log;

import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;

public class TestLog {
	static Logger logger = Logger.getLogger(TestLog.class);
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		PropertyConfigurator.configure("./config/log4j.properties");
		Logger logger = Logger.getLogger("newLoger");
		logger.debug("debug...");
		logger.info("info....");
		logger.warn("warn.....");
		logger.error("error出错啦...");
		
		
	}
}

 

上面配置中控制台只输出信息:

[2016-08-16 14:06:37] [DEBUG] [com.log.TestLog:14] -> debug...
[2016-08-16 14:06:37] [ INFO] [com.log.TestLog:15] -> info....
[2016-08-16 14:06:37] [ WARN] [com.log.TestLog:16] -> warn.....
[2016-08-16 14:06:37] [ERROR] [com.log.TestLog:17] -> error出错啦...

 

以下进行error日志记录保存到数据库,采用xml配置文件:

log4j.xml如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" threshold="debug">
 
	 <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
		  <layout class="org.apache.log4j.PatternLayout">
		   <param name="ConversionPattern" value="[%d{dd/MM/yy hh:mm:ss:sss z}] %5p %c{2}: %m%n" />
		  </layout>
	 </appender>
 
	 <appender name="FILE" class="org.apache.log4j.RollingFileAppender">
		  <param name="file" value="c:/framework/log/all/all.log" />
		  <param name="append" value="true" />
		  <param name="maxFileSize" value="10MB" />
		  <param name="maxBackupIndex" value="100" />
		  <layout class="org.apache.log4j.PatternLayout">
		   	<param name="ConversionPattern" value="%d [%t] %-5p %C{6} (%F:%L) - %m%n" />
		  </layout>
	 </appender>
 
 	<appender name="info" class="org.apache.log4j.DailyRollingFileAppender">
		<param name="File" value="c:/framework/log/info/info.log" />
		<param name="Encoding" value="GB2312" />
		<param name="DatePattern" value="'.'yyyy-MM-dd'.bak'" />
		<layout class="org.apache.log4j.PatternLayout">
			<param name="ConversionPattern" value=" %d{ISO8601} [%c]- %m%n" />
		</layout>
		<filter class="org.apache.log4j.varia.LevelRangeFilter"> 
	        <param name="LevelMin" value="INFO" /> 
	        <param name="LevelMax" value="INFO" /> 
	        <param name="acceptOnMatch" value="true" /> 
	    </filter>		
	</appender>
 
 	<appender name="error" class="org.apache.log4j.DailyRollingFileAppender">
		<param name="threshold" value="error" />
		<param name="File" value="c:/framework/log/error/error.log" />
		<param name="Encoding" value="GB2312" />
		<param name="DatePattern" value="'.'yyyy-MM-dd'.bak'" />
		<layout class="org.apache.log4j.PatternLayout">
			<param name="ConversionPattern" value=" %d{ISO8601} [%c]- %m%n" />
		</layout>
		<filter class="org.apache.log4j.varia.LevelRangeFilter"> 
	        <param name="LevelMin" value="error" /> 
	        <param name="LevelMax" value="error" /> 
	        <param name="acceptOnMatch" value="true" /> 
      	</filter>		
	</appender>

	<appender name="debug" class="org.apache.log4j.DailyRollingFileAppender">
		<param name="File" value="c:/framework/log/debug/debug.log" />
		<param name="Encoding" value="GB2312" />
		<param name="DatePattern" value="'.'yyyy-MM-dd'.bak'" />
		<layout class="org.apache.log4j.PatternLayout">
			<param name="ConversionPattern" value=" %d{ISO8601} [%c]- %m%n" />
		</layout>
		<filter class="org.apache.log4j.varia.LevelRangeFilter"> 
	        <param name="LevelMin" value="debug" /> 
	        <param name="LevelMax" value="debug" /> 
	        <param name="acceptOnMatch" value="true" /> 
      	</filter>		
	</appender>

	<appender name="dberror" class="org.apache.log4j.jdbc.JDBCAppender">
		<param name="URL" value="jdbc\:oracle\:thin\:@//10.101.2.19\:1521/pdbqmytcis" />
		<param name="driver" value="oracle.jdbc.driver.OracleDriver"/>
		<param name="user" value="qmytcis"/>
		<param name="password" value="qmytcis123"/>
		<param name="sql" value="INSERT INTO ERROR_LOG (ID,ERROR_TIME,ERROR_THREAD,ERROR_CLASS,ERROR_MSG) VALUES (SEQ_ERROR_LOG.NEXTVAL,'%d{yyyy-MM-dd HH\:mm\:ss}', '[YTCIS_WEB]%t', '%l', '%.4000m') "/>
		<filter class="org.apache.log4j.varia.LevelRangeFilter"> 
	        <param name="LevelMin" value="error" /> 
	        <param name="LevelMax" value="error" /> 
	        <param name="acceptOnMatch" value="true" /> 
      	</filter>		
	</appender>
	
	<appender name="mydberror" class="com.log.MyJDBCAppender">
		<param name="URL" value="jdbc\:oracle\:thin\:@//10.101.2.19\:1521/pdbqmytcis" />
		<param name="driver" value="oracle.jdbc.driver.OracleDriver"/>
		<param name="user" value="qmytcis"/>
		<param name="password" value="qmytcis123"/>
		<param name="sql" value="INSERT INTO ERROR_LOG (ID,ERROR_TIME,ERROR_THREAD,ERROR_CLASS,ERROR_MSG) VALUES (SEQ_ERROR_LOG.NEXTVAL,'%d{yyyy-MM-dd HH\:mm\:ss}', '[YTCIS_WEB]%t', '%l', '%.4000m') "/>
		<filter class="org.apache.log4j.varia.LevelRangeFilter"> 
	        <param name="LevelMin" value="error" /> 
	        <param name="LevelMax" value="error" /> 
	        <param name="acceptOnMatch" value="true" /> 
      	</filter>		
	</appender>

	 <!-- 下面是打印mybatis语句的配置-->
	 <logger name="com.gov.customs" additivity="false"> 
	  	<level value="DEBUG" /> 
	  	<appender-ref ref="debug"/>
		<appender-ref ref="info"/>
		<appender-ref ref="error"/>
		<appender-ref ref="CONSOLE"/>
	 </logger> 
	 <logger name="java.sql" additivity="true"> 
		  <level value="DEBUG" /> 
		  <appender-ref ref="CONSOLE"/>
	 </logger>

	 <root>
	  <level value="DEBUG" />
	  <!-- 
	  <appender-ref ref="CONSOLE" />
	  <appender-ref ref="debug" />
	  <appender-ref ref="FILE" />
	  <appender-ref ref="info" />
	  <appender-ref ref="error" />
	
	   <appender-ref ref="dberror" />   -->
	   <appender-ref ref="mydberror" />
	   
	 </root>
 
</log4j:configuration>

 

因为日志内容可能有引号等字符导致入库失败,所以需要进行以下处理:

MyJDBCAppender类

package com.log;

import org.apache.log4j.Category;
import org.apache.log4j.Priority;
import org.apache.log4j.jdbc.JDBCAppender;
import org.apache.log4j.spi.LoggingEvent;

public class MyJDBCAppender extends JDBCAppender {

	protected String getLogStatement(LoggingEvent event) {
		String fqnOfCategoryClass=event.fqnOfCategoryClass;
		Category logger=Category.getRoot();
		Priority level=event.level;
		Object message=event.getMessage();
		Throwable throwable=null;
		MyLoggingEvent bEvent=new MyLoggingEvent(fqnOfCategoryClass,logger,level,message,throwable);
		bEvent.setEvent(event);
		return super.getLogStatement(bEvent);
	}
}

 MyLoggingEvent类

package com.log;

import org.apache.log4j.Category;
import org.apache.log4j.Priority;
import org.apache.log4j.spi.LoggingEvent;

public class MyLoggingEvent extends LoggingEvent {
	private static final long serialVersionUID = 1L;
	private LoggingEvent event = null;
	public MyLoggingEvent(String fqnOfCategoryClass, Category logger,
			Priority level, Object message, Throwable throwable) {
		super(fqnOfCategoryClass, logger, level, message, throwable);
	}

	public String getThreadName() {
		String thrdName=super.getThreadName();
		if(thrdName.indexOf("'")!=-1){
			thrdName=thrdName.replaceAll("'", "''");
		}
		return thrdName;
	}

	public String getRenderedMessage() {
		String msg=super.getRenderedMessage();
		String throwMsgs = "";
		String [] throwMsg = event.getThrowableStrRep();
		if (throwMsg != null) {
            StringBuffer buf = new StringBuffer();
            for(int i = 0; i < throwMsg.length; i++) {
                buf.append(throwMsg[i]);
                buf.append("\r\n");
            }
            throwMsgs = buf.toString();
        }
		msg =  msg + "\r\n" + throwMsgs;
		if(msg.indexOf("'")!=-1){
			msg=msg.replaceAll("'", "''");
		}
		if(msg.length()>4000) msg = msg.substring(0,4000);
		return msg;
	}

	public LoggingEvent getEvent() {
		return event;
	}

	public void setEvent(LoggingEvent event) {
		this.event = event;
	}


}

 测试类TestLog

package com.log;

import java.io.IOException;
import java.io.InterruptedIOException;
import java.io.LineNumberReader;
import java.io.PrintWriter;
import java.io.StringReader;
import java.io.StringWriter;
import java.net.URL;
import java.util.ArrayList;

import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
import org.apache.log4j.xml.DOMConfigurator;

import com.other.Other;

public class TestLog {
	static Logger logger = Logger.getLogger(TestLog.class);
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		
		try {
			testXml();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
//		Other o = new Other();
//		o.print();
		
	}
	
	public static void testProperties(){
		PropertyConfigurator.configure("./config/log4j.properties");
		Logger logger = Logger.getLogger("newLoger");
		logger.debug("debug...");
		logger.info("info....");
		logger.warn("warn.....");
		logger.error("error出错啦...");
	}
	
	public static void testXml() throws Exception{
		// final URL url = TestLog.class.getResource("log4j.xml");  
		 URL url = new URL("./config/log4j.xml");
	     DOMConfigurator.configure(url);  
	     int c;
		try {
			int a = 3;
			 int b = 0;
			 c = a / b;
			 String s = "3232323".substring(0,2);
		} catch (Exception e) {
			e.printStackTrace();
			//render(e);
			logger.error("error出错啦...",e);
		}          
	}
	
	
	public static String[] render(final Throwable throwable) {
        StringWriter sw = new StringWriter();
        PrintWriter pw = new PrintWriter(sw);
        try {
            throwable.printStackTrace(pw);
        } catch(RuntimeException ex) {
        }
        pw.flush();
        LineNumberReader reader = new LineNumberReader(
                new StringReader(sw.toString()));
        ArrayList lines = new ArrayList();
        try {
          String line = reader.readLine();
          while(line != null) {
            lines.add(line);
            line = reader.readLine();
          }
        } catch(IOException ex) {
            if (ex instanceof InterruptedIOException) {
                Thread.currentThread().interrupt();
            }
            lines.add(ex.toString());
        }
        String[] tempRep = new String[lines.size()];
        lines.toArray(tempRep);
        return tempRep;
    }
}

ORACLE数据库表脚本如下:

-- Create table
create table ERROR_LOG
(
  ID           NUMBER,
  ERROR_TIME   VARCHAR2(50),
  ERROR_THREAD VARCHAR2(500),
  ERROR_CLASS  VARCHAR2(500),
  ERROR_MSG    VARCHAR2(4000)
 
);
create sequence SEQ_ERROR_LOG
minvalue 1
start with 1
increment by 1;

 

 运行测试类,记录错误日志内容

具体见附件包。

分享到:
评论

相关推荐

    log4j 详细配置参考

    log4j 详细配置 log4j 详细配置 log4j 详细配置 log4j 详细配置

    log4j实用配置扩展

    #### 四、log4j的核心组件 log4j的核心组件主要包括**Loggers(记录器)**、**Appenders(输出源)**和**Layouts(布局)**。 1. **Loggers (记录器)**:负责生成日志信息,并决定是否发送日志信息到Appenders。记录器...

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

    Log4j作为Java领域广泛应用的日志框架,提供了强大的日志记录功能和灵活的配置。本文将深入探讨log4j的配置以及配置文件的详解。** 首先,我们要理解什么是`log4j.properties`文件。这是log4j框架的配置文件,使用...

    tomcat下的log4j日志配置

    ### Tomcat 下的 Log4j 日志配置详解 在日常的 Web 开发中,日志记录对于调试问题、监控系统状态以及后期维护来说至关重要。在使用 Apache Tomcat 作为服务器时,合理配置日志框架(如 Log4j)能够极大地提高开发...

    log4j配置和加载方法

    ### Log4j配置与加载方法详解 Log4j是一款由Apache出品的日志记录工具,它提供了灵活的日志级别控制和多样化的日志输出方式,广泛应用于Java应用的开发中。本文将深入解析log4j的配置与加载机制,帮助开发者更好地...

    SpringBoot框架配置log4j和log4j2的配置代码

    Log4j和Log4j2是两种广泛使用的Java日志框架,它们提供了灵活的日志配置和高性能的日志处理能力。本文将详细介绍如何在SpringBoot项目中配置Log4j和Log4j2。 ### SpringBoot与Log4j Log4j是Apache的一个开源项目,...

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

    四、在 Maven 项目中引入 Log4j 依赖 在 Maven 项目中,需要引入 Log4j 依赖项,以便使用 Log4j。下面是一个基本的 Maven 依赖项配置: ``` &lt;groupId&gt;log4j &lt;artifactId&gt;log4j &lt;version&gt;1.2.16 ``` 这个配置...

    Log4j2学习log4j2.xml配置模板

    Log4j2 配置模板学习笔记 Log4j2 是 Java 语言中一种流行的日志记录工具,它提供了灵活的日志记录管理功能。下面我们将学习 Log4j2 配置模板的使用和配置。 引入 Log4j2 依赖 在使用 Log4j2 之前,需要在 Maven ...

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

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

    Log4j日志配置说明,Log4j日志配置说明

    ### Log4j日志配置详解 #### 一、概述 Log4j 是一个基于 Java 的开源日志记录框架,由 Apache 软件基金会维护。它允许开发人员根据等级记录日志信息,使得用户能够控制日志信息的记录级别及去向。本文将通过一份...

    log4j-1.2.17的jar包以及依赖包,还有一份log4j的配置文件,输出到控制台和文件夹两种配置

    在压缩包中,还包含了一份名为`log4j.properties`的配置文件。这是Log4j使用的一种配置格式,基于Java Properties格式。配置文件决定了日志信息如何输出、输出到哪里,以及日志的级别等关键设置。 **三、Log4j配置...

    [简单]log4jdbc-log4j2配置简记

    标题中的“log4jdbc-log4j2配置简记”指的是在Java开发中使用log4jdbc-log4j2库来监控和记录SQL查询的过程。log4jdbc是一个开源项目,它允许开发者通过日志系统来追踪数据库操作,而log4j2是log4j的升级版,提供了更...

    老生常谈Log4j和Log4j2的区别(推荐)

    下面我们将从配置文件类型、核心JAR包、文件渲染和Log调用四个方面来比较Log4j和Log4j2的区别。 配置文件类型 Log4j通过一个.properties文件作为主配置文件,而Log4j2则弃用了这种方式,采用的是.xml、.json或者....

    log4j2配置文件

    log4j2配置,文件分割,自动清除等相关配置。

    log4j及配置文件

    《深入理解Log4j及其配置文件》 在Java开发领域,日志管理是不可或缺的一部分,它可以帮助开发者跟踪程序运行状态,排查错误,优化性能。Log4j,作为Apache的一个开源项目,是Java中最广泛使用的日志框架之一。本文...

    Log4J_全能配置文件.pdf

    ### Log4J 全能配置文件详解 #### 一、概述 Log4J是一款非常流行的Java日志框架,被广泛应用于各种规模的应用程序中。它提供了灵活的日志记录机制,可以将日志输出到不同的目的地,如控制台、文件、数据库等,并且...

    Log4j2结合Slf4j配置使用

    Log4j2 结合 Slf4j 配置使用 Log4j2 是一个功能强大且广泛使用的日志记录工具,它提供了灵活的日志记录机制和高性能的日志记录能力。Slf4j 则是一个简单的日志记录门面,提供了统一的日志记录接口。今天,我们将...

    log4j.properties配置文件

    ### log4j.properties配置文件详解 #### 一、概述 `log4j.properties`是Apache Log4j框架中用于配置日志记录行为的核心文件之一。通过这个文件,开发者可以定义日志消息的输出方式(例如控制台或文件)、日志级别...

Global site tag (gtag.js) - Google Analytics