代码语言
.
CSharp
.
JS
Java
Asp.Net
C
MSSQL
PHP
Css
PLSQL
Python
Shell
EBS
ASP
Perl
ObjC
VB.Net
VBS
MYSQL
GO
Delphi
AS
DB2
Domino
Rails
ActionScript
Scala
代码分类
文件
系统
字符串
数据库
网络相关
图形/GUI
多媒体
算法
游戏
Jquery
Extjs
Android
HTML5
菜单
网页交互
WinForm
控件
企业应用
安全与加密
脚本/批处理
开放平台
其它
【
Java
】
日志相关
作者:
明华
/ 发布于
2017/2/21
/
832
package com.blankj.utilcode.utils; import android.os.Environment; import android.util.Log; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; /** * <pre> * author: Blankj * blog : http://blankj.com * time : 2016/9/21 * desc : 日志相关工具类 * </pre> */ public class LogUtils { private LogUtils() { throw new UnsupportedOperationException("u can't instantiate me..."); } private static boolean logSwitch = true; private static boolean log2FileSwitch = false; private static char logFilter = 'v'; private static String tag = "TAG"; private static String dir = null; private static int stackIndex = 0; /** * 初始化函数 * 与{@link #getBuilder()}两者选其一 * * @param logSwitch 日志总开关 * @param log2FileSwitch 日志写入文件开关,设为true需添加权限 {@code <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>} * @param logFilter 输入日志类型有{@code v, d, i, w, e}v代表输出所有信息,w则只输出警告... * @param tag 标签 */ public static void init(boolean logSwitch, boolean log2FileSwitch, char logFilter, String tag) { if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) { dir = Utils.getContext().getExternalCacheDir().getPath() + File.separator; } else { dir = Utils.getContext().getCacheDir().getPath() + File.separator; } LogUtils.logSwitch = logSwitch; LogUtils.log2FileSwitch = log2FileSwitch; LogUtils.logFilter = logFilter; LogUtils.tag = tag; } /** * 获取LogUtils建造者 * 与{@link #init(boolean, boolean, char, String)}两者选其一 * * @return Builder对象 */ public static Builder getBuilder() { if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) { dir = Utils.getContext().getExternalCacheDir().getPath() + File.separator + "log" + File.separator; } else { dir = Utils.getContext().getCacheDir().getPath() + File.separator + "log" + File.separator; } return new Builder(); } public static class Builder { private boolean logSwitch = true; private boolean log2FileSwitch = false; private char logFilter = 'v'; private String tag = "TAG"; public Builder setLogSwitch(boolean logSwitch) { this.logSwitch = logSwitch; return this; } public Builder setLog2FileSwitch(boolean log2FileSwitch) { this.log2FileSwitch = log2FileSwitch; return this; } public Builder setLogFilter(char logFilter) { this.logFilter = logFilter; return this; } public Builder setTag(String tag) { this.tag = tag; return this; } public void create() { LogUtils.logSwitch = logSwitch; LogUtils.log2FileSwitch = log2FileSwitch; LogUtils.logFilter = logFilter; LogUtils.tag = tag; } } /** * Verbose日志 * * @param msg 消息 */ public static void v(Object msg) { log(tag, msg.toString(), null, 'i'); } /** * Verbose日志 * * @param tag 标签 * @param msg 消息 */ public static void v(String tag, Object msg) { log(tag, msg.toString(), null, 'i'); } /** * Verbose日志 * * @param tag 标签 * @param msg 消息 * @param tr 异常 */ public static void v(String tag, Object msg, Throwable tr) { log(tag, msg.toString(), tr, 'v'); } /** * Debug日志 * * @param msg 消息 */ public static void d(Object msg) { log(tag, msg.toString(), null, 'd'); } /** * Debug日志 * * @param tag 标签 * @param msg 消息 */ public static void d(String tag, Object msg) { log(tag, msg.toString(), null, 'd'); } /** * Debug日志 * * @param tag 标签 * @param msg 消息 * @param tr 异常 */ public static void d(String tag, Object msg, Throwable tr) { log(tag, msg.toString(), tr, 'd'); } /** * Info日志 * * @param msg 消息 */ public static void i(Object msg) { log(tag, msg.toString(), null, 'i'); } /** * Info日志 * * @param tag 标签 * @param msg 消息 */ public static void i(String tag, Object msg) { log(tag, msg.toString(), null, 'i'); } /** * Info日志 * * @param tag 标签 * @param msg 消息 * @param tr 异常 */ public static void i(String tag, Object msg, Throwable tr) { log(tag, msg.toString(), tr, 'i'); } /** * Warn日志 * * @param msg 消息 */ public static void w(Object msg) { log(tag, msg.toString(), null, 'w'); } /** * Warn日志 * * @param tag 标签 * @param msg 消息 */ public static void w(String tag, Object msg) { log(tag, msg.toString(), null, 'w'); } /** * Warn日志 * * @param tag 标签 * @param msg 消息 * @param tr 异常 */ public static void w(String tag, Object msg, Throwable tr) { log(tag, msg.toString(), tr, 'w'); } /** * Error日志 * * @param msg 消息 */ public static void e(Object msg) { log(tag, msg.toString(), null, 'e'); } /** * Error日志 * * @param tag 标签 * @param msg 消息 */ public static void e(String tag, Object msg) { log(tag, msg.toString(), null, 'e'); } /** * Error日志 * * @param tag 标签 * @param msg 消息 * @param tr 异常 */ public static void e(String tag, Object msg, Throwable tr) { log(tag, msg.toString(), tr, 'e'); } /** * 根据tag, msg和等级,输出日志 * * @param tag 标签 * @param msg 消息 * @param tr 异常 * @param type 日志类型 */ private static void log(String tag, String msg, Throwable tr, char type) { if (msg == null || msg.isEmpty()) return; if (logSwitch) { if ('e' == type && ('e' == logFilter || 'v' == logFilter)) { printLog(generateTag(tag), msg, tr, 'e'); } else if ('w' == type && ('w' == logFilter || 'v' == logFilter)) { printLog(generateTag(tag), msg, tr, 'w'); } else if ('d' == type && ('d' == logFilter || 'v' == logFilter)) { printLog(generateTag(tag), msg, tr, 'd'); } else if ('i' == type && ('d' == logFilter || 'v' == logFilter)) { printLog(generateTag(tag), msg, tr, 'i'); } if (log2FileSwitch) { log2File(type, generateTag(tag), msg + '\n' + Log.getStackTraceString(tr)); } } } /** * 根据tag, msg和等级,输出日志 * * @param tag 标签 * @param msg 消息 * @param tr 异常 * @param type 日志类型 */ private static void printLog(final String tag, final String msg, Throwable tr, char type) { final int maxLen = 4000; for (int i = 0, len = msg.length(); i * maxLen < len; ++i) { String subMsg = msg.substring(i * maxLen, (i + 1) * maxLen < len ? (i + 1) * maxLen : len); switch (type) { case 'e': Log.e(tag, subMsg, tr); break; case 'w': Log.w(tag, subMsg, tr); break; case 'd': Log.d(tag, subMsg, tr); break; case 'i': Log.i(tag, subMsg, tr); break; } } } /** * 打开日志文件并写入日志 * * @param type 日志类型 * @param tag 标签 * @param msg 信息 **/ private synchronized static void log2File(final char type, final String tag, final String msg) { Date now = new Date(); String date = new SimpleDateFormat("MM-dd", Locale.getDefault()).format(now); final String fullPath = dir + date + ".txt"; if (!FileUtils.createOrExistsFile(fullPath)) return; String time = new SimpleDateFormat("MM-dd HH:mm:ss.SSS", Locale.getDefault()).format(now); final String dateLogContent = time + ":" + type + ":" + tag + ":" + msg + '\n'; new Thread(new Runnable() { @Override public void run() { BufferedWriter bw = null; try { bw = new BufferedWriter(new FileWriter(fullPath, true)); bw.write(dateLogContent); } catch (IOException e) { e.printStackTrace(); } finally { CloseUtils.closeIO(bw); } } }).start(); } /** * 产生tag * * @return tag */ private static String generateTag(String tag) { StackTraceElement[] stacks = Thread.currentThread().getStackTrace(); if (stackIndex == 0) { while (!stacks[stackIndex].getMethodName().equals("generateTag")) { ++stackIndex; } stackIndex += 3; } StackTraceElement caller = stacks[stackIndex]; String callerClazzName = caller.getClassName(); String format = "Tag[" + tag + "] %s[%s, %d]"; callerClazzName = callerClazzName.substring(callerClazzName.lastIndexOf(".") + 1); return String.format(format, callerClazzName, caller.getMethodName(), caller.getLineNumber()); } }
试试其它关键字
日志相关
同语言下
.
List 切割成几份 工具类
.
一行一行读取txt的内容
.
Java PDF转换成图片并输出给前台展示
.
java 多线程框架
.
double类型如果小数点后为零则显示整数否则保留两位小
.
将图片转换为Base64字符串公共类抽取
.
sqlParser 处理SQL(增删改查) 替换schema 用于多租户
.
JAVA 月份中的第几周处理 1-7属于第一周 依次类推 29-
.
java计算两个经纬度之间的距离
.
输入时间参数计算年龄
可能有用的
.
C#实现的html内容截取
.
List 切割成几份 工具类
.
SQL查询 多列合并成一行用逗号隔开
.
一行一行读取txt的内容
.
C#动态修改文件夹名称(FSO实现,不移动文件)
.
c# 移动文件或文件夹
.
c#图片添加水印
.
Java PDF转换成图片并输出给前台展示
.
网站后台修改图片尺寸代码
.
处理大图片在缩略图时的展示
明华
贡献的其它代码
(
21
)
.
在每周日凌晨零点零分定期备份/user/backup到/tmp目录
.
table给tbody设置滚动条
.
判断两个字符串是否存在相同的内容
.
屏幕中间的弹框列表
.
关于定时器动画效果
.
Shell相关
.
日志相关
.
拼接JSON字符串
.
纯servlet实现文件上传和下载文件
.
获取签名公钥 和 公钥私钥加解密
Copyright © 2004 - 2024 dezai.cn. All Rights Reserved
站长博客
粤ICP备13059550号-3