在Android中,可以使用Logcat来输出日志信息。然而,如果想将日志写入文件,可以使用第三方库来实现。下面是使用Timber
库将日志写入文件的示例代码:
build.gradle
文件中添加以下依赖项:implementation 'com.jakewharton.timber:timber:4.7.1'
implementation 'com.squareup.okio:okio:2.10.0'
onCreate()
方法中进行初始化:import android.app.Application;
import timber.log.Timber;
public class MyApp extends Application {
@Override
public void onCreate() {
super.onCreate();
// 初始化Timber
if (BuildConfig.DEBUG) {
Timber.plant(new Timber.DebugTree());
} else {
Timber.plant(new FileLoggingTree(getApplicationContext()));
}
}
}
FileLoggingTree
类,用于将日志写入文件:import android.content.Context;
import android.os.Environment;
import android.util.Log;
import org.jetbrains.annotations.NotNull;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import timber.log.Timber;
public class FileLoggingTree extends Timber.DebugTree {
private static final String LOG_TAG = "FileLoggingTree";
private static final String LOG_FILE_NAME = "log.txt";
private static final String LOG_FOLDER_NAME = "MyAppLogs";
private final Context context;
public FileLoggingTree(Context context) {
this.context = context;
}
@Override
protected void log(int priority, String tag, @NotNull String message, Throwable t) {
if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
// External storage is not available
return;
}
File logFile = getLogFile();
try {
BufferedWriter writer = new BufferedWriter(new FileWriter(logFile, true));
writer.write(getFormattedLogMessage(priority, tag, message));
writer.newLine();
writer.flush();
writer.close();
} catch (IOException e) {
Log.e(LOG_TAG, "Error writing log message to file", e);
}
}
private File getLogFile() {
File logFolder = new File(context.getExternalFilesDir(null), LOG_FOLDER_NAME);
if (!logFolder.exists()) {
logFolder.mkdirs();
}
return new File(logFolder, LOG_FILE_NAME);
}
private String getFormattedLogMessage(int priority, String tag, String message) {
SimpleDateFormat dateFormat = new SimpleDateFormat("MM-dd HH:mm:ss.SSS", Locale.getDefault());
String timestamp = dateFormat.format(new Date());
return String.format(Locale.getDefault(), "%s %s/%s: %s", timestamp, getPriorityString(priority), tag, message);
}
private String getPriorityString(int priority) {
switch (priority) {
case Log.VERBOSE:
return "V";
case Log.DEBUG:
return "D";
case Log.INFO:
return "I";
case Log.WARN:
return "W";
case Log.ERROR:
return "E";
case Log.ASSERT:
return "A";
default:
return "U";
}
}
}
AndroidManifest.xml
文件中将自定义的Application类设置为应用的默认Application:
...
现在,当你使用Timber
的d()
, e()
, i()
, v()
, w()
或wtf()
方法输出日志时,日志信息将被写入到外部存储设备中的MyAppLogs/log.txt
文件中。请注意,为了使日志输出到文件中,需要授予应用的存储权限。