0

我想在我的 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,我是否不能确保没有两个线程同时写入同一个文件?

我究竟做错了什么?

4

2 回答 2

2

我现在正在使用阻塞队列来完成这项工作。现在效果很好:)

于 2012-01-30T06:16:20.793 回答
0

synchronized使用变量而不是文件。您可以使用该synchronized块来填充字符串构建器,例如,并在最后一步写入文件。

于 2012-01-24T12:40:38.967 回答