超高逼格Log日志打印

代码地址如下:
http://www.demodashi.com/demo/12646.html

前言

Log日志的打印一直是一个比较头疼的事,怎样才能让自己的log显示更多信息,怎样才能让自己的log更好的帮助我们定位问题,帮助调试,一直是我关注的问题。

我将Log打印封装到LogUtil类中,这篇文章涉及以下内容

  1. LogUtil的优势
  2. LogUtil的实现原理
  3. LogUtil的使用
  4. 项目结构图和效果图
一. LogUtil的优势

LogUtil打印封装类,其有以下优点:

  1. 显示当前项目的包名
  2. 显示当前日志级别
  3. 显示tag
  4. 显示log所在类的类名
  5. 显示log调用处所在的方法名
  6. 显示log所在的行数
  7. 点击行数定位到具体代码处
二. LogUtil的实现原理

LogUtil能显示这么多信息,全在于StackTraceElement的功劳,StackTraceElement表示StackTrace(堆栈轨迹)中的一个元素,属性包括方法调用者的类名、方法名、文件名以及调用的行数,它是一个final类

它在LogUtil中会做类似如下功能的处理:

StackTraceElement elements[] = Thread.currentThread().getStackTrace();
        for (int i = 0; i < elements.length; i++) {
            StackTraceElement stackTraceElement = elements[i];
            String className = stackTraceElement.getClassName();
            String methodName = stackTraceElement.getMethodName();
            String fileName = stackTraceElement.getFileName();
            int lineNumber = stackTraceElement.getLineNumber();
            System.out.println("StackTraceElement数组下标 i=" + i + "----------fileName="
                    + fileName + "----------className=" + className + "----------methodName=" + methodName + "----------lineNumber=" + lineNumber);
        }

在android中最原始的log打印,我们会类似这么用:

Log.i(String tag,String msg);

为了让log能更规范,显示更多信息,于是我将 tag 用方法formatLog(String tag)进行格式化处理,

formatLog 代码如下:

    private static String formatLog(String tag) {
        StackTraceElement traceElements[] = Thread.currentThread().getStackTrace();
        StackTraceElement element = traceElements[4];
        String className = element.getClassName();
        String methodName = element.getMethodName();
        String fileName = element.getFileName();
        int lineNumber = element.getLineNumber();

        if(className!=null&&className.contains(".")){
            className=className.substring(className.lastIndexOf(".")+1,className.length());
        }

        StringBuffer buffer = new StringBuffer();
        buffer.append(tag + ":");
        buffer.append(className + ".");
        buffer.append(methodName + "(");
        buffer.append(fileName + ":");
        buffer.append(lineNumber + ")");

        return buffer.toString();
    }

为了防止log中的msg过长显示不全,LogUtil对传统的log中的msg做如下处理:

   private static void printLog(String tag, String msg, String type) {
        int count = msg.length();
        if (count > 4000) {
            for (int i = 0; i < count; i += 4000) {
                if (i + 4000 < count) {
                    printByLogType(tag, msg.substring(i, i + 4000), type);
                } else {
                    printByLogType(tag, msg.substring(i, msg.length()), type);
                }
            }
        } else {
            printByLogType(tag, msg, type);
        }
    }

这样就实现了LogUtil的主要逻辑。

三. LogUtil的使用
3.1 快速打印log

快速打印log时,log的tag会固定为LogUtil中的TAG值,你可以这样调用:

LogUtil.w("=====測試按鈕被點擊了====");
3.2 定义自己的tag日志

如果你想定义一个tag=”abc“的log方便自己调试,你可以这样:

LogUtil.w("abc","=====測試按鈕被點擊了====");

打印出的log类似下面这样:

里面包含包名,日志级别,tag,类名,方法名和log的行数

四. 项目结构图和效果图

项目结构截图

运行效果图

代码地址如下:
http://www.demodashi.com/demo/12646.html

注:本文著作权归作者,由demo大师代发,拒绝转载,转载需要作者授权

原文地址:https://www.cnblogs.com/demodashi/p/9436520.html

时间: 2024-08-01 00:59:07

超高逼格Log日志打印的相关文章

