2012-01-24 2 views
0

私はアンドロイドにログを記録したいので、メッセージをsdカードのファイルに記録したいと思っています。java.util.loggingを使ってアンドロイドのファイルにログする

私は別のスレッドからログを取らなければならなかったので、これらのスレッドをブロックしたくないので、別のスレッドでログを記録しようとしました。

私はこれまでのところ、このようなクラスのものを構築しました -

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.logMessage(「ログメッセージ」)を呼び出すにTestLogger.init()、そこからを呼び出します。いつでもファイルに何かを記録する必要があります。

これは正常に動作しますが、logs.txtを作成する代わりに、他のファイルも作成されています。 logs.txt.1とlogs.txt.2のように.lckファイルがあります。キーワード​​を使用することで、2つのスレッドが同時に同じファイルに書き込まないようにしたことはありませんか?

私は間違っていますか?

答えて

2

現在、ジョブを実行するためにブロックキューを使用しています。それは今素晴らしいです:)

+1

こんにちは、私は同じことをしたい実装したい..あなたの作業コードを投稿してくださいできますか? – mudit

+0

はい、実装を貼り付けてください – Raulp

0

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

関連する問題