0

メッセージをSDカードのファイルに記録するロギングメカニズムをAndroidに追加したいと考えています。

別のスレッドからログを記録する必要があり、これらのスレッドをブロックしたくないため、別のスレッドでログを記録しようとしました。

私はこれまでにこのようなクラスを構築しました -

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を指定することで、2 つのスレッドが同時に同じファイルに書き込みを行わないようにできたのではないでしょうか?

私は何を間違っていますか?

4

2 に答える 2

0

synchronizedファイルではなく変数で動作します。ブロックを使用してsynchronized、たとえば文字列ビルダーを埋め、最終ステップでファイルに書き込むことができます。

于 2012-01-24T12:40:38.967 に答える