LogCatをフィルタリングして、Androidのアプリケーションからのメッセージのみを取得しますか?


340

Android用ADTを備えたEclipseでLogcatを使用すると、他の多くのアプリケーションからもメッセージが表示されることがわかりました。これをフィルタリングして、自分のアプリケーションからのメッセージのみを表示する方法はありますか?


1
すべての回答は、デバッグ中のアプリからのメッセージをフィルタリングすることを示唆しています。これらのフィルターをオンにしても、他のアプリからのLogcatスパムは、それがどれほど大きくてもすぐにログバッファーを一杯にします。これらのメッセージをまったく収集しないように、または定期的に削除し続けるようにEclipseに指示する方法はありますか?
価格は

回答:


267

パッケージ名は一意であることが保証されているため、タグをパッケージ名として関数を使用し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に転送されるかどうかはわかりません。


10
質問がEclipseに関するものであることは知っていますが、コマンドラインが大好きで、logcatにも常に使用しています。jsharkey.org/blog/2009/04/22/…のような出力を色付けするためのいくつかのツールも使用します
Francisco

1
エミュレーターでのテスト:adb -e logcat com.example.example:I *:S、adb -d logcat System.out:I *:Sを実行すると、スタックしました。
CoDe

1
@Shubhスタックしたとはどういう意味ですか?私はこれをほぼ1年前に投稿したので、Logcatの何かがそれ以降変更された可能性があります。
シャネット

58
このメソッドは、アプリではなくタグでフィルタリングします。トムの方法はアプリでフィルタリング
Jonas Alves 2012

17
logcat <your package name>:<log level>回答を使用することにより、パッケージ名を有効なフィルターとして使用することが可能であることを示唆しています。私は実際にので、私は単に「のような何かに最初の行を変更することをお勧めします、と言っているもの理解するために二回答を読み取るために必要あなたがタグとしても使用されている場合、あなたのパッケージ名が可能」logcat <tag>:<log level><tag>android.util.Log
フロー

367

LinuxおよびOS X

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

2
@BTRNaidu:Cygwinをインストールするか、git-bash(Windowsの場合はbash)を使用できます
Phillip

1
pid=$(adb shell ps | grep "package-name" | cut -c10-15) && adb logcat | grep $pid
VishalKale 14

1
somtimes gcは、メモリを解放するときにプロセスのpid番号と同じ番号を出力します。ここに別のバージョンがありますadb logcat | grep `adb shell ps | grep org.videolan.vlc | awk '{print $2")"}'`
alijandro 2015年

14
Windowsでは、あなたが行うことができます:adb logcat | findstr com.example.package
jj_

8
答えを少し変更しました。私はお勧めします:adb logcat | grep `adb shell ps | grep com.example.package | tr -s [:space:] ' ' | cut -d' ' -f2`
hiepnd

59

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


2
私はすべてのgrepおよびfindstrオプションを試してみましたが、それらは多くのメッセージを除外するいくつかの値を持つログのみをフィルタリングしています。あなたの答えは本当のことです。別のライブラリからのログメッセージを除外せずに、アプリに関するすべてのログを表示してください。これは、Android Studioの現在の「選択されたもののみ表示」フィルターのようなものです。ありがとう!
エクイマン2018年

これらの2つのコマンドは、プロセス「com.example.app」が実行されている限り機能します。ただし、プロセスが実行されていない場合は、エラーメッセージが表示されます。驚きを避けるために、ただの余談です。
jonathanzh

53

フィルターを追加

フィルターを追加

名前を指定する

ここに画像の説明を入力してください

フィルターを選択します。

ここに画像の説明を入力してください


3
ユーザーが正確であることが期待されるため、開発ツールを設計するときは正確であることが非常に重要です。これはパッケージ名であり、アプリケーション名ではありません。> :(
Henrik Erlandsson 2013年

19

私にとってこれはmacで動作しTerminal
ますadbターミナルに以下のコマンドを入力したフォルダに移動します

./adb logcat MyTAG:V AndroidRuntime:E *:S

ここでは、すべてのログをフィルタしますMyTAGと、AndroidRuntime


2
1)Javaコード: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のエラーが表示されます

