原创一个微型的日志工具类

栏目: Java · 发布时间: 7年前

内容简介:原创一个微型的日志工具类

JDK 自带的 java.util.logging 非常简陋,于是我们在此基础上新建 LogHelper 类1,封装一些实用的功能。完整源码在: http://git.oschina.net/sp42/ajaxjs/blob/master/ajaxjs-base/src/com/ajaxjs/util/LogHelper.java

  • 封装了三种最常用的方法,分别是 config、info 和 warning 方法,均支持带有多个日志消息的对象参数,warning 支持传入 Throwable 异常的参数。
  • 可以定位日志所发生的行数及类 java 源文件的超链接,大大便于调试;
  • 通过 FileHandler 实现 WARNING 级别的或以上的日记磁盘记录,按照当前日期命名

一般情况下通过工厂模式创建 LogHelper,执行 LogHelper.getLog() 并传入目标类的 class 引用。

public class TestLogHelper {
    // 创建类成员为日志服务
    private static final LogHelper log = LogHelper.getLog(TestLogHelper.class);

    public void testGetLog() {
      // …… 其他代码
      log.warning("发生异常!……");
              log.info("bar");
              log.warning("fooo");
              // 带有多个日志消息的对象参数,用 {0},{1},{2} 预留消息位置
              log.warning("脚本引擎 {0} 没有 {1}() 这个方法", "js", "foo");
              log.warning(new Exception("致命错误!"), "脚本引擎 {0} 没有 {1}() 这个方法", "js", "foo");
    }
    .......
}

控制台现实结果如下所示。

原创一个微型的日志 <a href='https://www.codercto.com/tool.html'>工具</a> 类

LogHelper 更多方法的签名,参数 msg_tpl 为信息模版,用 {0},{1},{2} 预留消息位置

public void config(String msg);
public void config(String msg_tpl, Object... params);
public void info(String msg);
public void info(String msg_tpl, Object... params);
public void warning(String msg);
public void warning(String msg_tpl, Object... params);
public void warning(Throwable ex, String msg);
public void warning(Throwable ex, String msg_tpl, Object... params);

为什么 LogHelper 可以打印日志从哪个类的哪个方法来,知道是在哪一行代码上发生的?首先观察 API 原生调用 logger.logp(Level.WARNING, className, getMethodName(), msg),其中 className 是发出日志记录请求的类名,对此 LogHelper 已经把 className 作为属性保存起来了,直接传入即可;而 getMethodName() 是发出日志记录请求的方法名,这是个中的关键。下面是 getMethodName() 的源码。

public class LogHelper {
    private String className;               // 所在的类名

    ......

    /**
     * 获取所在的方法,调用时候
     * 
     * @return 方法名称
     */
    private String getMethodName() {
        StackTraceElement ste = null;

        // Thread.getCurrentThread().getStackTrace() 暴露了当前线程的运行栈信息
        for (StackTraceElement _ste : Thread.currentThread().getStackTrace()) {
            String clzName = _ste.getClassName();

            if (_ste.isNativeMethod() || clzName.equals(Thread.class.getName()) || clzName.equals(getClass().getName()))
                 continue;  // 过滤不要的类

            if (clzName.equals(className)) {
                ste = _ste;
                break;
            }
        }


        if(ste != null) {// 超链接,跳到源码所在行数
            return String.format(".%s(%s:%s)", ste.getMethodName(), ste.getFileName(), ste.getLineNumber());
        }else{
            return null;
        }
    }
    .....
}

Thread.getCurrentThread().getStackTrace() 返回当前线程的运行栈信息,结果是 StackTraceElement[] 数组。java.lang.StackTraceElement 专门用于跟踪堆栈元素的信息,通过其源码可见:

public final class StackTraceElement implements java.io.Serializable {
  // Normally initialized by VM (public constructor added in 1.5)

  private String declaringClass;     // 类名

  private String methodName;           // 方法名

  private String fileName;             // 文件名

  private int lineNumber;             // 行号
       ……
}

这正好是为当前类名、方法名、文件名、行号等信息准备的。

最后,String.format(“.%s(%s:%s)”, …) 的格式是固定的,只要符合这种格式,控制台就可以输出类的超链接。


以上所述就是小编给大家介绍的《原创一个微型的日志工具类》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Growth Hack 這樣做

Growth Hack 這樣做

Xdite / PCuSER電腦人文化 / 2016-5-7 / 300.00台幣

◎具體教你在預算有限的情況之下,把成長做出來的可行與必要方法! ◎帶動台灣成長駭客話題的專業講師,親授讓產品突破80分的成長秘笈 @這本書要給誰看? 1. 創業者、個人品牌經營者,想要提高自己服務轉換率的人。 2. 空有產品,但是賣不出去,花了錢投廣告卻效果低落的人。 @這本書有什麼不一樣? 1.全球最重要的趨勢,台灣最知名的 Growth Hack 講師 Xd......一起来看看 《Growth Hack 這樣做》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

html转js在线工具
html转js在线工具

html转js在线工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换