मैंने देखा कि जब मैं एंड्रॉइड के लिए ADT के साथ एक्लिप्स के साथ Logcat का उपयोग करता हूं, तो मुझे कई अन्य अनुप्रयोगों से भी संदेश मिलते हैं। क्या इसे फ़िल्टर करने और केवल मेरे स्वयं के एप्लिकेशन से केवल संदेश दिखाने का कोई तरीका है।
मैंने देखा कि जब मैं एंड्रॉइड के लिए ADT के साथ एक्लिप्स के साथ Logcat का उपयोग करता हूं, तो मुझे कई अन्य अनुप्रयोगों से भी संदेश मिलते हैं। क्या इसे फ़िल्टर करने और केवल मेरे स्वयं के एप्लिकेशन से केवल संदेश दिखाने का कोई तरीका है।
जवाबों:
पैकेज के नाम अद्वितीय होने की गारंटी है, इसलिए आप फ़ंक्शन को अपने पैकेज के नाम के रूप में टैग के साथ उपयोगLog
कर सकते हैं और फिर पैकेज नाम से फ़िल्टर कर सकते हैं :
नोट: बिल्ड टूल्स 21.0.3 के रूप में यह अब काम नहीं करेगा क्योंकि TAGS 23 वर्णों या उससे कम के प्रतिबंधित हैं।
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/logcot.html
http://developer.android.com/reference/android/util/Log.html
संपादित करें: ऐसा लगता है कि मैंने बंदूक को थोड़ा सा हिलाया और महसूस किया कि आप ग्रहण में लॉगकट के बारे में पूछ रहे थे। मैंने जो ऊपर पोस्ट किया है वह कमांड लाइन से adb के माध्यम से logcat का उपयोग करने के लिए है। मुझे यकीन नहीं है कि एक ही फिल्टर ग्रहण में स्थानांतरित हो।
logcat <your package name>:<log level>
उत्तर का उपयोग करके यह पता चलता है कि मान्य नाम के रूप में पैकेज नाम का उपयोग करना संभव है। मुझे यह समझने के लिए कि यह वास्तव में क्या कह रहा है, को समझने के लिए दो बार उत्तर को पढ़ने की आवश्यकता है, इसलिए मैं बस पहली पंक्ति को कुछ इस तरह बदलने की सलाह देता हूं जैसे कि " आपका पैकेज नाम logcat <tag>:<log level>
कहां <tag>
हो सकता है यदि आपने टैग के रूप में उपयोग किया है android.util.Log
"
PID को हथियाने के लिए ps / grep / cut का प्रयोग करें, फिर उस PID के साथ लॉगकैट प्रविष्टियों के लिए grep। यहाँ मैं उपयोग की आज्ञा है:
adb logcat | grep -F "`adb shell ps | grep com.asanayoga.asanarebel | tr -s [:space:] ' ' | cut -d' ' -f2`"
(आप असंबंधित लॉग लाइनों की सैद्धांतिक समस्या से बचने के लिए आगे रेगेक्स को बेहतर बना सकते हैं, लेकिन यह मेरे लिए कभी मुद्दा नहीं रहा है)
कई प्रक्रियाओं का मिलान करते समय यह भी काम करता है।
विंडोज पर आप कर सकते हैं:
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
विकल्पों की कोशिश की , लेकिन वे केवल कुछ संदेशों को छोड़कर कुछ मानों के साथ लॉग फ़िल्टर कर रहे हैं। आपका उत्तर वास्तविक है, किसी अन्य पुस्तकालयों से लॉग संदेश को बाहर किए बिना ऐप के बारे में सभी लॉग दिखाएं। यह एंड्रॉइड स्टूडियो करंट की तरह है 'केवल चयनित दिखाएँ' फ़िल्टर। धन्यवाद!
फ़िल्टर जोड़ें
नाम निर्दिष्ट करें
अपना फ़िल्टर चुनें।
मेरे लिए यह मैक 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 के लिए DEBUG लॉगिन करने के लिए $ adb -s RKSCWSOV5SAIEUSC shell;
2) $ logcat MyTAG:V AndroidRuntime:E *:S
4) अब यह MyTAG की क्रिया दिखाएगा और AndroidRuntime की त्रुटियों
कुछ साल हो गए हैं, और बात बदल गई है। और ग्रहण अब आधिकारिक रूप से समर्थित नहीं है। इसलिए यहां दो और अप-टू-डेट दृष्टिकोण हैं:
में Android monitor
टूलबॉक्स, आप logcat प्रति फ़िल्टर कर सकते हैं debuggable process
। आम तौर पर, जब आप किसी एप्लिकेशन को विकसित करते हैं तो यह एक डिबगेबल प्रक्रिया होती है। हर बार एक समय में मैं इस के साथ समस्या कर रहा हूँ, और निम्न कार्य करें:
Tools
-> Android
-> Enable ADB Integration
।
यदि यह पहले से ही सक्षम था, तो इसे बंद करें, और फिर वापस चालू करें
अपने मोबाइल डिवाइस को अनप्लग करें और रिप्लेस करें।
रेगेक्स और डीबग स्तर के माध्यम से फ़िल्टर करने के विकल्प भी हैं
adb logcat
यदि आप टर्मिनल आधारित समाधान का उपयोग करना चाहते हैं तो यह शीर्ष पर एक अच्छा अजगर आवरण है । इसके बारे में अच्छी बात यह है कि आप कई कॉन्फ़िगरेशन को बचा सकते हैं और बस उन्हें पुन: उपयोग कर सकते हैं। द्वारा छानना tags
काफी विश्वसनीय है। आप package
केवल एक या अधिक ऐप्स के लॉग देखने के लिए फ़िल्टर कर सकते हैं , लेकिन आप logcat-color
अपना ऐप लॉन्च करने से ठीक पहले शुरू करते हैं।
ऐसा लगता है कि मैं पिछले उत्तरों पर टिप्पणी नहीं कर सकता, इसलिए मैं एक नया पोस्ट करूंगा। यह टॉम मुल्काही के जवाब के लिए एक टिप्पणी है , यह दर्शाता है कि कमांड को कैसे बदलना चाहिए ताकि अधिकांश उपकरणों पर काम किया जा सकेadb shell ps
पीआईडी कॉलम चर है।
नोट: नीचे दिए गए आदेश उन मामलों के लिए काम करते हैं जहां आपने कई डिवाइस कनेक्ट किए हैं। तो 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
हर बार जब आप अपने एप्लिकेशन को फिर से चलाते हैं, तो आपको दूसरी कमांड को फिर से चलाना होगा, क्योंकि एप्लिकेशन को ओएस से एक नया पीआईडी मिलता है।
इसे 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
, मुझे लगता है कि यह विंडोज सिस्टम पर आवश्यक है, और मैंने APPID
कोष्ठक में लिपटे (अलग-अलग |
) अनुमति देने के लिए कोष्ठक में लपेट दिया ।
यह मेरे लिए USB डीबगिंग के साथ काम करता है:
डिवाइस कनेक्ट करें और उपयोग करें:
adb shell
कनेक्ट होने पर लॉगकट का उपयोग करें:
logcat | grep com.yourapp.packagename
यदि आप एंड्रॉइड स्टूडियो का उपयोग कर रहे हैं, तो आप उस प्रक्रिया का चयन कर सकते हैं जिससे आप लॉगकोट प्राप्त करना चाहते हैं। यहाँ स्क्रीनशॉट है।
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
मैंने पैकेज नाम से लॉगकैट को फ़िल्टर करने के लिए एक शेल स्क्रिप्ट लिखी, जो मुझे लगता है कि उपयोग करने से अधिक विश्वसनीय है
ps | grep com.example.package | cut -c10-15
यह वास्तविक pid का पता लगाने के लिए / proc / $ pid / cmdline का उपयोग करता है, फिर logatat पर एक grep करें
उबंटू: adb logcat -b all -v color --pid = `adb शेल पिडोफ -s com.packagename` रंग और लगातार ऐप के लॉग के साथ
adb shell pidof ...
बिट तो मैं मेरे लिए काम नहीं किया था adb shell
डिवाइस में एड और भाग गया top
मेरे अनुप्रयोग के लिए पीआईडी की नकल की और फिर अपना आदेश में बदल दिया
pgrep
पिडोफ के बजाय कोशिश करें
ग्रहण के लिए ADT v15 आपको एक एप्लिकेशन नाम (जो वास्तव में आपके androidmanifest.xml में पैकेज मान है) निर्दिष्ट करें।
मुझे ऐप द्वारा फ़िल्टर करने में सक्षम होना पसंद है, लेकिन नए लॉगकैट में ऑटोस्कोप के साथ एक बग है। जब आप पिछले लॉग को देखने के लिए थोड़ा स्क्रॉल करते हैं, तो यह स्वचालित रूप से कुछ सेकंड में वापस नीचे स्क्रॉल करता है। ऐसा लगता है कि स्क्रॉलिंग 1/2 तरह से होती है, लॉग लॉग को नीचे कूदने से रोकता है, लेकिन यह अक्सर बेकार होता है।
संपादित करें: मैंने कमांड-लाइन से ऐप फिल्टर को निर्दिष्ट करने की कोशिश की - लेकिन भाग्य नहीं। यदि कोई व्यक्ति इसका पता लगाता है या ऑटोक्रेक को कैसे रोक सकता है, तो कृपया मुझे बताएं।
एक संस्करण के रूप में आप जेक व्हार्टन द्वारा थर्ड पार्टी स्क्रिप्ट पीआईडी कैट का उपयोग कर सकते हैं । इस लिपि के दो प्रमुख लाभ हैं:
प्रलेखन से:
एप्लिकेशन डेवलपमेंट के दौरान आप अक्सर केवल अपने ऐप से आने वाले लॉग संदेशों को प्रदर्शित करना चाहते हैं। दुर्भाग्य से, क्योंकि प्रक्रिया आईडी हर बार जब आप फोन पर तैनाती करते हैं तो यह सही चीज के लिए जीआरईपी के लिए एक चुनौती बन जाती है।
यह स्क्रिप्ट अनुप्रयोग पैकेज द्वारा फ़िल्टर करके उस समस्या को हल करती है।
कोशिश करें: विंडो -> प्राथमिकताएं -> एंड्रॉइड -> लॉगकट। फ़ील्ड बदलें "लॉगकैट दृश्य दिखाएं यदि ..." मान "VERBOSE"। इसने मेरी मदद की।
यदि आप ग्रहण का उपयोग कर रहे हैं , तो नीचे लॉगऑन विंडो में हरे रंग का + चिह्न दबाएं और एप्लिकेशन नाम बॉक्स में अपना पैकेज नाम (com.example.yourappname) डालें । इसके अलावा, फ़िल्टर नाम बॉक्स में आपके लिए कोई भी नाम चुनें और ठीक पर क्लिक करें। आपको अपने आवेदन से संबंधित संदेश तभी दिखाई देंगे जब आपने अभी जो फ़िल्टर जोड़ा है वह लॉगकैट में बाएं फलक से चुना गया हो।
अपने लॉग को एक नाम दें। मुझे मेरा "वावा" कहा जाता है।
एंड्रॉइड स्टूडियो में, एंड्रॉइड पर जाएं-> फ़िल्टर कॉन्फ़िगरेशन संपादित करें
फिर उस नाम पर टाइप करें, जिसमें आपने लॉग दिए हैं। मेरे मामले में, इसे "वावा" कहा जाता है। यहां कुछ प्रकार के फ़िल्टर दिए गए हैं जो आप कर सकते हैं। आप System.out, System.err, Logs या पैकेज नामों से फ़िल्टर कर सकते हैं:
यह शायद सबसे सरल उपाय है।
टॉम मुल्काही से एक समाधान के शीर्ष पर, आप इसे नीचे की तरह सरल बना सकते हैं:
alias logcat="adb logcat | grep `adb shell ps | egrep '\bcom.your.package.name\b' | cut -c10-15`"
उपयोग सामान्य उपनाम के रूप में आसान है। अपने शेल में बस कमांड टाइप करें:
logcat
उपनाम सेटअप इसे आसान बनाता है। और रेगेक्स आपको केवल मुख्य प्रक्रिया के बारे में परवाह करते हुए, मल्टी-प्रोसेस ऐप्स के लिए मजबूत बनाता है।
कोज़ में से आप प्रत्येक प्रक्रिया के लिए अधिक उपनाम सेट कर सकते हैं जैसा कि आप कृपया। या हेगैज के घोल का उपयोग करें। :)
इसके अलावा, यदि आप लॉगिंग स्तर सेट करना चाहते हैं, तो यह है
alias logcat-w="adb logcat *:W | grep `adb shell ps | egrep '\bcom.your.package.name\b' | cut -c10-15`"
मैंने टॉम मुलकाही के उत्तर का उपयोग करने की कोशिश की, लेकिन दुर्भाग्य से यह कई प्रक्रियाओं वाले अनुप्रयोगों के लिए काम नहीं कर रहा था, इसलिए मैं अपनी आवश्यकताओं को पूरा करने के लिए इसे संपादित करता हूं।
#!/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
वह सब कुछ फ़िल्टर करता है जो एक ही टैग का उपयोग नहीं करता है।
के अलावा टॉम मल्केही के जवाब है, यदि आप Windows पर पीआईडी द्वारा फिल्टर करना चाहते हैं 'कंसोल, आप ऐसा एक छोटे बैच फ़ाइल बना सकते हैं:
@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%
यह स्पष्ट रूप से डेवलपर डिवाइस के बाहर Logcat के उपयोग के उद्देश्य से एक प्रश्न है, हालांकि यदि आप डिवाइस पर Logcat आउटपुट (प्रोग्रामेटिक रूप से) प्रदर्शित करना चाहते हैं , तो आपको बस इसकी आवश्यकता है:
Runtime.getRuntime().exec("logcat " + android.os.Process.myPid() + " *:D");
*:D
अंत में डीबग लॉग स्तर से नीचे जाने वाले प्रत्येक संदेश को फ़िल्टर कर देता है, लेकिन आपको लगता है कि बाहर छोड़ सकते हैं।
आउटपुट को निर्देशित करने के लिए, एक TextView, उदाहरण के लिए यहाँ देखें ।
अब टैग टाइप करना संभव है: nameofthetag या app: nameoftheapp to फ़िल्टर बिना नए फ़िल्टर को सहेजे हुए फ़िल्टर बार में जोड़ना
IntelliJ में (और शायद ग्रहण में भी) आप टेक्स्ट वेबव्यू द्वारा लॉगकैट आउटपुट को फ़िल्टर कर सकते हैं , इसलिए यह मूल रूप से सब कुछ प्रिंट करता है जो फोनगैप का उत्पादन कर रहा है
फिर भी applog.sh
कई उपकरणों और कई प्रक्रियाओं के साथ अनुप्रयोगों के समर्थन के साथ गेवरियल का दूसरा संस्करण :
#!/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>]
लिनक्स में, इसने मेरे लिए काम किया:
adb logcat | grep `adb shell ps | grep your.package | awk '{print $2}'`