2013-02-25 8 views
5

Wie kann ich die Ausgabe von adb logcat für ein Tag mit einem Doppelpunkt darin filtern (nur mit logcat, nicht mit grep oder identische Werkzeuge)?Android ADB Logcat: Tag mit Doppelpunkt

z.B .:

adb logcat "SomeApp:Something:* *:S" 

wo "SomeApp:Something" den angegebenen Tag ist.

Ich weiß, dass dieses Symbol in einem Tag sollte nicht verwendet werden, aber leider ist es Dritten Code, nicht unsere ...

Vielen Dank im Voraus!

Antwort

2

Ich muss sagen, es ist eine gute Frage. Ich habe den Code für logcat überprüft und herausgefunden, dass der Parsing-Code für den Filterausdruck in logcat.cpp steht.

int android_log_addFilterRule(AndroidLogFormat *p_format, 
     const char *filterExpression) 
{ 
    size_t i=0; 
    size_t tagNameLength; 
    android_LogPriority pri = ANDROID_LOG_DEFAULT; 

    tagNameLength = strcspn(filterExpression, ":"); 

    if (tagNameLength == 0) { 
     goto error; 
    } 

    if(filterExpression[tagNameLength] == ':') { 
     pri = filterCharToPri(filterExpression[tagNameLength+1]); 

     if (pri == ANDROID_LOG_UNKNOWN) { 
      goto error; 
     } 
    } 

    ... 

    return 0; 
error: 
    return -1; 
} 

Der entscheidende Punkt ist logcat Verwendung strcspn (Filterexpression „:“) ein tagname zu analysieren, so dass im Grunde Angst, ich bin es unmöglich ist, einen Tag mit Doppelpunkt logcat zu filtern. Sie können jedoch andere Wege finden.

Ich denke, die DDMS in Eclipse kann regulären Ausdruck verwenden, um Tag-Feld zu filtern, so dass Sie mit sehr komplizierten REs gehen können, wenn Sie möchten.

"SomeApp\:Something:* *:S" 

Sie können sogar einige oder Feature ausprobieren:

^Something1$|^Something2$ 

Wenn Sie wollen Eclipse nicht verwenden, können Sie versuchen, das Protokoll von Ihrem eigenen Code auslesen und analysieren sie in verschiedene Protokolldatensätze und Protokollfeld. Dann können Sie ein einfaches Skript schreiben, um zu filtern, was Sie wollen. Hoffe, das kann dir helfen.

+0

Wow, jetzt merkte ich, dass das schließlich nur ein Teil des Problems war. Tatsächlich scheint der von Ihnen angegebene Ausdruck zu funktionieren, aber versuchen Sie, ein "M" nach dem Doppelpunkt hinzuzufügen, d. H .: "adb logcat" SomeApp \\: MSomething: * *: S "'! Es wird einen Fehler mit den Details werfen: 'Ungültiger Filterausdruck 'SomeApp \: MSomething: * *: S'' (und das Tag, das ich zu filtern versuche, hat ein' M 'nach dem Doppelpunkt ... Wahrscheinlich ein Fehler ? –

+0

Nicht ganz sicher über das. Ist das Problem immer noch dort mit einzelnen Backslash wie "SomeApp \: MSomething: * *: S"? Wenn es ein anderer Buchstabe wie "A" nicht "M" ist, ist das Problem immer noch da? – StarPinkER

+0

Ja, das "SomeApp: Something: *" scheint akzeptiert zu sein, weil das "S" in "Something" als Ausführlichkeitsstufe abgefangen wird (dh in diesem Fall Silent), also funktionieren alle diese, aber wahrscheinlich nicht wie erwartet : "V, D, I, W, E, F" –

0

Sie können auch durch externe Dienstprogramme wie grep filtern:

adb logcat | grep SomeApp

Zum Beispiel das Protokoll TAG von AudioPolicyManager ist "APM :: AudioPolicyManager", die enthält Doppelpunkte:

adb logcat *: V | grep APM