Log 日志 工具类 扩展 保存为文件

时间:2020-12-01 10:45:59
简介
按照日志级别从高到低为ERROR, WARN, INFO, DEBUG, VERBOSE
  • 1、Log.v 的输出颜色为黑色的,输出大于或等于VERBOSE日志级别的信息
  • 2、Log.d的输出颜色是蓝色的,输出大于或等于DEBUG日志级别的信息
  • 3、Log.i的输出为绿色,输出大于或等于INFO日志级别的信息
  • 4、Log.w的输出为橙色, 输出大于或等于WARN日志级别的信息
  • 5、Log.e的输出为红色,仅输出ERROR日志级别的信息
另外
  • System.err的级别和 W 相同,Tag为默认的System.err
  • System.out的级别和 I 相同,Tag为默认的System.out

演示

打印的日志
Log 日志 工具类 扩展 保存为文件
产生的文件内容Log 日志 工具类 扩展 保存为文件
    
    
  1. public class MainActivity extends Activity {
  2. String tag = "MainActivity";//标记,一般使用类名
  3. @Override
  4. protected void onCreate(Bundle savedInstanceState) {
  5. super.onCreate(savedInstanceState);
  6. setContentView(R.layout.activity_main);
  7. MyLog.v(tag, "vvvvv");//黑色
  8. MyLog.d(tag, "vvvvv");//蓝色
  9. MyLog.i(tag, "vvvvv");//绿色
  10. MyLog.w(tag, "vvvvv");//橙色
  11. MyLog.e(tag, "vvvvv");//红色
  12. }
  13. }

简单的日志工具类

    
    
  1. public class L {
  2. /**
  3. * 是否需要打印bug,可以在application的onCreate函数里面初始化
  4. */
  5. public static boolean isDebug = true;
  6. private static final String TAG = "bqt";
  7. private L() {
  8. }
  9. //**********************************************下面四个是默认tag的函数 ********************************************
  10. public static void i(String msg) {
  11. if (isDebug) Log.i(TAG, msg);
  12. }
  13. public static void d(String msg) {
  14. if (isDebug) Log.d(TAG, msg);
  15. }
  16. public static void e(String msg) {
  17. if (isDebug) Log.e(TAG, msg);
  18. }
  19. public static void v(String msg) {
  20. if (isDebug) Log.v(TAG, msg);
  21. }
  22. //******************************************下面是传入自定义tag的函数 ************************************************
  23. public static void i(String tag, String msg) {
  24. if (isDebug) Log.i(tag, msg);
  25. }
  26. public static void d(String tag, String msg) {
  27. if (isDebug) Log.i(tag, msg);
  28. }
  29. public static void e(String tag, String msg) {
  30. if (isDebug) Log.i(tag, msg);
  31. }
  32. public static void v(String tag, String msg) {
  33. if (isDebug) Log.i(tag, msg);
  34. }
  35. }

加强版日志工具类

一个可打印并可跳转到"日志所在类、所在行"的工具类效果如下:
    
    
  1. LogUtils.i("日志内容");
  2. I/MainActivity$override: 包青天(MainActivity.java:59)#onListItemClick【日志内容】
其中"MainActivity.java:59" 这一部分可在点击后调到日志所在行
    
    
  1. public class LogUtils {
  2. public final static boolean DEBUG = BuildConfig.DEBUG;
  3. public static void v(String message, Object... args) {
  4. if (DEBUG) log(Log.VERBOSE, formatMessage(message, args));
  5. }
  6. public static void d(String message, Object... args) {
  7. if (DEBUG) log(Log.DEBUG, formatMessage(message, args));
  8. }
  9. public static void i(String message, Object... args) {
  10. if (DEBUG) log(Log.INFO, formatMessage(message, args));
  11. }
  12. public static void w(String message, Object... args) {
  13. log(Log.WARN, formatMessage(message, args));
  14. }
  15. public static void e(String message, Object... args) {
  16. log(Log.ERROR, formatMessage(message, args));
  17. }
  18. /**
  19. * 根据type输出日志消息,包括方法名,方法行数,Message
  20. *
  21. * @param type 日志类型,如Log.INFO
  22. * @param message 日志内容
  23. */
  24. private static void log(int type, String message) {
  25. StackTraceElement stackTrace = Thread.currentThread().getStackTrace()[4];
  26. String className = stackTrace.getClassName();
  27. String tag = className.substring(className.lastIndexOf('.') + 1);
  28. StringBuilder sb = new StringBuilder();
  29. sb.append("包青天")
  30. .append("(")
  31. .append(stackTrace.getFileName())//文件名
  32. .append(":")
  33. .append(stackTrace.getLineNumber())//行号
  34. .append(")")
  35. .append("#")
  36. .append(stackTrace.getMethodName())//方法名
  37. .append("【")
  38. .append(message)//消息
  39. .append("】");
  40. switch (type) {
  41. case Log.DEBUG:
  42. Log.d(tag, sb.toString());
  43. break;
  44. case Log.INFO:
  45. Log.i(tag, sb.toString());
  46. break;
  47. case Log.WARN:
  48. Log.w(tag, sb.toString());
  49. break;
  50. case Log.ERROR:
  51. Log.e(tag, sb.toString());
  52. break;
  53. case Log.VERBOSE:
  54. Log.v(tag, sb.toString());
  55. break;
  56. }
  57. }
  58. private static String formatMessage(String message, Object... args) {
  59. if (TextUtils.isEmpty(message)) return "";
  60. if (args != null && args.length > 0) {
  61. try {
  62. return String.format(message, args);
  63. } catch (Exception e) {
  64. e.printStackTrace();
  65. }
  66. }
  67. return message;
  68. }
  69. }

