我想在我的 android 中添加一个日志记录机制,我想在其中将消息记录到 sd 卡上的文件中。
由于我必须从不同的线程登录,并且我不希望这些线程被阻塞,所以我尝试在不同的线程上进行登录。
到目前为止,我已经建立了一个类似这样的类 -
public class TestLogger {
private static String LOG_FILE_NAME = "/logs.txt";
private static int LOG_FILE_SIZE_LIMIT = 100 * 1024;
private static FileHandler logHandler;
private static Logger logger;
private static ExecutorService executorService;
public synchronized static void init() {
String logFilePathName = Environment.getExternalStorageDirectory() + LOG_FILE_NAME;
try {
logHandler = new FileHandler(logFilePathName, LOG_FILE_SIZE_LIMIT, 1, true);
logHandler.setFormatter(new SimpleFormatter());
logger = Logger.getLogger("com.test.android");
logger.setLevel(Level.ALL);
logger.addHandler(logHandler);
executorService = Executors.newFixedThreadPool(1);
} catch (IOException e) {
e.printStackTrace();
}
}
private synchronized static void writeLog(String msg) {
if(logger == null)
return;
logger.log(Level.FINE, msg);
}
public static void logMessage(String msg) {
executorService.submit(new LogToFile(msg));
}
private static class LogToFile implements Runnable {
String msg;
public LogToFile(String msg) {
this.msg = msg;
}
@Override
public void run() {
TestLogger.writeLog(msg);
}
}
}
进入应用程序后,我调用TestLogger.init()
并从那里调用 `TestLogger.logMessage("log message"); 每当我必须将某些内容记录到文件中时。
这工作正常,但不是创建logs.txt
,我还看到创建了其他文件。像 logs.txt.1 和 logs.txt.2 以及它们的 .lck 文件。通过使用关键字synchronized
,我是否不能确保没有两个线程同时写入同一个文件?
我究竟做错了什么?