Logcat with Eclipse with ADT for Androidを使用すると、他の多くのアプリケーションからもメッセージが届くことがわかりました。これをフィルタリングして、自分のアプリケーションからのメッセージのみを表示する方法はありますか?
35 に答える
LinuxとOSX
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
パッケージ名は一意であることが保証されているため、パッケージ名としてタグを使用してLog
関数を使用し、パッケージ名でフィルタリングできます。
注:ビルドツール21.0.3以降、TAGSは23文字以下に制限されているため、これは機能しなくなります。
Log.<log level>("<your package name>", "message");
adb -d logcat <your package name>:<log level> *:S
-d
は実際のデバイスを-e
示し、はエミュレータを示します。複数のエミュレーターが実行されている場合は、-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に転送されるかどうかはわかりません。
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をご覧ください。
フィルタを追加
名前を指定する
フィルタを選択してください。
これは、USBデバッグで機能します。
解決策は、シェルを介してデバイス自体のlogcatを直接使用することです。
デバイスを接続して使用します。
adb shell
シェルのセットアップ後にlogcatを使用します。
logcat | grep com.yourapp.packagename
私にとってこれはmacで動作しTerminal
ますあなたが持っているフォルダに行きadb
、ターミナルで以下のコマンドを入力します
./adb logcat MyTAG:V AndroidRuntime:E *:S
MyTAG
ここでは、とのすべてのログをフィルタリングしますAndroidRuntime
5月17日更新
数年経ちましたが、状況は変わりました。また、Eclipseは正式にサポートされなくなりました。したがって、ここにさらに2つの最新のアプローチがあります。
1. Android Studio
ツールボックスでは、
Android monitor
logcatをごとにフィルタリングできますdebuggable process
。通常、アプリケーションを開発するとき、それはデバッグ可能なプロセスです。時々私はこれに問題があり、次のことをします:
Tools
->Android
->Enable ADB Integration
。
すでに有効になっている場合は、オフに切り替えてからオンに戻しますモバイルデバイスのプラグを抜き、再度差し込みます。
正規表現とデバッグレベルでフィルタリングするオプションもあります
2.logcat -color
adb logcat
これは、ターミナルベースのソリューションを使用する場合に加えて、優れたPythonラッパーです。それの良いところは、複数の構成を保存して、それらを単に再利用できることです。によるフィルタリングtags
は非常に信頼性があります。package
1つ以上のアプリのログのみを表示するようにフィルタリングすることもできますがlogcat-color
、アプリを起動する直前に開始します。
古い答え:
以前の回答にはコメントできないようですので、新しい回答を投稿します。これはTomMulcahyadb 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番目のコマンドを再実行する必要があります。
これはgitbashで私のために働いています:
$ pid=$(adb shell ps | grep <package name> | cut -c11-15) ; adb logcat | grep $pid
Ubuntu: adb logcat -b all -v color --pid = `adb shell pidof-scom.packagename`アプリの色と継続的なログ
これを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
Android Studioを使用している場合は、logcatを受信するプロセスを選択できます。これがスクリーンショットです。
logcatをパッケージ名でフィルタリングするためのシェルスクリプトを作成しました。これは、使用するよりも信頼性が高いと思います。
ps | grep com.example.package | cut -c10-15
/ proc / $ pid / cmdlineを使用して実際のpidを見つけ、logcatでgrepを実行します
使用してください-s
!
独自のタグを使用する必要があります。http: //developer.android.com/reference/android/util/Log.htmlをご覧ください。
好き。
Log.d("AlexeysActivity","what you want to log");
そして、ログを読みたいときは>
adb logcat -s AlexeysActivity
これにより、同じタグを使用しないものがすべて除外されます。
Windowsコマンドプロンプトの使用:adb logcat -d | findstr <package>
。
*これはjj_によって最初に言及されましたが、コメントでそれを見つけるのに何年もかかりました...
ADT v15 for Eclipseでは、アプリケーション名(実際にはandroidmanifest.xmlのパッケージ値)を指定できます。
アプリでフィルタリングできるのは気に入っていますが、新しいlogcatには自動スクロールのバグがあります。少し上にスクロールして前のログを確認すると、数秒で自動的に一番下にスクロールして戻ります。ログを1/2ほど上にスクロールすると、ログが一番下に戻るのを防ぐことができますが、それは役に立たないことがよくあります。
編集:コマンドラインからアプリフィルターを指定しようとしましたが、うまくいきませんでした。誰かがこれを理解したり、自動スクロールを停止する方法を見つけたら、私に知らせてください。
バリアントとして、JakeWhartonによるサードパーティのスクリプトPIDCatを使用できます。このスクリプトには2つの大きな利点があります。
- 特定のアプリケーションパッケージからのプロセスのログエントリを表示します
- カラーlogcat
ドキュメントから:
アプリケーション開発中は、アプリからのログメッセージのみを表示したいことがよくあります。残念ながら、プロセスIDは電話にデプロイするたびに変更されるため、正しいことをgrepするのは困難になります。
このスクリプトは、アプリケーションパッケージでフィルタリングすることにより、この問題を解決します。
Windows 10では、Ionicを使用して、「findstr」をすべてのアプリメッセージによって生成された「INFO:CONSOLE」と組み合わせることでうまくいきました。したがって、コマンドラインでの私のコマンドは次のとおりです。
adb logcat | findstr INFO:CONSOLE
logcatにアクセスするには、最初にADBコマンドラインツールをインストールする必要があります。ADBコマンドラインツールはAndroidStudioプラットフォームツールの一部であり、ここからダウンロードできます。この後、adbツールのパス/環境変数を設定する必要があります。これで、MacBookを使用している場合は、Eclipseターミナル/IntelliJターミナルまたはMacターミナルからlogcatにアクセスできます。
adb logcat
:logcat全体を取得します。
adb shell pidof 'com.example.debug'
:アプリのプロセスIDを取得します。
adb logcat pid=<pid>
:アプリに固有のlogcatを取得します。
adb logcat pid=<pid>|grep 'sometext'
:テキストに基づいてlogcatをフィルタリングします。
logcatのフィルタリングの詳細については、こちらをお読みください。
アプリに関するシステムメッセージのみを表示する方法があるかどうかはわかりませんが、文字列に基づいてフィルタリングすることはできます。プログラム内でログを作成している場合は、特定の一意のキーワードを含めるだけで、その単語に基づいてフィルタリングできます。
試してください:[ウィンドウ]->[設定]->[Android]->[LogCat]。フィールド「Showlogcatviewif...」の値を「VERBOSE」に変更します。それは私を助けました。
Eclipseを使用している場合は、下のlogCatウィンドウで緑色の+記号を押し、 [アプリケーション名別]ボックスにパッケージ名(com.example.yourappname)を入力します。また、[フィルター名]ボックスでわかりやすい名前を選択し、[OK]をクリックします。logCatの左側のペインから追加したフィルターを選択すると、アプリケーションに関連するメッセージのみが表示されます。
ログに名前を付けます。私は私のものを「ワワ」と呼んだ。
Android Studioで、[Android]->[フィルター構成の編集]に移動します
次に、ログに付けた名前を入力します。私の場合、それは「ワワ」と呼ばれています。実行できるフィルターの種類の例を次に示します。System.out、System.err、Logs、またはパッケージ名でフィルタリングできます。
これはおそらく最も簡単な解決策です。
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`"
私には別のアプローチがあります。ローカルデバイスのシェルへのアクセスを試すことができます。
adb shell
その後、
logcat | grep com.package.name
これは、そのパッケージを含むすべてを印刷します。
または、試すことができますflutter logs --verbose
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"
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%
Windowsの場合、PowerShellスクリプトを使用して、アプリのメッセージのみを表示できます: https ://github.com/AlShevelev/power_shell_logcat
以下のコマンドを使用して、アプリケーションパッケージの詳細ログを取得できます
adb logcat com.example.myapp:V *:S
また、アプリをロールアウトしていて、リリースされたアプリからエラーログを取得する場合は、以下のコマンドを使用できます。
adb logcat AndroidRuntime:E *:S
私は通常、ログメッセージに何かを追加して区別します。または、たとえばUnityアプリでは、一致する文字列として「Unity」を使用できます。
Mac用 :
adb logcat | grep "MyUniqueString"
Windowsの場合(PowerShell):
adb logcat | Select-String "MyUniqueString"
保存されたフィルターバーに新しいフィルターを追加せずに、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>]
これは明らかに、開発者デバイスの外部からLogcatを使用することを目的とした質問ですが、デバイスにLogcat出力を(プログラムで)表示する場合は、次のようにする必要があります。
Runtime.getRuntime().exec("logcat " + android.os.Process.myPid() + " *:D");
最後に、*:D
デバッグログレベルより下のすべてのメッセージを除外しますが、それを省略できます。
たとえば、出力をTextViewに送信するには、たとえばここを参照してください。
シェル内にいるときに正確なパッケージ名のログを取得する別の方法:
logcat --pid $(ps -ef | grep -E "com.example.app\$" | awk '{print $2}')
Linuxでは、これは私のために働いた:
adb logcat | grep `adb shell ps | grep your.package | awk '{print $2}'`