扩展的日志工具类

   
   
  1. public class MyLog {
  2. private static Boolean MYLOG_SWITCH = true; // 是否打印日志及是否写入到文件的总开关
  3. private static Boolean MYLOG_WRITE_TO_FILE = true;// 是否将日志写入到文件的开关
  4. private static char MYLOG_TYPE = 'v';// 输入日志类型,仅输出比自己级别高的日志,日志级别ERROR, WARN, INFO, DEBUG, VERBOSE
  5. private static String MYLOG_PATH_SDCARD_DIR = Environment.getExternalStorageDirectory().getPath() + "/bqt";// 日志文件的路径
  6. private static String MYLOGFILEName = "Log-";// 日志文件名称①
  7. private static SimpleDateFormat logfile = new SimpleDateFormat("yyyy-MM-dd");// 日志文件名称②
  8. //**************************************************************************************************************************
  9. public static void w(String tag, String text) {
  10. log(tag, text, 'w');
  11. }
  12. public static void e(String tag, String text) {
  13. log(tag, text, 'e');
  14. }
  15. public static void d(String tag, String text) {
  16. log(tag, text, 'd');
  17. }
  18. public static void i(String tag, String text) {
  19. log(tag, text, 'i');
  20. }
  21. public static void v(String tag, String text) {
  22. log(tag, text, 'v');
  23. }
  24. //**************************************************************************************************************************
  25. //根据tag, msg和等级输出日志
  26. private static void log(String tag, String msg, char level) {
  27. if (MYLOG_SWITCH) {
  28. if ('e' == level) Log.e(tag, msg);
  29. else if ('w' == level && ('w' == MYLOG_TYPE || 'i' == MYLOG_TYPE || 'd' == MYLOG_TYPE || 'v' == MYLOG_TYPE)) Log.w(tag, msg);
  30. else if ('i' == level && ('i' == MYLOG_TYPE || 'd' == MYLOG_TYPE || 'v' == MYLOG_TYPE)) Log.i(tag, msg);
  31. else if ('d' == level && ('d' == MYLOG_TYPE || 'v' == MYLOG_TYPE)) Log.d(tag, msg);
  32. else if ('v' == level && 'v' == MYLOG_TYPE) Log.v(tag, msg);
  33. if (MYLOG_WRITE_TO_FILE) writeLogtoFile(String.valueOf(level), tag, msg);
  34. }
  35. }
  36. //将日志写入文件,文件名格式为MYLOGFILEName + logfile.format(nowtime) + ".txt",如【Log-2015-12-25.txt】
  37. private static void writeLogtoFile(String mylogtype, String tag, String text) {
  38. Date nowtime = new Date();
  39. SimpleDateFormat myLogSdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  40. String myLogs = myLogSdf.format(nowtime) + " " + mylogtype + " " + tag + " " + text;
  41. if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) return;//判断sdcard是否插入
  42. File fileDir = new File(MYLOG_PATH_SDCARD_DIR);
  43. if (!fileDir.exists()) fileDir.mkdirs();//创建文件夹,这一步不能少
  44. File file = new File(fileDir, MYLOGFILEName + logfile.format(nowtime) + ".txt");
  45. try {
  46. FileWriter filerWriter = new FileWriter(file, true);//true代表在文件中原来的数据后面添加,不进行覆盖
  47. BufferedWriter bufWriter = new BufferedWriter(filerWriter);
  48. bufWriter.write(myLogs);
  49. bufWriter.newLine();
  50. bufWriter.close();
  51. } catch (IOException e) {
  52. e.printStackTrace();
  53. }
  54. }
  55. }
2017-6-20