常用的Log日志打印与输出

/** * log日志 * @author Jenly * */ public class LogUtils { private static final String TAG = "Jenly"; private static final String COLON = ":"; private static final String ARROW = "->"; /** 是否显示Log日志 */ private static boolean

项目log日志打印

①使用到的jar包: 大概是这几个,具体我也不知道是哪一个,下次使用的时候自己测试下. commons-logging-1.2.jar commons-discovery-0.5.jar log4j-1.2.17.jar ②log4j.properties log4j.rootLogger=DEBUG,CONSOLE,A log4j.addivity.org.apache=false log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender

Log日志打印集合类型

看到Logger可以打印json,当时就想能不能打印集合呢,现在通过学习了一些反射的东西,写了出来,仅供参考. public static <E> void list(List<E> list) { if (IS_DDEBUG) { if (list == null || list.size() == 0) { Logger.d("list为空"); } else { Field[] allFields = null; StringBuilder builder

关于android手机不能打印Log日志

作为一个android开发者,当log打印不出来的的时候是很痛苦的.相信有人遇到过ADB连接正常,在开发工具上也正常显示设备信息正常却无法打印log或者只能打印部分log,那不妨可以试试进入工程模式调试一下log日志等级. 我的是360青春版,以此手机为例,首先进入拨号界面输入"*20121220#"(不同的品牌的进入方法不一样,可自行百度),进入界面1: 进入日志输出等级  界面2: 首先确定日志打印是否开启,如未开启请开启 界面3.4: 然后进入log日志等级,已android为例

Mybatis中在log日志或控制台打印执行的sql

最近在调试代码时,需要查看当前操作执行的sql,在日志里没查到,经过修改logback配置后成功,现记录如下:一.Mybatis版本是3.0.6(我正在用的版本)该版本只需要修改logback.xml <logger name="java.sql.Connection" level="DEBUG" /><logger name="java.sql.Statement" level="DEBUG" />&

python日志打印和写入并发简易版本实现

大家一般都用logging日志打印,但logging是线程安全的,多进程也有很多介绍,引入一些文件锁,对logging做好配置,能过支持. 但通过测试,发现多进程时还是容易出现重复写入文件或者打印正常漏写入文件的问题. 我的日志需求比较简单,能够区分文件,正确的写入日志文件. 引入文件锁:日志写入函数封装到一个操作_Logger类中: 日志名称和写入级别封装到一个业务类Logger中. 本范例基于python3实现.本范例20个进程并发,分别写入3个文件,每s每个文件写入超过100行数据,日志文

Android学习笔记——log无法输出的解决方法和命令行查看log日志

本人邮箱:[email protected],欢迎交流讨论. 欢迎转载,转载请注明网址:http://www.cnblogs.com/JohnTsai/p/3983936.html. 知识点 1.log无法输出的解决方法 2.通过命令行(command line)查看Android调试的log日志 log无法输出的解决方法 今天调试Android程序,发现Eclipse不输出log日志了.这让我很烦恼,程序调试的log都没法看到了.Google搜索了一些资料.发现stackoverflow上有很

eclipse启动gc日志打印

在eclipse根目录下的eclipse.ini配置文件中添加以下参数: -verbose:gc (开启打印垃圾回收日志) -Xloggc:eclipse_gc.log (设置垃圾回收日志打印的文件,文件名称可以自定义) -XX:+PrintGCTimeStamps (打印垃圾回收时间信息时的时间格式) -XX:+PrintGCDetails (打印垃圾回收详情) GC一般为堆空间某个区发生了垃圾回收, Full GC基本都是整个堆空间及持久代发生了垃圾回收,通常优化的目标之一是尽量减少GC和F

常用的NSLOG日志打印格式

常用的NSLOG日志打印格式 字数126 阅读28 评论0 喜欢0 以下是常用的LOG打印,如果有特殊,请@我,这边会不定期更新. %@        对象 %d, %i   整数 %u         无符整形 %f          浮点/双字 %x, %X  二进制整数 %o         八进制整数 %zu       size_t %p        指针 %e        浮点/双字 (科学计算) %g        浮点/双字 %s        C 字符串 %.*s