package com.tiger.quicknews.utils; import android.os.Environment; import android.util.Log; import java.io.BufferedWriter; import java.io.File; import java.io.FileOutputStream; import java.io.OutputStreamWriter; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.Locale; /** * ������־��ͳһ��� * * @author Xue Wenchao */ public class LogUtils { // �Ƿ������־�Ŀ��� public static boolean DEBUG = true; public static void i(String TAG, String msg) { if (DEBUG) { Log.i(TAG, msg); FileLogger.getInstance().addLog(TAG, msg); } } public static void i(String TAG, String msg, Throwable e) { if (DEBUG) { Log.i(TAG, msg, e); FileLogger.getInstance().addLog(TAG, msg, e); } } public static void e(String TAG, String msg) { if (DEBUG) { Log.e(TAG, msg); FileLogger.getInstance().addLog(TAG, msg); } } public static void e(String TAG, String msg, Throwable e) { if (DEBUG) { Log.e(TAG, msg, e); FileLogger.getInstance().addLog(TAG, msg, e); } } public static void d(String TAG, String msg) { if (DEBUG) { Log.d(TAG, msg); FileLogger.getInstance().addLog(TAG, msg); } } public static void d(String TAG, String msg, Throwable e) { if (DEBUG) { Log.d(TAG, msg, e); FileLogger.getInstance().addLog(TAG, msg, e); } } public static void v(String TAG, String msg) { if (DEBUG) { Log.v(TAG, msg); FileLogger.getInstance().addLog(TAG, msg); } } public static void v(String TAG, String msg, Throwable e) { if (DEBUG) { Log.v(TAG, msg, e); FileLogger.getInstance().addLog(TAG, msg, e); } } public static void w(String TAG, String msg) { if (DEBUG) { Log.w(TAG, msg); FileLogger.getInstance().addLog(TAG, msg); } } public static void w(String TAG, String msg, Throwable e) { if (DEBUG) { Log.w(TAG, msg, e); FileLogger.getInstance().addLog(TAG, msg, e); } } public static void println() { if (DEBUG) { System.out.println(); FileLogger.getInstance().addLog("", ""); } } public static void println(Object msg) { if (DEBUG) { System.out.println(msg); FileLogger.getInstance().addLog("System.out", msg.toString()); } } public static void print(Object msg) { if (DEBUG) { System.out.print(msg); FileLogger.getInstance().addLog("System.out", msg.toString()); } } public static void printStackTrace(Throwable e) { if (DEBUG) { e.printStackTrace(); FileLogger.getInstance().addLog("System.out", e); } } public static void stopFileLogger() { FileLogger.getInstance().stop(); } /** * ������־�Ĵ��·�� * * @param fileLogPath */ public static void setFileLogPath(String fileLogPath) { FileLogger.getInstance().setLogPath(fileLogPath); } private static class FileLogger implements Runnable { private static FileLogger inst = new FileLogger(); private String logPath;// ��־��ŵ�·�� private final ArrayList<String> logList = new ArrayList<String>(); public static FileLogger getInstance() { return inst; } public void setLogPath(String logPath) { if (logPath != null && !logPath.endsWith(File.separator)) { this.logPath = logPath + File.separator; } else { this.logPath = logPath; } } private boolean isSDCardAvailable() { return Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED); } public void addLog(String TAG, String message) { if (!isSDCardAvailable() || logPath == null) { return; } synchronized (this) { logList.add("[" + getTime() + "][" + TAG + "] " + message); notifyWrite(); } } public void addLog(String TAG, Throwable e) { if (!isSDCardAvailable() || logPath == null) { return; } synchronized (this) { addLog(TAG, e.toString()); StackTraceElement[] elements = e.getStackTrace(); for (int i = 0; i < elements.length; i++) { StackTraceElement element = elements[i]; logList.add(" " + element.toString()); } Throwable cause = e.getCause(); if (cause != null) { logList.add(" Caused by: " + cause.toString()); elements = cause.getStackTrace(); for (int i = 0; i < elements.length; i++) { StackTraceElement element = elements[i]; logList.add(" " + element.toString()); } } notifyWrite(); } } public void addLog(String TAG, String message, Throwable e) { if (!isSDCardAvailable() || logPath == null) { return; } synchronized (this) { addLog(TAG, message); addLog(TAG, e); } } private String getLog() { synchronized (this) { if (logList.size() > 0) { return logList.remove(0); } return null; } } private Thread thread; private boolean isRunning; private void notifyWrite() { if (!isRunning && isSDCardAvailable()) { isRunning = true; thread = new Thread(this); thread.start(); } } private static SimpleDateFormat dateTimeFormat = new SimpleDateFormat("MM-dd HH:mm:ss.SSS", Locale.getDefault()); private static SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()); public static String getTime() { return dateTimeFormat.format(new Date()); } public String getLogFileName() { return dateFormat.format(new Date()) + ".txt"; } public void stop() { isRunning = false; } @Override public void run() { FileOutputStream fos = null; BufferedWriter writer = null; int count = 0; while (true) { String log = getLog(); if (!isRunning) { break; } if (log == null) { if (count > 5) { break; } else { ++count; try { Thread.sleep(200); } catch (InterruptedException e) { } continue; } } if (!isSDCardAvailable() || logPath == null) { break; } try { String logDir = logPath; Utils.createDirs(new File(logDir)); File file = new File(logDir + getLogFileName()); if (!file.exists()) { LogUtils.i("LogUtils", "LogUtils createNewFile log file path:" + file.getPath()); file.createNewFile(); } fos = new FileOutputStream(file, true); writer = new BufferedWriter(new OutputStreamWriter(fos)); // д�ļ� writer.write(log); writer.newLine(); } catch (Throwable e) { e.printStackTrace(); break; } finally { CloseUtils.close(writer); CloseUtils.close(fos); } } isRunning = false; thread = null; } } }