文档章节

Log4j简单封装及配置

coderJL
 coderJL
发布于 2016/03/02 11:19
字数 834
阅读 78
收藏 1

大家在项目中经常会用到Log4j,一般包括4个步骤:

1.编写log4j配置文件;

2.初始化log4j;

3.获取一个logger实例;

4.调用logger.debug() 等记录日志。


为了能详细控制每个包和类的日志输出,一般在每个类中都需要定一个logger实例,类似下面这样:

public class ContextFactory {  
    private static final Logger s_logger = Logger.getLogger(ContextFactory.class);  
  
    public void test() {
        s_logger.debug("this is debug.");  
    }  
}



无形中给使用带来了不便。

为了解决这个问题,本人对Log4j进行了一个简单的封装LogHelper.java:

package com.touna.lhh.utils;

import java.io.FileNotFoundException;

import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.springframework.util.Log4jConfigurer;


/**
 * 
 * <日志工具类>
 * @author JiangLiu WJ14380
 * @since  2016年3月1日
 */
public class LogHelper{
	
	/**
	 * 初始化日志配置文件
	 */
	static {
		try {
			Log4jConfigurer.initLogging("classpath:config/log4j.properties");
		} catch (FileNotFoundException e) {
			System.err.println("初始化日志实例异常");
			e.printStackTrace();
		}
    }  
	/**
	 * 
	 * <运行时产生的事件>
	 * @author JiangLiu WJ14380
	 * @since  2016年3月2日
	 * @param msg void
	 */
    public static void info(Object msg) {  
        StackTraceElement stack[] = (new Throwable()).getStackTrace();  
  
        Logger logger = Logger.getLogger(stack[1].getClassName());  
        logger.log(LogHelper.class.getName(), Level.INFO, msg, null);  
    }  
    /**
     * 
     * <运行时异常以及预期之外的错误>
     * @author JiangLiu WJ14380
     * @since  2016年3月2日
     * @param msg void
     */
    public static void error(Object msg) {  
        StackTraceElement stack[] = (new Throwable()).getStackTrace();  
  
        Logger logger = Logger.getLogger(stack[1].getClassName());  
        logger.log(LogHelper.class.getName(), Level.ERROR, msg, null);  
    }  
    /**
     * 
     * <与程序运行时的流程相关的详细信息>
     * @author JiangLiu WJ14380
     * @since  2016年3月2日
     * @param msg void
     */
    public static void debug(Object msg) {  
        StackTraceElement stack[] = (new Throwable()).getStackTrace();  
  
        Logger logger = Logger.getLogger(stack[1].getClassName());  
        logger.log(LogHelper.class.getName(), Level.DEBUG, msg, null);  
    }  
    /**
     * 
     * <预期之外的运行时状况,不一定是错误的情况>
     * @author JiangLiu WJ14380
     * @since  2016年3月2日
     * @param msg void
     */
    public static void warn(Object msg) {  
        StackTraceElement stack[] = (new Throwable()).getStackTrace();  
  
        Logger logger = Logger.getLogger(stack[1].getClassName());  
        logger.log(LogHelper.class.getName(), Level.WARN, msg, null);  
    }
    
    /**
     * 
     * <导致程序提前结束的严重错误>
     * @author JiangLiu WJ14380
     * @since  2016年3月2日
     * @param msg void
     */
    public static void fatal(Object msg) {  
        StackTraceElement stack[] = (new Throwable()).getStackTrace();  
  
        Logger logger = Logger.getLogger(stack[1].getClassName());  
        logger.log(LogHelper.class.getName(), Level.FATAL, msg, null);  
    }
    
    /**
     * 
     * <导致程序提前结束的严重错误>
     * @author JiangLiu WJ14380
     * @since  2016年3月2日
     * @param msg void
     */
    public static void trace(Object msg) {  
        StackTraceElement stack[] = (new Throwable()).getStackTrace();  
  
        Logger logger = Logger.getLogger(stack[1].getClassName());  
        logger.log(LogHelper.class.getName(), Level.TRACE, msg, null);  
    }
}

使用时,不需要在每个类中定义logger,而是直接调用LogHelper.debug(msg)就可以了。方便了大家的使用。

而在LogHelper.debug()中封装了获取logger对象及获取调用者位置等步骤。


最后附上一个log4j.xml的配置

#日志级别
level = INFO

#定义LOG输出级别
log4j.rootLogger=${level}, file, Console , A1

#输出目的地为控制台
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.Target=System.out
log4j.appender.Console.layout = org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=[%p][%d{yyyy-MM-dd HH\:mm\:ss}][%t][%c] %m%n

