Files
ElderlyDialer/app/src/main/java/com/ttstd/dialer/utils/Logger.java
2026-03-06 09:50:58 +08:00

128 lines
4.4 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package com.ttstd.dialer.utils;
import android.content.Context;
import android.text.TextUtils;
import android.util.Log;
import com.ttstd.dialer.BuildConfig;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
public class Logger {
// 日志级别枚举
public enum LogLevel {
DEBUG, INFO, WARN, ERROR
}
private static final String TAG = "AppLogger";
private static final String LOG_FILE_NAME = "app_log.txt";
private static File logFile;
private static LogLevel logLevel = LogLevel.DEBUG; // 默认日志级别
private static boolean isDebugMode = BuildConfig.DEBUG; // 默认关闭Debug输出
// 初始化日志系统(需在应用启动时调用)
public static void initialize(Context context, boolean debugMode) {
isDebugMode = debugMode;
try {
File storageDir = context.getExternalFilesDir("log");
logFile = new File(storageDir, LOG_FILE_NAME);
} catch (Exception e) {
Log.e(TAG, "Log file init failed: " + e.getMessage());
}
}
// 设置全局日志级别
public static void setLogLevel(LogLevel level) {
logLevel = level;
}
// 核心日志方法
private static void log(LogLevel level, Object context, String name, String message) {
if (level.ordinal() < logLevel.ordinal()) return; // 低于设定级别不记录
String tag;
if (TextUtils.isEmpty(context.getClass().getSimpleName())) {
tag = context.toString();
} else {
tag = context.getClass().getSimpleName();
}
String logMsg = formatLog(level, tag, name, message);
writeToFile(logMsg); // 始终写入文件
if (isDebugMode) {
outputToConsole(level, tag, name, message); // 仅Debug模式输出到控制台
}
}
// 格式化日志(含时间戳、线程信息)
private static String formatLog(LogLevel level, String tag, String name, String message) {
String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS", Locale.getDefault()).format(new Date());
String threadName = Thread.currentThread().getName();
return String.format("%s [%s] %s/%s: %s %s\n", time, threadName, level.name(), tag, name, message);
}
// 写入日志文件
private static void writeToFile(String logMsg) {
if (logFile == null) return;
try (FileWriter writer = new FileWriter(logFile, true)) {
writer.append(logMsg);
} catch (IOException e) {
Log.e(TAG, "File write failed: " + e.getMessage());
}
}
// 输出到Android控制台Logcat
private static void outputToConsole(LogLevel level, String tag, String name, String message) {
switch (level) {
case DEBUG:
Log.d(tag, name + " : " + message);
break;
case INFO:
Log.i(tag, name + " : " + message);
break;
case WARN:
Log.w(tag, name + " : " + message);
break;
case ERROR:
Log.e(tag, name + " : " + message);
break;
}
}
// 快捷调用方法自动使用类名作为TAG
public static void d(Object context, String name, String message) {
log(LogLevel.DEBUG, context.getClass().getSimpleName(), name, message);
}
public static void i(Object context, String name, String message) {
log(LogLevel.INFO, context.getClass().getSimpleName(), name, message);
}
public static void w(Object context, String name, String message) {
log(LogLevel.WARN, context.getClass().getSimpleName(), name, message);
}
public static void e(Object context, String name, String message) {
log(LogLevel.ERROR, context, name, message);
}
public static void d(Object context, String name) {
log(LogLevel.DEBUG, context.getClass().getSimpleName(), name, "");
}
public static void i(Object context, String name) {
log(LogLevel.INFO, context.getClass().getSimpleName(), name, "");
}
public static void w(Object context, String name) {
log(LogLevel.WARN, context.getClass().getSimpleName(), name, "");
}
public static void e(Object context, String name) {
log(LogLevel.ERROR, context.getClass().getSimpleName(), name, "");
}
}