Androidのログを閲覧するlogcatコマンドをアプリケーションから実行する方法を紹介します。
logcatコマンド
logcatコマンドのオプションを紹介します。
- オプション
オプション 説明 -s デフォルトのフィルターをsilentに設定します(フィルターに「*:s」と指定するのと同様) -f ≪ファイル名≫ ログをファイルに出力します -c ログをクリアします -d ログをダンプし、終了します -g ログのサイズを取得し、終了します -v ≪フォーマット≫ ログのプリントフォーマットを設定します(フォーマットは下表参照) -v フォーマット 例 brief W/tag ( 876): message process W( 876) message (tag) tag W/tag : message thread W( 876:0x37c) message raw message time 09-08 05:40:26.729 W/tag ( 876): message threadtime 09-08 05:40:26.729 876 892 W tag : message long [ 09-08 05:40:26.729 876:0x37c W/tag ] message
- フィルター
「≪タグ≫:≪プライオリティ≫」で指定します。
タグは完全一致、プライオリティは指定値以上のものを表示します。
タグを指定してもなぜかフィルターが機能しません。
「-s ≪タグ≫:*」のように、-sを付与すると機能します。
Androidアプリケーションでのlogcatコマンド実行
アプリケーションからlogcatコマンドを実行するサンプルです。
サンプルのソースコード
LogSampleActivity.java
- AndroidManifest.xmlにログ読み取りのパーミッションを追加
<uses-permission android:name="android.permission.READ_LOGS" />
- logcatコマンドの実行
- ログのクリア
try { Runtime.getRuntime().exec("logcat -c"); } catch(Exception e) { // 例外処理 }
- ログの取得
try { ArrayList<String> commandLine = new ArrayList<String>(); // コマンドの作成 commandLine.add( "logcat"); commandLine.add( "-d"); commandLine.add( "-v"); commandLine.add( "time"); commandLine.add( "-s"); commandLine.add( "tag:W"); Process process = Runtime.getRuntime().exec( commandLine.toArray( new String[commandLine.size()])); BufferedReader bufferedReader = new BufferedReader( new InputStreamReader(process.getInputStream()), 1024); String line; while ((line = bufferedReader.readLine()) != null) { log.append(line); log.append("\n"); } } catch ( IOException e) { // 例外処理 }
- ログのクリア
- 取得例
09-08 09:44:42.267 W/tag ( 754): message1 09-08 09:44:42.709 W/tag ( 754): message2 09-08 09:44:43.187 W/tag ( 754): message3 09-08 09:44:45.295 E/tag ( 754): message8
logcatコマンドを利用したログ監視
ログをリアルタイムで監視するサンプルです。
サンプルのソースコード
LogMonitorSampleActivity.java
- ログを書き続けるスレッド
private class LogThread extends Thread{ private int cnt = 1; @Override public void run() { while( true){ Log.w( "tag", "message" + cnt++); } } }
- ログの監視(コマンドから-dオプションを外す)
try { ArrayList<String> commandLine = new ArrayList<String>(); // コマンドの作成 commandLine.add( "logcat"); commandLine.add( "-v"); commandLine.add( "time"); commandLine.add( "-s"); commandLine.add( "tag:W"); Process process = Runtime.getRuntime().exec( commandLine.toArray( new String[commandLine.size()])); BufferedReader bufferedReader = new BufferedReader( new InputStreamReader( process.getInputStream()), 1024); String line; while ((line = bufferedReader.readLine()) != null) { Log.i("LogMonitor", line); } } catch ( IOException e) { // 例外処理 }
- 無限ループに陥らないように修正しておきました。 by haseguru https://twitter.com/#!/haseguru -- 2012-05-24 (木) 01:05:33
- 参考になりました!whileでlineを進めてあげないと無限ループに陥ります。 -- 2010-05-28 (金) 00:31:49