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

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");
    }
    .......
}

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

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)”, …) 的格式是固定的,只要符合这种格式,控制台就可以输出类的超链接。

时间: 2024-08-02 21:53:13

原创一个微型的日志工具类的相关文章

翻翻git之---一个丰富的通知工具类 NotifyUtil

转载请注明出处王亟亟的大牛之路 P1(废话板块,今天还加了个小广告) 昨天出去浪,到家把麦麦当当放出来玩一会就整到了12点多..早上睡过头了..简直心酸.... 最近手头上有一些职位可以操作,然后这里Share给大家 公司:暴走大事件 职位:Android/iOS开发 地点:上海 公司:Pactera 职位:Android/Java/PHP/.Net/Web前端/测试/UI设计 地点:上海(这批收的服务于 平安) 公司: 阿里巴巴 职位:Android/iOS 地点:北京/杭州/上海 有意向 可

使用java实现日志工具类分享_java

复制代码 代码如下: package com.teligen.eos.teleCode; import java.io.File;import java.io.FileWriter;import java.io.IOException;import java.util.Date; /** * 书写日志信息到指定的文件中 */public class WriteLogUtil {  private static String rootPath = "D:\\logs\\";  /** 

Android快速开发系列 10个常用工具类

目录(?)[+] 转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38965311,本文出自[张鸿洋的博客] 打开大家手上的项目,基本都会有一大批的辅助类,今天特此整理出10个基本每个项目中都会使用的工具类,用于快速开发~~ 在此感谢群里给我发项目中工具类的兄弟/姐妹~ 1.日志工具类L.java [java] view plaincopy package com.zhy.utils;      import android.u

实例详解Android快速开发工具类总结_Android

一.日志工具类 Log.java public class L { private L() { /* 不可被实例化 */ throw new UnsupportedOperationException("Cannot be instantiated!"); } // 是否需要打印bug,可以在application的onCreate函数里面初始化 public static boolean isDebug = true; private static final String TAG

Android 日志工具(log)的使用方法

使用Android的日志工具Log 方法: Android中的日志工具类为Log,这个类提供了如下方法来供我们打印日志: 使用方法: Log.d("MainActivity","onCreate execute"); 第一个参数tag:一般传入当前类名就好,主要用于队打印信息进行过滤. 第二个参数:msg,具体想打印的内容. 如: public class MainActivity extends AppCompatActivity { protected void

实例详解Android快速开发工具类总结

一.日志工具类 Log.java public class L { private L() { /* 不可被实例化 */ throw new UnsupportedOperationException("Cannot be instantiated!"); } // 是否需要打印bug,可以在application的onCreate函数里面初始化 public static boolean isDebug = true; private static final String TAG

自己封装的poi操作Excel工具类

       在上一篇文章<使用poi读写Excel>中分享了一下poi操作Excel的简单示例,这次要分享一下我封装的一个Excel操作的工具类.        该工具类主要完成的功能是:读取Excel.汇总Excel的功能.在读取时,可以设定开始和结束读取的位置.设定是否读取多个sheet.设定读取那个或者那些sheet等.在汇总时,如设定是否覆盖目标文件.设定是否比较检查重复内容.设定检查重复的列索引等功能.具体来演示一下吧:        工具类源码: package com.tgb.

通过反射克隆对象,对象复制(克隆)工具类

       最近做的项目中,经常会遇到用视图来操作数据库的,但是页面需要的则是某个实体对象,在controller层查出list<view> 还要把将view对象转化成entity对象.需要写一大堆的get和set方法,而且如果实体增删字段的话,还需要把转化代码再修改一下,让人头疼.        当我需要操作一个实体对象完成两件不同的事情,这2个方法中会修改实体对象中的属性,第一个方法调用后,再调用第二个方法时,会受影响.为了保证不受影响,必须copy一份属性值一模一样的实体.这时候就需要

轻松把玩HttpClient之封装HttpClient工具类(七),新增验证码识别功能

       这个HttpClientUtil工具类分享在GitHub上已经半年多的时间了,并且得到了不小的关注,有25颗star,被fork了38次.有了大家的鼓励,工具类一直也在完善中.最近比较忙,两个多月前的修改在今天刚修改测试完成,今天再次分享给大家.        验证码识别这项技术并不是本工具类的功能,而是通过一个开源的api来识别验证码的.这里做了一个简单的封装,主要是用来解决登陆时的验证码的问题.在线验证码识别官网:http://lab.ocrking.com/,github地址