Android用ADTを備えたEclipseでLogcatを使用すると、他の多くのアプリケーションからもメッセージが表示されることがわかりました。これをフィルタリングして、自分のアプリケーションからのメッセージのみを表示する方法はありますか?
Android用ADTを備えたEclipseでLogcatを使用すると、他の多くのアプリケーションからもメッセージが表示されることがわかりました。これをフィルタリングして、自分のアプリケーションからのメッセージのみを表示する方法はありますか?
回答:
パッケージ名は一意であることが保証されているため、タグをパッケージ名として関数を使用しLog
て、パッケージ名でフィルタリングできます。
注:TAGSが23文字以下に制限されているため、ビルドツール21.0.3以降は機能しません。
Log.<log level>("<your package name>", "message");
adb -d logcat <your package name>:<log level> *:S
-d
実際のデバイスを-e
示し、エミュレータを示します。ある場合は、使用することができます実行している以上1つのエミュレータ-s emulator-<emulator number>
(例えば、-s emulator-5558
)
例: adb -d logcat com.example.example:I *:S
またはSystem.out.print
、ログへのメッセージ送信に使用adb -d logcat System.out:I *:S
している場合は、System.outへの呼び出しのみを表示するために使用できます。
すべてのログレベルと詳細については、https://developer.android.com/studio/command-line/logcat.htmlをご覧ください。
http://developer.android.com/reference/android/util/Log.html
編集:私は少し銃をジャンプし、ちょうどあなたがEclipseでlogcatについて尋ねていることに気付いたように見えます。上記で投稿したのは、コマンドラインからadbを介してlogcatを使用するためのものです。同じフィルターがEclipseに転送されるかどうかはわかりません。
logcat <your package name>:<log level>
回答を使用することにより、パッケージ名を有効なフィルターとして使用することが可能であることを示唆しています。私は実際にので、私は単に「のような何かに最初の行を変更することをお勧めします、と言っているもの理解するために二回答を読み取るために必要あなたがタグとしても使用されている場合、あなたのパッケージ名が可能」logcat <tag>:<log level>
<tag>
android.util.Log
ps / grep / cutを使用してPIDを取得してから、そのPIDを持つlogcatエントリのgrepを使用します。これが私が使うコマンドです:
adb logcat | grep -F "`adb shell ps | grep com.asanayoga.asanarebel | tr -s [:space:] ' ' | cut -d' ' -f2`"
(同じ数を含む無関係なログ行の理論的な問題を回避するために正規表現をさらに改善することができますが、それは私にとって決して問題ではありませんでした)
これは、複数のプロセスを照合するときにも機能します。
Windowsでは次のことができます。
adb logcat | findstr com.example.package
pid=$(adb shell ps | grep "package-name" | cut -c10-15) && adb logcat | grep $pid
adb logcat | grep `adb shell ps | grep org.videolan.vlc | awk '{print $2")"}'`
adb logcat | findstr com.example.package
adb logcat | grep `adb shell ps | grep com.example.package | tr -s [:space:] ' ' | cut -d' ' -f2`
Android 7.0以降、logcatには--pidフィルターオプションがあり、pidofコマンドを使用できます。com.example.appをパッケージ名に置き換えます。
(ubuntuターミナル/ Android 7.0以降)
adb logcat --pid=`adb shell pidof -s com.example.app`
または
adb logcat --pid=$(adb shell pidof -s com.example.app)
pidofコマンドに関する詳細情報:https :
//stackoverflow.com/a/15622698/7651532
grep
およびfindstr
オプションを試してみましたが、それらは多くのメッセージを除外するいくつかの値を持つログのみをフィルタリングしています。あなたの答えは本当のことです。別のライブラリからのログメッセージを除外せずに、アプリに関するすべてのログを表示してください。これは、Android Studioの現在の「選択されたもののみ表示」フィルターのようなものです。ありがとう!
フィルターを追加
名前を指定する
フィルターを選択します。
私にとってこれはmacで動作しTerminal
ますadb
ターミナルに以下のコマンドを入力したフォルダに移動します
./adb logcat MyTAG:V AndroidRuntime:E *:S
ここでは、すべてのログをフィルタしますMyTAG
と、AndroidRuntime
Log.d("MyTAG", "i am hero"); Log.d("AndroidRunTime", "i am zero");
2)Androidへのログインをデバッグする$ adb -s RKSCWSOV5SAIEUSC shell;
3)$ logcat MyTAG:V AndroidRuntime:E *:S
4)これで、MyTAGの詳細とAndroidRuntimeのエラーが表示されます
数年経ちましたが、状況は変わりました。また、Eclipseは公式にサポートされなくなりました。だから、ここにさらに2つの最新のアプローチがあります:
でAndroid monitor
、ツールボックス、あなたがあたりlogcatをフィルタリングすることができますdebuggable process
。通常、アプリケーションを開発する場合、それはデバッグ可能なプロセスです。時々私はこれで問題を抱えています、そして以下を行います:
Tools
-> Android
-> Enable ADB Integration
。
すでに有効になっている場合は、オフに切り替えてからオンに戻します
モバイルデバイスを取り外し、再度差し込みます。
正規表現とデバッグレベルでフィルタリングするオプションもあります
これは、adb logcat
ターミナルベースのソリューションを使用する場合に最適なpythonラッパーです。それの良いところは、複数の構成を保存して単純に再利用できることです。フィルタリングtags
は非常に信頼できます。package
1つ以上のアプリのログのみを表示するようにフィルタリングすることもできlogcat-color
ますが、アプリを起動する直前に開始します。
以前の回答にはコメントできないようですので、新しいものを投稿します。これはTom Mulcahyの回答に対するコメントであり、adb shell ps
PID列は可変であるため、ほとんどのデバイスで機能するようにコマンドを変更する方法を示しています。
注:以下のコマンドは、多くのデバイスを接続した場合に機能します。だからdevice id
必要です。それ以外の場合は、角かっこ '['、 ']'を省略できます。
1. pidの列を見つけるには、次のように入力します。
adb [-s DEVICE_ID] shell ps | head -n 1
ここで、PIDの列番号を記憶します。番号はから始まり1
ます。
2.次に、次のように入力します。
adb [-s DEVICE_ID] logcat | grep $(adb [-s DEVICE_ID] shell ps \
| grep "com.example" | awk -F" " ' {print $PUT_COLUMN_HERE}')
単にあなたが記憶したカラムを入れてくださいPUT_COLUMN_HERE
、例えば$5
アプリケーションはOSから新しいPIDを取得するため、アプリケーションを再実行するたびに、2番目のコマンドを再実行する必要があります。
これをapplog.shに入れます
#!/bin/sh
PACKAGE=$1
APPPID=`adb -d shell ps | grep "${PACKAGE}" | cut -c10-15 | sed -e 's/ //g'`
adb -d logcat -v long \
| tr -d '\r' | sed -e '/^\[.*\]/ {N; s/\n/ /}' | grep -v '^$' \
| grep " ${APPPID}:"
次に:
applog.sh com.example.my.package
log.d("TAG", "multine\nlog")
を次に示します(たとえば、行った場合):adb -d logcat -v long | sed -Ene '/^\[.*'" (${APPID}):"'.*\]/ { N; s/\n/ /; p; :a;' -e 'n; p; s/^.+$/foo/; t a;' -e ' }' | grep -v '^$'
-を省略tr
しました。これは、Windowsシステムで必要であると想定しAPPID
、括弧で囲んで複数のpid(で区切られている|
) 。
Android Studioを使用している場合は、logcatを受信するプロセスを選択できます。こちらがスクリーンショットです。
Log cat has a new option (on by default) which creates an application filter automatically such that only the launched application's output is shown
パッケージ名でlogcatをフィルタリングするためのシェルスクリプトを作成しました。これは、
ps | grep com.example.package | cut -c10-15
/ proc / $ pid / cmdlineを使用して実際のpidを見つけ、logcatでgrepを実行します
Ubuntu: adb logcat -b all -v color --pid = `adb shell pidof -s com.packagename` with color and continuous log of app
adb shell pidof ...
私は少しは私のために仕事をしませんでしたadb shell
デバイスに編と走ったtop
が私のアプリのためのPIDをコピーして、あなたのコマンドでそれを置き換える
pgrep
pidofの代わりに試す
ADT v15 for Eclipseでは、アプリケーション名(実際にはandroidmanifest.xmlのパッケージ値)を指定できます。
アプリでフィルタリングできるのは気に入っていますが、新しいlogcatには自動スクロールのバグがあります。前のログを確認するために少し上にスクロールすると、数秒で自動的に一番下までスクロールして戻ります。ログを半分上にスクロールすると、ログが一番下に戻らないように見えますが、多くの場合それは役に立ちません。
編集:コマンドラインからアプリフィルターを指定しようとしましたが、うまくいきませんでした。誰かがこれを見つけた場合、または自動スクロールを停止する方法を教えてください。
バリエーションとして、Jake WhartonによるサードパーティのスクリプトPID Catを使用できます。このスクリプトには2つの主要な利点があります。
ドキュメントから:
アプリケーション開発中に、アプリからのログメッセージのみを表示することがよくあります。残念ながら、電話にデプロイするたびにプロセスIDが変更されるため、正しいものをgrepするのは困難になります。
このスクリプトは、アプリケーションパッケージでフィルタリングすることにより、この問題を解決します。
これはおそらく最も簡単な解決策です。
Tom Mulcahyのソリューションに加えて、以下のようにさらに簡略化できます。
alias logcat="adb logcat | grep `adb shell ps | egrep '\bcom.your.package.name\b' | cut -c10-15`"
通常のエイリアスと同じように簡単に使用できます。シェルにコマンドを入力するだけです:
logcat
エイリアス設定はそれを便利にします。また、正規表現は、メインプロセスのみに関心があると想定して、マルチプロセスアプリに対して堅牢にします。
cozの各プロセスには、必要に応じてさらにエイリアスを設定できます。またはhegazyのソリューションを使用します。:)
さらに、ロギングレベルを設定する場合は、
alias logcat-w="adb logcat *:W | grep `adb shell ps | egrep '\bcom.your.package.name\b' | cut -c10-15`"
Tom Mulcahyの回答を使用しようとしましたが、残念ながら、複数のプロセスを持つアプリケーションでは機能しなかったため、ニーズに合わせて編集しました。
#!/bin/bash
if [ "$#" -ne 1 ]; then echo "Illegal number of parameters"; exit 1; fi
echo "Lof for package name: $1"
PROCESSES=`adb shell ps | grep "$1" | cut -c10-15`
NUM_OF_PROCESSES=`echo "$PROCESSES" | wc -l`
if [ $NUM_OF_PROCESSES -eq 0 ]; then echo "The application is not running!"; exit 1; fi
COUNTER=1
for process in $PROCESSES; do
if [ $COUNTER -eq 1 ]; then GREP_TEXT="("; fi
GREP_TEXT+=$process
if [ $COUNTER -eq $NUM_OF_PROCESSES ]; then GREP_TEXT+=")"; else GREP_TEXT+="|"; fi
let COUNTER=COUNTER+1
if [ $COUNTER -gt $NUM_OF_PROCESSES ]; then break; fi
done
adb logcat | grep -E "$GREP_TEXT"
使用してください-s
!
あなたはあなた自身のタグを使うべきです、見てください:http : //developer.android.com/reference/android/util/Log.html
お気に入り。
Log.d("AlexeysActivity","what you want to log");
そして、ログを読みたいときは>
adb logcat -s AlexeysActivity
これにより、同じタグを使用しないものはすべて除外されます。
Tom Mulcahyの回答に加えて、WindowsコンソールでPIDでフィルタリングする場合は、次のような小さなバッチファイルを作成できます。
@ECHO OFF
:: find the process id of our app (2nd token)
FOR /F "tokens=1-2" %%A IN ('adb shell ps ^| findstr com.example.my.package') DO SET PID=%%B
:: run logcat and filter the output by PID
adb logcat | findstr %PID%
保存されたフィルターバーに新しいフィルターを追加せずに、tag:nameofthetagまたはapp:nameoftheappと入力してフィルター処理できるようになりました
intelliJ(おそらくeclipseでも)では、logcatの出力をテキストwebviewでフィルタリングできるので、基本的に、phonegapが生成しているすべてのものを出力します。
applog.sh
複数のプロセスを持つ複数のデバイスとアプリケーションをサポートするGavrielのさらに別のバリアント:
#!/bin/sh
PKG=$1
shift
APPIDS=`adb $@ shell ps | awk -v PKG="$PKG" '
(NR == 1){appcolumn=2; for (i=1; i<=NF; i++) if ($i=="PID") {appcolumn=i}}
index($0,PKG){print $(appcolumn)}' | paste -d \| -s`
echo "PID's: $APPIDS"
adb $@ logcat -v color | awk "(\$3 ~ /$APPIDS/){print \$0}"
使用法: applog.sh com.example.my.package [-s <specific device>]