package net.orleaf.android; import java.util.Calendar; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.util.Log; public class MyLog { public static final int LEVEL_ERROR = 1; public static final int LEVEL_WARN = 2; public static final int LEVEL_INFO = 3; public static final int LEVEL_DEBUG = 4; public static final int LEVEL_VERBOSE = 5; public static final int LEVEL_MAX = LEVEL_VERBOSE; /** * ログ保持期間 */ private static final long LOG_ROTATE_LIMIT_SEC = 2 * 24 * 60 * 60; // 2 days private static SQLiteDatabase mDb; /** * データベースを取得 */ public static SQLiteDatabase getDb(Context ctx) { if (mDb == null) { MyLogOpenHelper h = new MyLogOpenHelper(ctx); mDb = h.getWritableDatabase(); } return mDb; } /** * 古いログを消去する */ private static void rotate(Context ctx) { Calendar cal = Calendar.getInstance(); long t = cal.getTimeInMillis() / 1000 - LOG_ROTATE_LIMIT_SEC; getDb(ctx).delete(MyLogOpenHelper.TABLE_LOG, "created_at < " + t, null); } /** * ログをすべて消去する */ public static void clearAll(Context ctx) { getDb(ctx).delete(MyLogOpenHelper.TABLE_LOG, null, null); } /** * ログ採取 * * @param text ログ文字列 */ private static void add(Context ctx, int level, @SuppressWarnings("UnusedParameters") String tag, String text) { ContentValues values = new ContentValues(); Calendar cal = Calendar.getInstance(); values.put("created_at", cal.getTimeInMillis() / 1000); values.put("created_date", cal.getTime().toLocaleString()); values.put("level", level); values.put("log_text", text); getDb(ctx).insert(MyLogOpenHelper.TABLE_LOG, null, values); rotate(ctx); } public static void e(Context ctx, String tag, String text) { Log.e(tag, text); add(ctx, LEVEL_ERROR, tag, text); } public static void w(Context ctx, String tag, String text) { Log.w(tag, text); add(ctx, LEVEL_WARN, tag, text); } public static void i(Context ctx, String tag, String text) { Log.i(tag, text); add(ctx, LEVEL_INFO, tag, text); } public static void d(Context ctx, String tag, String text) { Log.d(tag, text); add(ctx, LEVEL_DEBUG, tag, text); } public static void v(Context ctx, String tag, String text) { Log.v(tag, text); add(ctx, LEVEL_VERBOSE, tag, text); } /** * ログを取得 * * @return カーソル */ @SuppressWarnings("unused") public static Cursor getLogCursor(Context ctx, int level) { return getDb(ctx).query(MyLogOpenHelper.TABLE_LOG, null, "level <= " + level, null, null, null, "created_at", null); } /** * ログを取得 * * @param maxlevel 取得するログレベルの閾値 * @return 全ログの文字列 */ public static String getLogText(Context ctx, int maxlevel) { Cursor c = getDb(ctx).query(MyLogOpenHelper.TABLE_LOG, null, "level <= " + maxlevel, null, null, null, "created_at", null); StringBuilder buf = new StringBuilder(); if (c.moveToFirst()) { do { int level = c.getInt(c.getColumnIndex("level")); String date = c.getString(c.getColumnIndex("created_date")); String log_text = c.getString(c.getColumnIndex("log_text")); buf.append(date).append(" ").append(getLevelString(level)).append(" ").append(log_text).append("\n"); } while (c.moveToNext()); } c.close(); return buf.toString(); } public static String getLogText(Context ctx) { return getLogText(ctx, LEVEL_MAX); } /** * ログレベルを文字で取得 * * @param level ログレベル * @return ログレベル文字 */ private static String getLevelString(int level) { if (level == LEVEL_ERROR) { return "E"; } else if (level == LEVEL_WARN) { return "W"; } else if (level == LEVEL_INFO) { return "I"; } else if (level == LEVEL_DEBUG) { return "D"; } else if (level == LEVEL_VERBOSE) { return "V"; } return "?"; } }