前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >java:输出带行号信息的简易日志

java:输出带行号信息的简易日志

作者头像
10km
发布2019-05-25 22:24:22
8350
发布2019-05-25 22:24:22
举报
文章被收录于专栏:10km的专栏10km的专栏

版权声明:本文为博主原创文章,转载请注明源地址。 https://cloud.tencent.com/developer/article/1433685

log4j输出日志是很方便的,但有的时候,不希望依赖太多第三方库,但希望用类似log4j的方式方便在控制台输出程序运行的基本信息,用System.out.printf输出又无法显示代码位置,而且printf还要注意匹配输出参数的类型有点麻烦。

就想着自己写一个简单的日志输出方法代替System.out.printf.

基本的原理就是获取当前线程的堆栈信息StackTraceElement[],通过StackTraceElement获取当前的类的文件名和行号,与输入的参数一起转成String输出。

代码语言:javascript
复制
/**
 * 简单日志输出工具类
 * @author guyadong
 *
 */
public class SampleLog {
    private static final String DELIM_STR = "{}";
    private static final Object[] EMPTY_ARGS = new Object[0];
    private static void log(PrintStream printStream,int level, String format, Object ... args){
        if(null == printStream || null == format){
            return;
        }
        if(null == args){
            args = EMPTY_ARGS;
        }
        StringBuilder buffer = new StringBuilder(format.length() + 64);
        int beginIndex = 0,endIndex=0,count=0;
        while((endIndex = format.indexOf(DELIM_STR, beginIndex))>=0){
            buffer.append(format.substring(beginIndex, endIndex));
            try{
                buffer.append(args[count++]);
            }catch(IndexOutOfBoundsException e){
                // 数组越界时对应占位符填null
                buffer.append("null");
            }
            beginIndex = endIndex + DELIM_STR.length();
        }
        buffer.append(format.substring(beginIndex,format.length()));
        Thread currentThread = Thread.currentThread();
        StackTraceElement stackTrace = currentThread.getStackTrace()[level];
        printStream.printf("[%s] (%s:%d) %s\n",
                currentThread.getName(),
                stackTrace.getFileName(),
                stackTrace.getLineNumber(),
                buffer.toString());
    }
    /**
     * 向{@code printStream}输出日志信息<br>
     * example:
     * <pre>
     * log("name : {},age:{}","tom",23);
     * </pre>
     * @param printStream
     * @param format 格式字符串,采用{@code '{}'}为占位符,占位符个数要与{@code args}数组长度匹配
     * @param args
     */
    public static void log(PrintStream printStream,String format, Object ... args){
        log(printStream,3,format,args); 
    }
    /**
     * 向控制台输出日志信息<br>
     * @param format 格式字符串,采用{@code '{}'}为占位符
     * @param args
     * @see #log(PrintStream, String, Object...)
     */
    public static void log(String format, Object ... args){
        log(System.out,3,format,args);
    }
}

调用示例:

代码语言:javascript
复制
    @Test
    public void test() {
        SampleLog.log("wwwwww", "tom");
        SampleLog.log("name {},age:{}");
        SampleLog.log("name {},age:{} ww", "tom");
        SampleLog.log("name {},age:{},date:{},time:{}", "tom",23,new Date());
    }

输出

main wwwwww main name null,age:null main name tom,age:null ww main name tom,age:23,date:Tue Mar 27 21:58:15 CST 2018,time:null

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018年03月27日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档