4

Androidデバイスからlogcatを取得するには、adb shell logcat(いくつかのgrepフィルタリングを組み合わせて)を使用します。

出力例は次のとおりです。

E/com.samsung.app( 3739): [MSC]>>>...
I/InputDispatcher( 2882): Delivering ...
D/ProgramMonitor( 3770): START ...
D/ProgramMonitor( 3770): LAUNCHER_RESUME...
I/Debug   ( 3815): onReceive...
E/Debug   ( 3815): receive ...
D/ClientReporter( 3036): ...

私の質問は、ログの最初の文字に基づいて、出力の色をどのように変更できるかということです。「E」は赤で、「D」は緑で、というように印刷されます...Eclipseでのログの表示とまったく同じです。

ありがとうございました

4

3 に答える 3

7

ここで見つけたPythonスクリプトを使用します:

フルカラーデバッグ用にAndroidlogcatストリームを変更する

使用と必要に応じて変更するのは本当に簡単です。

完全なソースコード:

#!/usr/bin/python

'''
    Copyright 2009, The Android Open Source Project

    Licensed under the Apache License, Version 2.0 (the "License"); 
    you may not use this file except in compliance with the License. 
    You may obtain a copy of the License at 

        http://www.apache.org/licenses/LICENSE-2.0 

    Unless required by applicable law or agreed to in writing, software 
    distributed under the License is distributed on an "AS IS" BASIS, 
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
    See the License for the specific language governing permissions and 
    limitations under the License.
'''

# script to highlight adb logcat output for console
# written by jeff sharkey, http://jsharkey.org/
# piping detection and popen() added by other android team members


import os, sys, re, StringIO
import fcntl, termios, struct

# unpack the current terminal width/height
data = fcntl.ioctl(sys.stdout.fileno(), termios.TIOCGWINSZ, '1234')
HEIGHT, WIDTH = struct.unpack('hh',data)

BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE = range(8)

def format(fg=None, bg=None, bright=False, bold=False, dim=False, reset=False):
    # manually derived from http://en.wikipedia.org/wiki/ANSI_escape_code#Codes
    codes = []
    if reset: codes.append("0")
    else:
        if not fg is None: codes.append("3%d" % (fg))
        if not bg is None:
            if not bright: codes.append("4%d" % (bg))
            else: codes.append("10%d" % (bg))
        if bold: codes.append("1")
        elif dim: codes.append("2")
        else: codes.append("22")
    return "\033[%sm" % (";".join(codes))


def indent_wrap(message, indent=0, width=80):
    wrap_area = width - indent
    messagebuf = StringIO.StringIO()
    current = 0
    while current < len(message):
        next = min(current + wrap_area, len(message))
        messagebuf.write(message[current:next])
        if next < len(message):
            messagebuf.write("\n%s" % (" " * indent))
        current = next
    return messagebuf.getvalue()


LAST_USED = [RED,GREEN,YELLOW,BLUE,MAGENTA,CYAN,WHITE]
KNOWN_TAGS = {
    "dalvikvm": BLUE,
    "Process": BLUE,
    "ActivityManager": CYAN,
    "ActivityThread": CYAN,
}

def allocate_color(tag):
    # this will allocate a unique format for the given tag
    # since we dont have very many colors, we always keep track of the LRU
    if not tag in KNOWN_TAGS:
        KNOWN_TAGS[tag] = LAST_USED[0]
    color = KNOWN_TAGS[tag]
    LAST_USED.remove(color)
    LAST_USED.append(color)
    return color


RULES = {
    #re.compile(r"([\w\.@]+)=([\w\.@]+)"): r"%s\1%s=%s\2%s" % (format(fg=BLUE), format(fg=GREEN), format(fg=BLUE), format(reset=True)),
}

TAGTYPE_WIDTH = 3
TAG_WIDTH = 20
PROCESS_WIDTH = 8 # 8 or -1
HEADER_SIZE = TAGTYPE_WIDTH + 1 + TAG_WIDTH + 1 + PROCESS_WIDTH + 1

