2012-06-26 5 views
3

Чтобы получить логарифм с устройства Android, я использую adb shell logcat (также с некоторой фильтрацией grep в миксе).Цвет adb logcat в командной строке Ubuntu

Пример вывода выглядит следующим образом:

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.

Спасибо

ответ

7

Я использую питона скрипт я нашел здесь:

Modifying the Android logcat stream for full-color debugging

Это очень легко использовать и модифицировать, если вы хотите.

Полный исходный код:

#!/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\[email protected]]+)=([\w\[email protected]]+)"): 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 
+0

спасибо. Это было очень полезно! – MobileCushion

+0

Мне нравится эта утилита, но я действительно пропускаю цветовое кодирование на самих линиях. Я использую цвета для отслеживания важных потоков :-) Я должен добавить, что мой Python равен нулю –

+0

Нужно ли настраивать терминал или шрифт? Я до сих пор вижу зеленый текст с добавленными интервалами. –

2

Если у вас есть НПМ, вы можете установить модуль:

$ npm install -g logcat 

, которая обеспечит вам начать мониторинг цветной LogCat в консоли и //127.0.0.1/ ,

$ logcat 

Here является описанием

+0

Хотя ваше намерение, вероятно, хорошо, это не работает на недавнем Ubuntu, поскольку «сборка» не позволяет получить некоторые зависимости (есть много зависимостей). Мне нравится скрипт python лучше, поскольку он требует только python, который уже установлен в большинстве дистрибутивов. – wojciii

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, но, конечно, может быть изменен, чтобы соответствовать любой формат, который вы хотите.