打印日志不用每个类都声明Logger啦

之前,项目中每个类中需要打印日志时,就得在类中声明一个Logger对象,总觉得,这么做有点多余,终于,找到一种解决方法,打印日志方法跟Logger用法完全一样。直接分享代码:

package com.jfinal.kit;

import org.apache.log4j.Logger;

/**
 * log4j日志工具类,方便直接输出日志信息,不用每个类都声明logger日志对象
 * 
 * @author Administrator
 *
 */
public class Log4jKit {

    /**
     * 获取最原始被调用的堆栈信息
     * @return
     */
    private static StackTraceElement findCaller() {
        // 获取堆栈信息
        StackTraceElement[] callStack = Thread.currentThread().getStackTrace();
        if(null == callStack){
        	return null;
        }
        // 最原始被调用的堆栈信息
        StackTraceElement caller = null;
        // 日志类名称
        String logClassName = Log4jKit.class.getName();
        // 循环遍历到日志类标识
        boolean isEachLogClass = false;

        // 遍历堆栈信息,获取出最原始被调用的方法信息
        for (StackTraceElement strackTraceEle : callStack) {
            // 遍历到日志类
            if(logClassName.equals(strackTraceEle.getClassName())) {
                isEachLogClass = true;
            }
            // 下一个非日志类的堆栈,就是最原始被调用的方法
            if(isEachLogClass) {
                if(!logClassName.equals(strackTraceEle.getClassName())) {
                    isEachLogClass = false;
                    caller = strackTraceEle;
                    break;
                }
            }
        }
        return caller;
    }

    /**
     * 自动匹配请求类名,生成logger对象,此处 logger name 值为 [className].[methodName]() Line: [fileLine]
     * @return    
     * @author yzChen
     * @date 2016年10月13日 下午11:50:59 
     */
    private static Logger logger() {
        StackTraceElement caller = findCaller();//最原始被调用的堆栈对象
        if(caller == null){
        	return Logger.getLogger(Log4jKit.class);
        }else{
        	return Logger.getLogger(caller.getClassName() + "." + caller.getMethodName() + "() Line: " + caller.getLineNumber());
        }
    }
    
    public static void trace(String msg) {
    	trace(msg, null);
    }
    public static void trace(String msg, Throwable e) {
    	logger().trace(msg, e);
    }
    public static void debug(String msg) {
    	debug(msg, null);
    }
    public static void debug(String msg, Throwable e) {
    	logger().debug(msg, e);
    }
    public static void info(String msg) {
    	info(msg, null);
    }
    public static void info(String msg, Throwable e) {
    	logger().info(msg, e);
    }
    public static void warn(String msg) {
    	warn(msg, null);
    }
    public static void warn(String msg, Throwable e) {
    	logger().warn(msg, e);
    }
    public static void error(String msg) {
    	error(msg, null);
    }
    public static void error(String msg, Throwable e) {
    	logger().error(msg, e);
    }

}

@JFinal 可以加到JFinal的工具包中哦!^_^

还有,波总,2.3什么时候发布呢!非常期待!

评论区

冰点契约

2017-01-19 11:44

2.2已经有LogKit了

cknote

2017-01-19 14:07

3.0出来了

zempty

2017-01-19 15:33

没有2.3,直接3.0

思源

2017-01-19 17:01

3.0在哪呢,最近准备用jfianl弄个项目

思源

2017-01-19 17:04

ok 看到了 波总威武

lyh061619

2017-01-19 20:18

这个框架早已集成了,但想要更强大更个性化的支持,实现这个接下ILogFactory,然后在configConstant中用 me.setLogFactory(MyLogFactory);就可以了

lwd650

2017-01-20 09:26

日志接口最好加上slf4j及log4j2都支持的占位符方法

lwd650

2017-01-20 09:48

@lwd650 可以借鉴下netty内部的日志实现方式

sphsyv

2017-01-23 15:21

性能如何?

冰雨

2017-01-23 21:11

@sphsyv 之前简单测试过,循环调用1000万次,不输出内容,耗费时长约16毫秒,2000个并发执行输出信息,即Log4jKit.debug("msg");耗费时长约250毫秒,对性能影响不算很大

lverson24

2017-01-24 23:33

可以添加日志级别判断,以便可以进一步优化性能!