#ERROR日志 - 按天输出一个文件
log4j.appender.A1 = org.apache.log4j.DailyRollingFileAppender
log4j.appender.A1.File = ${catalina.base}/logs/ssm-api/api-error.log
log4j.appender.A1.layout = org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern =[%p][%d{yyyy-MM-dd HH\:mm\:ss}][%t][%c] %m%n
log4j.appender.A1.Threshold=ERROR

#项目日志 - 按天输出一个文件
log4j.appender.Porject = org.apache.log4j.DailyRollingFileAppender
log4j.appender.Porject.File = ${catalina.base}/logs/ssm-api/api.log
log4j.appender.Porject.layout = org.apache.log4j.PatternLayout
log4j.appender.Porject.layout.ConversionPattern =[%p][%d{yyyy-MM-dd HH\:mm\:ss}][%t][%c] %m%n
log4j.logger.com.touna=${level},Porject
log4j.logger.org.springframework=${level},Porject
log4j.logger.java.sql.Connection=${level}, Porject
log4j.logger.java.sql.Statement=${level}, Porject
log4j.logger.java.sql.PreparedStatement=${level}, Porject
log4j.logger.org.springframework.web=${level}

解释:

1. com.lenovo下的log 显示debug信息。当然也可控制到具体的类。

2. org.apache下的log显示warn信息。

3. root显示debug信息,记录到控制台和文件。

4.配置是有顺序的,虽然root是debug级别,但在他之前定义了org.apache是warn级别,所以org.apache只会输出warn级别的log。


© 著作权归作者所有

coderJL
粉丝 3
博文 11
码字总数 10517
作品 0
深圳
私信 提问
java日志commons-logging/log4j/slf4j/logBack需要知道的几件事

如果对于commons-loging、log4j、slf4j、LogBack等都已经非常清楚了,可以忽略本文。几次解决日志冲突问题时对这几个概念的简单总结,希望对这块基础没有理解透的同学能有所帮助,当然如果对...

程序员诗人
2018/04/17
0
0
java日志,需要知道的几件事

java日志,需要知道的几件事 如果对于commons-loging 、log4j 、slf4j 、LogBack 等都已经非常清楚了,可以忽略本文。几次解决日志冲突问题时对这几个概念的简单总结,希望对这块基础没有理解...

maoxiajun
2012/02/10
558
2
Java日志,需要知道的几件事(commons-logging,log4j,slf4j,logback)

如果对于commons-loging、log4j、slf4j、LogBack等都已经非常清楚了,可以忽略本文。几次解决日志冲突问题时对这几个概念的简单总结,希望对这块基础没有理解透的同学能有所帮助,当然如果对...

飓风2000
2017/10/24
35
0
Spring3 MyBatis3 日志配置

//org.apache.ibatis.logging.LogFactory; static { } 查看Mybatis源码发现,他日志框架的寻找顺序:slf4j-->commons logging-->log4j 不能直接引入log4j jar包,因为即使我不导入slf4j的包,...

xingda
2012/04/17
3.6K
0
《Apache Log4j 2 用户指南》简介

1.1 欢迎来到log4j 2! 1.1.1 简介 几乎每一个大型应用程序都包含自己的日志记录或跟踪API。根据这个规则,在1996年初,E.U. SEMPER项目决定编写自己的跟踪API。经过无数次的改进,多次转世和...

01/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

一起来学Java8(三)——方法引用

在一起来学Java8(一)——函数式编程中有一个简单的函数式编程的例子: import java.util.function.Consumer;class Person { public static void sayHello(String name) { S...

猿敲月下码
14分钟前
6
0
读书笔记:深入理解ES6(十一)

第十一章 Promise与异步编程   Promise可以实现其他语言中类似Future和Deferred一样的功能,是另一种异步编程的选择,它既可以像事件和回调函数一样指定稍后执行的代码,也可以明确指示代码...

张森ZS
37分钟前
11
0
面试官,Java8 JVM内存结构变了,永久代到元空间

在文章《JVM之内存结构详解》中我们描述了Java7以前的JVM内存结构,但在Java8和以后版本中JVM的内存结构慢慢发生了变化。作为面试官如果你还不知道,那么面试过程中是不是有些露怯?作为面试...

程序新视界
45分钟前
26
0
Elasticsearch 实战(一) - 简介

官腔 Elasticsearch,分布式,高性能,高可用,可伸缩的搜索和分析系统 基本等于没说,咱们慢慢看 1 概述 百度:我们比如说想找寻任何的信息的时候,就会上百度去搜索一下,比如说找一部自己喜...

JavaEdge
50分钟前
18
0
【jQuery基础学习】11 jQuery性能简单优化

本文转载于:专业的前端网站➦【jQuery基础学习】11 jQuery性能简单优化 关于性能优化 合适的选择器 $("#id")会直接调用底层方法,所以这是最快的。如果这样不能直接找到,也可以用find方法继...

前端老手
58分钟前
18
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部