2014年7月29日火曜日

adb logcat、適度に不要なログをdiscardするフィルタスクリプト

Android開発で、logcatをターミナルで表示している時に、適度に不要なログをdiscardするフィルタスクリプトを作ってみました。

Androidで開発を少し経験してきて、結局logcatのログには不要なログなど無いという結論っぽいものが見えかけてきてはいます。特にバグを追いかけている時には。(ヽ´ω`)
でも、アプリの製作中、軽くログをチェックしたい時には、ある程度情報を絞りたいのも事実です。

僕の場合は、Eclipseのlogcatと、ターミナルでフィルタ表示させるlogcatを併用して、その時々で観る方を変えるようにしています。


スクリプトはRubyで作りました。
スクリプト名は logcut.rb です。ログカットとお呼びください。
# 使い方
# logcatのフォーマットは -v threadtime で表示した時を想定しているので注意。
# adb logcat -v threadtime | ruby logcut.rb "cocos2d-x debug info"

searchTag = nil        # サーチするタグ
searchPid = nil        # サーチしたタグのPID
if ARGV.size>0
    searchTag = ARGV.shift
end

$stdin.each_line do |line|
    if searchTag!=nil
        if line =~ /^\d+-\d+\s+\d+:\d+:\d+\.\d+\s+([0-9]+)\s+([0-9]+)\s+(.+):.+$/
            tag = $3
            if tag.include?(searchTag)
                pid = $1.to_i
                if searchPid!=pid
                    print "\n注意: サーチするPIDを変更します。(#{searchPid} -> #{pid})\n\n"
                    searchPid = pid
                end
                print line
            else
                # タグが違ってもPIDが同じなら表示する
                if searchPid!=nil
                    pid = $1.to_i
                    if searchPid==pid
                        print line
                    end
                end
            end
        end
    else
        print line
    end
end

使い方は、ターミナルから adb logcat コマンドに、パイプで繋いでやります。
なお、logcatのフォーマットは -v threadtime オプションを付けて表示した時を想定しているので、別のフォーマットで表示させたい場合は、おのおのスクリプトを変更して下さい。

logcut.rb には、検索するタグをパラメータに渡します。タグにスペースがある場合は、" で括って下さい。
例えば、cocos2d-x v3系の場合ですと、以下のようにしてやります。
$ adb logcat -v threadtime | ruby logcut.rb "cocos2d-x debug info"

logcut.rbの仕事は、ログの中に検索タグの文字列が含まれているかをチェックして、見つけたらこれを表示します。

ただこれだけだと grep コマンドと変わらなく単なるアホになってしまいますので、検索タグを見つけたら、そのログの PID を記憶しておき、検索タグ見つからなくても PID が同じならそのログも表示するようにしています。

これを使うとどうなるのか、見てもらった方が早いので、以下にとあるcocos2d-xプロジェクトの実行中のログを晒しておきます。
07-29 14:06:05.539  8698  8724 D cocos2d-x debug info: {
07-29 14:06:05.539  8698  8724 D cocos2d-x debug info:     cocos2d.x.version: cocos2d-x 3.2beta0
07-29 14:06:05.539  8698  8724 D cocos2d-x debug info:     cocos2d.x.compiled_with_gl_state_cache: true
07-29 14:06:05.539  8698  8724 D cocos2d-x debug info:     gl.supports_S3TC: true
07-29 14:06:05.539  8698  8724 D cocos2d-x debug info:     cocos2d.x.build_type: DEBUG
07-29 14:06:05.539  8698  8724 D cocos2d-x debug info:     gl.supports_vertex_array_object: false
07-29 14:06:05.539  8698  8724 D cocos2d-x debug info:     cocos2d.x.compiled_with_profiler: false
07-29 14:06:05.539  8698  8724 D cocos2d-x debug info:     gl.renderer: NVIDIA Tegra 3
07-29 14:06:05.539  8698  8724 D cocos2d-x debug info:     gl.vendor: NVIDIA Corporation
07-29 14:06:05.539  8698  8724 D cocos2d-x debug info:     gl.version: OpenGL ES 2.0 14.01003
07-29 14:06:05.539  8698  8724 D cocos2d-x debug info:     gl.supports_ATITC: false
07-29 14:06:05.539  8698  8724 D cocos2d-x debug info:     gl.supports_ETC1: true
07-29 14:06:05.539  8698  8724 D cocos2d-x debug info:     gl.max_texture_units: 16
07-29 14:06:05.539  8698  8724 D cocos2d-x debug info:     gl.supports_PVRTC: false
07-29 14:06:05.539  8698  8724 D cocos2d-x debug info:     gl.max_texture_size: 2048
07-29 14:06:05.539  8698  8724 D cocos2d-x debug info:     gl.supports_NPOT: true
07-29 14:06:05.539  8698  8724 D cocos2d-x debug info:     gl.supports_discard_framebuffer: false
07-29 14:06:05.539  8698  8724 D cocos2d-x debug info:     gl.supports_BGRA8888: false
07-29 14:06:05.539  8698  8724 D cocos2d-x debug info: }
07-29 14:06:05.539  8698  8724 D cocos2d-x debug info: 
07-29 14:06:05.589  8698  8724 D cocos2d-x debug info: create _backToForegroundlistener for GLProgramState
07-29 14:06:05.599  8698  8724 D main    : cocos_android_app_init
07-29 14:06:05.629  8698  8724 D cocos2d-x debug info: Resolution Size = (640.000000,368.000000)
07-29 14:06:05.629  8698  8724 D CCFileUtilsAndroid.cpp: relative path = resolution/hd/SampleTex.plist
07-29 14:06:05.639  8698  8724 D CCFileUtilsAndroid.cpp: relative path = resolution/hd/SampleTex.png
07-29 14:06:05.659  8698  8724 D CCFileUtilsAndroid.cpp: relative path = CloseNormal.png
07-29 14:06:05.659  8698  8724 D CCFileUtilsAndroid.cpp: relative path = CloseSelected.png
07-29 14:06:05.669  8698  8724 D cocos2d-x debug info: cocos2d: fullPathForFilename: No file found at Arial. Possible missing file.
07-29 14:06:05.669  8698  8724 D CCFileUtilsAndroid.cpp: relative path = HelloWorld.png

最初の cocos2d-x debug info タグを見つけた時に、PID(今回は 8698番)を記憶しておきます。それ以降は、cocos2d-x debug info タグが見つからないログでも、PIDが一致するならば表示します。上の例ですと、mainタグ、CCFileUtilsAndroid.cppタグがそうです。

このような仕様にしたのは、アプリが起動するまで PID (プロセスID) が分からないので苦肉の策なのですが、検索タグが違うだけでログをdiscardしてしまうと、思わぬ貴重な情報を見落としてしまう可能性があります。

使ってみるとなかなか便利です。

関連記事

0 件のコメント:

コメントを投稿

Related Posts Plugin for WordPress, Blogger...