1
これがMacOSで私に有効な唯一の答えです。よくやった。
om-ha

1
@ om-haありがとう、Studioを以前から使用していて、まだ問題があることを知りませんでした
Inder Kumar Rathore

1
実際、私はAndroid Studioを使用していません。Flutter、Android SDK、Gradleを使用しています。エディターとして、VS Code。これは、私のAndroidフォンで何が起こっているかを知るための優れた方法です
om-ha

13

5月17日更新

数年経ちましたが、状況は変わりました。また、Eclipseは公式にサポートされなくなりました。だから、ここにさらに2つの最新のアプローチがあります:

1. Android Studio

ここに画像の説明を入力してくださいAndroid monitor、ツールボックス、あなたがあたりlogcatをフィルタリングすることができますdebuggable process。通常、アプリケーションを開発する場合、それはデバッグ可能なプロセスです。時々私はこれで問題を抱えています、そして以下を行います:

  1. Tools-> Android-> Enable ADB Integration
    すでに有効になっている場合は、オフに切り替えてからオンに戻します

  2. モバイルデバイスを取り外し、再度差し込みます。

正規表現とデバッグレベルでフィルタリングするオプションもあります

2. logcat-color

これは、adb logcatターミナルベースのソリューションを使用する場合に最適なpythonラッパーです。それの良いところは、複数の構成を保存して単純に再利用できることです。フィルタリングtagsは非常に信頼できます。package1つ以上のアプリのログのみを表示するようにフィルタリングすることもできlogcat-colorますが、アプリを起動する直前に開始します。

古い答え:

以前の回答にはコメントできないようですので、新しいものを投稿します。これはTom Mulcahyの回答に対するコメントであり、adb shell psPID列は可変であるため、ほとんどのデバイスで機能するようにコマンドを変更する方法を示しています。

注:以下のコマンドは、多くのデバイスを接続した場合に機能します。だから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番目のコマンドを再実行する必要があります。


他のアプリではなく、アプリのログを取得するために行う必要があるこれらすべてのことを確認してください。さらに、他の人が他の人のログを見ることができるのは本当にばかげています。Googleがそれについてできることは何もないと私に言っていますか?私のログが他の人に見られないことを確認し、私のlogcatをきれいに保ちますか?
TatiOverflow

10

これは私のためにgit bashで働いています:

$ pid=$(adb shell ps | grep <package name> | cut -c11-15) ; adb logcat | grep $pid

Androidコードでそれを使用することは可能ですか?
niko1312

9

これを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(で区切られている|) 。
Logan Pickup

9

これは私にとってUSBデバッグで機能します:

  1. デバイスを接続して使用:

    adb shell

  2. 接続時にlogcatを使用します。

    logcat | grep com.yourapp.packagename


7

Android Studioを使用している場合は、logcatを受信するプロセスを選択できます。こちらがスクリーンショットです。

ここに画像の説明を入力してください


1
android studio ver 0.4.5以降、実行中のアプリからのみメッセージが表示されます。 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
dmSherazi 2014


7

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をコピーして、あなたのコマンドでそれを置き換える
edzillion

pgreppidofの代わりに試す
Lennoard Silva

これは私にとってOSXで機能し、-v colorの追加ポイント
火星

6

ADT v15 for Eclipseでは、アプリケーション名(実際にはandroidmanifest.xmlのパッケージ値)を指定できます。

アプリでフィルタリングできるのは気に入っていますが、新しいlogcatには自動スクロールのバグがあります。前のログを確認するために少し上にスクロールすると、数秒で自動的に一番下までスクロールして戻ります。ログを半分上にスクロールすると、ログが一番下に戻らないように見えますが、多くの場合それは役に立ちません。

編集:コマンドラインからアプリフィルターを指定しようとしましたが、うまくいきませんでした。誰かがこれを見つけた場合、または自動スクロールを停止する方法を教えてください。