TAGTYPES = {
    "V": "%s%s%s " % (format(fg=WHITE, bg=BLACK), "V".center(TAGTYPE_WIDTH), format(reset=True)),
    "D": "%s%s%s " % (format(fg=BLACK, bg=BLUE), "D".center(TAGTYPE_WIDTH), format(reset=True)),
    "I": "%s%s%s " % (format(fg=BLACK, bg=GREEN), "I".center(TAGTYPE_WIDTH), format(reset=True)),
    "W": "%s%s%s " % (format(fg=BLACK, bg=YELLOW), "W".center(TAGTYPE_WIDTH), format(reset=True)),
    "E": "%s%s%s " % (format(fg=BLACK, bg=RED), "E".center(TAGTYPE_WIDTH), format(reset=True)),
}

retag = re.compile("^([A-Z])/([^\(]+)\(([^\)]+)\): (.*)$")

# to pick up -d or -e
adb_args = ' '.join(sys.argv[1:])

# if someone is piping in to us, use stdin as input.  if not, invoke adb logcat
if os.isatty(sys.stdin.fileno()):
    input = os.popen("adb %s logcat" % adb_args)
else:
    input = sys.stdin

while True:
    try:
        line = input.readline()
    except KeyboardInterrupt:
        break

    match = retag.match(line)
    if not match is None:
        tagtype, tag, owner, message = match.groups()
        linebuf = StringIO.StringIO()

        # center process info
        if PROCESS_WIDTH > 0:
            owner = owner.strip().center(PROCESS_WIDTH)
            linebuf.write("%s%s%s " % (format(fg=BLACK, bg=BLACK, bright=True), owner, format(reset=True)))

        # right-align tag title and allocate color if needed
        tag = tag.strip()
        color = allocate_color(tag)
        tag = tag[-TAG_WIDTH:].rjust(TAG_WIDTH)
        linebuf.write("%s%s %s" % (format(fg=color, dim=False), tag, format(reset=True)))

        # write out tagtype colored edge
        if not tagtype in TAGTYPES: break
        linebuf.write(TAGTYPES[tagtype])

        # insert line wrapping as needed
        message = indent_wrap(message, HEADER_SIZE, WIDTH)

        # format tag message using rules
        for matcher in RULES:
            replace = RULES[matcher]
            message = matcher.sub(replace, message)

        linebuf.write(message)
        line = linebuf.getvalue()

    print line
    if len(line) == 0: break
于 2012-06-26T09:24:23.187 に答える
2

NPMをお持ちの場合は、次のモジュールをインストールできます。

$ npm install -g logcat

これにより、コンソールおよび//127.0.0.1/で色付きのローカルホストの監視を開始できます。

$ logcat

ここに説明があります

于 2013-03-01T23:25:07.827 に答える
0

非常にシンプルなものが欲しかったのですが、出力を解析して再フォーマットする巨大なスクリプトをインポートしたくなかったので、これを思いつきました。これは文字通り入力行を正確に出力し、それに応じてカラーコードを追加します。

#!/usr/bin/env python

import sys
import subprocess
import csv

DEFAULT = "0;37;49"
ERROR = "0;91;49"
WARNING = "0;93;49"
INFO = "0;92;49"
DEBUG = "0;94;49"
VERBOSE = "0;97;49"

try:
    proc = subprocess.Popen(['adb','logcat', '-v', 'time'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    for line in iter(proc.stdout.readline, ''):
        l = line.split(None, 3)
        try:
            level_and_tag = l[2]

            if level_and_tag.startswith('E/'): color = ERROR
            elif level_and_tag.startswith('W/'): color = WARNING
            elif level_and_tag.startswith('I/'): color = INFO
            elif level_and_tag.startswith('D/'): color = DEBUG
            elif level_and_tag.startswith('V/'): color = VERBOSE
            else: color = DEFAULT
        except IndexError as e:
            color = DEFAULT

        print '\x1b[%sm %s \x1b[0m' % (color, line.strip())
        #sys.stdout.write('\x1b[%sm %s \x1b[0m' % (color, line))
except KeyboardInterrupt:
    # Make sure color gets set back to terminal default
    print '\x1b[%sm %s \x1b[0m' % (DEFAULT, ">>> Exit")

これは標準-v timeフォーマットで機能しますが、もちろん、好きなフォーマットに合うように変更できることに注意してください。

于 2018-03-05T22:10:59.933 に答える