代码地址如下:
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的行数

四. 项目结构图和效果图

项目结构截图

运行效果图

超高逼格Log日志打印

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

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

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

  1. android的Log日志打印管理工具类(一)

    android的Log日志的打印管理工具类: package com.gzcivil.utils; import android.util.Log; /** * 日志打印管理 * * @author ...

  2. Java编码常见的Log日志打印问题

    前言 本文总结了作者在Java代码检视中遇到的一些关于日志打印的问题,并给出修改建议.因能力有限,难免存在错漏,欢迎指正. 一. 不规范的异常打印 使用slf4j日志组件时,logger.error( ...

  3. Javascript 将 console.log 日志打印到 html 页面中

    如何将 console.log() 打印的日志输出到 html 页面中 (function () { var old = console.log; var logger = document.getE ...

  4. 树莓派 log 日志 打印到 TXT

    #include<stdio.h> #include <stdarg.h> #include <unistd.h> #include <stdint.h> ...

  5. Junit测试打印详细的log日志,可以看到sql

    Junit测试打印详细的log日志,可以看到sql 在log4j.xml的日志配置文件中,把日志级别从info级别调整到debug级别: <?xml version="1.0" ...

  6. log日志中不打印异常栈的具体信息

    问题与分析 最近在查项目的log时发现报了大量的NPE(NullPointerException),诡异的是只log了Exception的类名,却没有具体的堆栈信息,以致于无法对该NPE异常进行准确定 ...

  7. rest-assured 将log()中的信息打印到log日志中去的方法

    rest-assured 将log()中的信息打印到log日志中去的方法: ============方法1============== PrintStream fileOutPutStream = n ...

  8. android 华为、魅族手机无法打印 Log 日志的问题

    最近使用魅族真机测试 App 时,发现 LogCat 不显示项目工程中通过Log.d()和Log.v()打印的 debug 和 verbose 级别的日志,甚是奇怪,通过 debug 模式断点调试也没 ...

  9. Xposed框架Hook Android应用的所有类方法打印Log日志

    本文博客地址:https://blog.csdn.net/QQ1084283172/article/details/80954759 在进行Android程序的逆向分析的时候,经常需要Android程 ...

随机推荐

  1. Sax解析xml及pull解析xml

    sax解析参考:http://www.iteye.com/topic/763895: 说明:测试时报空指针异常,未能读取到数据,关注Sax解析的过程及API即可: pull解析参考:http://ww ...

  2. python--线程池(concurrent.futures)

    #!/usr/bin/env python # -*- coding:utf-8 -*- # author:love_cat # 为什么需要线程池 # 1.主线程中可以获取某一个线程的状态或者某一个任 ...

  3. chanme的博客搬家了!

    一直以来都想自己租一台服务器,买个域名做一个自己的博客,但是由于时间和知识的关系,以前还不太知道怎么搭一个博客.终于我在上个礼拜成功的迈出了建站的第一步,然后陆陆续续的也将一些后续的步骤做好了.所以今 ...

  4. AC日记——Little Elephant and Shifts codeforces 221e

    E - Little Elephant and Shifts 思路: 一次函数线段树(疯狂debug): b不断循环左移,判断每次最小的|i-j|,a[i]=b[j]: 仔细观察发现,每个bi移动时, ...

  5. Python的网络编程[1] -> FTP 协议[1] -> 使用 pyftplib 建立 FTP 服务器

    使用 pyftplib 建立 FTP 服务器 pyftplib 主要用于建立 FTP Server,与 ftplib 建立的 Client 进行通信. 快速导航 1. 模块信息 2. 建立 FTP 服 ...

  6. spark-reduceByKey算子

  7. 818D - Multicolored Cars

    818D - Multicolored Cars 题意 在 1 到 n 时刻,有 n 量有颜色的车通过,用数字表示颜色,Alice 选择一个颜色A,要求 Bob 选择一个颜色B,使得对于任意时刻 cn ...

  8. luogu P1529 回家 Bessie Come Home

    题目描述 现在是晚餐时间,而母牛们在外面分散的牧场中. 农民约翰按响了电铃,所以她们开始向谷仓走去. 你的工作是要指出哪只母牛会最先到达谷仓(在给出的测试数据中,总会有且只有一只最快的母牛). 在挤奶 ...

  9. Delphi CRC32Verify控件

    unit CRC32Verify; interface uses  Windows, Messages, SysUtils, Classes, Forms; CONST    table:  ARRA ...

  10. 小程序 wx:for 循环嵌套

    json数据: [//library-6F    [//library-6F-601      [//id:1-1 ,8(Y/N),9(Y/N)……21(Y/N)        'Y','Y','Y' ...