6

Windowsコマンドプロンプトを使用:adb logcat -d | findstr <package>

*これはjj_によって最初に言及されましたが、コメントで見つけるのに年齢がかかりました...


4

バリエーションとして、Jake WhartonによるサードパーティのスクリプトPID Catを使用できます。このスクリプトには2つの主要な利点があります。

  • 特定のアプリケーションパッケージのプロセスのログエントリを表示します
  • 色猫

ドキュメントから:

アプリケーション開発中に、アプリからのログメッセージのみを表示することがよくあります。残念ながら、電話にデプロイするたびにプロセスIDが変更されるため、正しいものをgrepするのは困難になります。

このスクリプトは、アプリケーションパッケージでフィルタリングすることにより、この問題を解決します。

出力は次のようになります ここに画像の説明を入力してください


2

アプリに関するシステムメッセージのみを表示する方法があるかどうかはわかりませんが、文字列に基づいてフィルタリングできます。プログラム内でログを作成している場合は、特定の一意のキーワードを含めて、その単語に基づいてフィルタリングできます。


2

試してください:ウィンドウ->設定-> Android-> LogCat。フィールド「Logcatビューを表示...」の値を「VERBOSE」に変更します。それは私を助けました。


2

Eclipseを使用している場合は、下のlogCatウィンドウで緑色の+記号を押し、パッケージ名(com.example.yourappname)を[ アプリケーション名]ボックスに入力します。また、[ フィルター名]ボックスで適切な名前を選択し、[OK]をクリックします。追加したフィルターをlogCatの左側のペインから選択すると、アプリケーションに関連するメッセージのみが表示されます。


2

ログに名前を付けます。私は「わわ」と呼びました。

ここに画像の説明を入力してください

Android Studioで、Android-> Edit Filter Configurationsに移動します

ここに画像の説明を入力してください

次に、ログに付けた名前を入力します。私の場合は「わわ」です。ここでは、実行できるフィルターの種類の例をいくつか示します。System.out、System.err、Logs、またはパッケージ名でフィルタリングできます。

ここに画像の説明を入力してください ここに画像の説明を入力してください ここに画像の説明を入力してください


2

これはおそらく最も簡単な解決策です。

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`"

2

Windows 10では、Ionicを使用して、「findstr」をすべてのアプリメッセージによって生成された「INFO:CONSOLE」と組み合わせることが私にとって非常にうまくいきました。だから、コマンドラインの私のコマンドは:

adb logcat | findstr INFO:CONSOLE

1

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"

1

使用してください-s

あなたはあなた自身のタグを使うべきです、見てください:http : //developer.android.com/reference/android/util/Log.html

お気に入り。

Log.d("AlexeysActivity","what you want to log");

そして、ログを読みたいときは>

adb logcat -s AlexeysActivity

これにより、同じタグを使用しないものはすべて除外されます。

ソース


1
コードを書いていると思い込まないでください。ライブラリからのメッセージを気にする場合があり、ログ文字列を変更することはできません。
ジェームズムーア

1

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%

1

これは明らかに、開発者デバイスの外部からLogcatを使用することを目的とした質問ですが、デバイスにLogcat出力(プログラムで)表示する場合は、次のようにするだけです。

Runtime.getRuntime().exec("logcat " + android.os.Process.myPid() + " *:D");

*:D最後のは、デバッグログレベルより下のすべてのメッセージを除外しますが、省略してもかまいません。

たとえばTextViewに出力を送るには、たとえば こちらをください


0

保存されたフィルターバーに新しいフィルターを追加せずに、tag:nameofthetagまたはapp:nameoftheappと入力してフィルター処理できるようになりました


0

intelliJ(おそらくeclipseでも)では、logcatの出力をテキストwebviewでフィルタリングできるので、基本的に、phonegapが生成しているすべてのものを出力します。


0

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>]


-1

Linuxでは、これは私のために働きました:

adb logcat | grep `adb shell ps | grep your.package | awk '{print $2}'`
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.