LogUtil

本文介绍了一款名为LogUtil的日志工具类,该工具支持多种日志级别,并提供了文件日志功能。LogUtil能够有效地记录应用运行时的详细信息,帮助开发者定位问题并进行调试。文章还详细介绍了其主要功能及实现细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/**
 *
 * Copyright (c) 2014 CoderKiss
 *
 * CoderKiss[AT]gmail.com
 *
 */

package com.kisstools.utils;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.RandomAccessFile;

import android.text.TextUtils;
import android.util.Log;

import com.kisstools.KissTools;

public class LogUtil {
   public final static String TAG = "LogUtil";

   private static final String LOG_FORMAT = "%1$s\n%2$s";

   public final static int LOG_VERBOSE = Log.VERBOSE;
   public final static int LOG_DEBUG = Log.DEBUG;
   public final static int LOG_INFO = Log.INFO;
   public final static int LOG_WARN = Log.WARN;
   public final static int LOG_ERROR = Log.ERROR;
   public final static int LOG_ASSERT = Log.ASSERT;
   public final static int LOG_NONE = Log.ASSERT + 1;

   public final static int LOG_DEFAULT = LOG_VERBOSE;
   private static int mLogPriority = LOG_DEFAULT;

   private final static int LOG_MAX_MEM = 16384; // 16k
   private final static int LOG_MAX_LEN = 2048; // 2k
   private final static long LOG_FILE_LEN = 4194304; // 4MB

   private static boolean mFileLog = false;
   private static StringBuilder mStringBuilder = new StringBuilder();;

   public static void setLogPriority(int priority) {
      mLogPriority = priority;
   }

   public static int getLogPriority() {
      return mLogPriority;
   }

   public static void setFileLog(boolean fileLog) {
      mFileLog = fileLog;
   }

   public static void v(String tag, String msg) {
      log(Log.VERBOSE, null, tag, msg);
   }

   public static void d(String tag, String msg) {
      log(LOG_DEBUG, null, tag, msg);
   }

   public static void i(String tag, String msg) {
      log(LOG_INFO, null, tag, msg);
   }

   public static void w(String tag, String msg) {
      log(LOG_WARN, null, tag, msg);
   }

   public static void e(String tag, String msg) {
      log(LOG_ERROR, null, tag, msg);
   }

   public static void e(Throwable ex) {
      log(LOG_ERROR, ex, null, null);
   }

   public static void e(String tag, Throwable ex) {
      log(LOG_ERROR, ex, tag, null);
   }

   public static void e(String tag, String msg, Throwable ex) {
      log(LOG_ERROR, ex, tag, msg);
   }

   public static void destroy() {
      writeLog();
   }

   private static void log(int priority, Throwable ex, String tag,
         String message) {
      if (priority < mLogPriority) {
         return;
      }

      if (ex != null) {
         message = message == null ? ex.getMessage() : message;
         String logBody = Log.getStackTraceString(ex);
         message = String.format(LOG_FORMAT, message, logBody);
      }

      String text = message;
      int partLen = 0;
      int length = text.length();
      while (text != null && length > 0) {
         partLen = length > LOG_MAX_LEN ? LOG_MAX_LEN : length;
         String partLog = text.substring(0, partLen);
         Log.println(priority, tag, partLog);
         text = text.substring(partLen);
         length = text.length();
      }

      if (mFileLog) {
         synchronized (mStringBuilder) {
            mStringBuilder.append(message);
            int builderLen = mStringBuilder.length();
            if (builderLen > LOG_MAX_MEM) {
               writeLog();
            }
         }
      }
   }

   private static void writeLog() {
      new Thread() {
         public void run() {
            write2LogFile();
         }
      }.start();
   }

   private static void write2LogFile() {
      String log = null;
      synchronized (mStringBuilder) {
         log = mStringBuilder.toString();
         int length = mStringBuilder.length();
         mStringBuilder.delete(0, length);
      }

      String logFolder = getLogFolder();
      if (TextUtils.isEmpty(logFolder)) {
         return;
      }

      String logPath = logFolder + "/bestutils.log";
      File logFile = new File(logPath);
      if (!logFile.exists()) {
         FileUtil.create(logPath);
      }
      if (logFile.length() >= LOG_FILE_LEN) {
         resizeLogFile(logFile);
      }

      try {
         FileOutputStream fos = new FileOutputStream(logFile, true);
         fos.write(log.getBytes());
         fos.close();
      } catch (Exception e) {
         e.printStackTrace();
      }
   }

   private static void resizeLogFile(File logFile) {
      BufferedOutputStream bos = null;
      RandomAccessFile raf = null;
      try {
         String logFolder = getLogFolder();
         if (TextUtils.isEmpty(logFolder)) {
            return;
         }
         String tempLog = logFolder + "/temp.log";
         FileUtil.delete(tempLog);
         if (!FileUtil.create(tempLog)) {
            return;
         }

         bos = new BufferedOutputStream(new FileOutputStream(tempLog));
         raf = new RandomAccessFile(logFile, "r");
         raf.seek(LOG_FILE_LEN / 2);
         int readLen = 0;
         byte[] readBuff = new byte[1024];
         while ((readLen = raf.read(readBuff)) != -1) {
            bos.write(readBuff, 0, readLen);
         }

         logFile.delete();
         FileUtil.move(tempLog, logFile.getAbsolutePath());
      } catch (IOException e) {
         e.printStackTrace();
      } finally {
         try {
            if (bos != null) {
               bos.close();
            }
            if (raf != null) {
               raf.close();
            }
         } catch (IOException e) {
            e.printStackTrace();
         }
      }
   }

   private static final String getLogFolder() {
      File cacheFolder = KissTools.getApplicationContext().getExternalCacheDir();
      String logFolder = cacheFolder.getAbsolutePath() + "/KissTools";
      return logFolder;
   }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值