Найти - Пользователи
Полная версия: Укажите на проблемы
Начало » Python для новичков » Укажите на проблемы
1
noob_saibot
Уважаемые форумчане, прошу натыкать носом в места кода где я сделал либо откровенную глупость, либо недочёт. Скрипт обрабатывает логи, поступающие на stdin, согласно шаблону из файла или по умолчанию, от утилиты tail с использованием jinja2. Пример лога приложил.
Суть в том что это задание было на собеседовании, мне сказали “низкий уровень” и всё, на вопросы, а что именно не так, ответа не дали… Мне стало интересно, что не так с кодом, надо же исправляться и как-то поднимать “уровень”. Задание делалось с “защитой от дураков” поэтому столько try и print.
Запуск:
tail -f log | ./script.py --format template --filter @fields.level=WARNING
Сам код:
import sys
import getopt
import ast
from jinja2 import Template
def j_usage():
    """
    This function print instruction of this script.
    """
    print u'''Manual\nUsage: --format <file> --filter [@fields]\nExample:
    script --format template --filter @fields.level=ERROR\n'''
def j_param(fmt_j, flt_j):
    """
    Constructor of templates.
    Parameters
    ----------
    :param fmt_j: str of None
        Format of template.
    :param flt_j: str or None
        Filter of template.
    Returns
    -------
    :return: tmp_ms
        This is directly template.
    """
    # Default format of output.
    tmp_ms = u"{% if args['@fields'][LEVEL] == type %}{{args['@timestamp']}}" \
             u" {{args['@fields'][LEVEL]}} {{args['@message']}} {% endif %}"
    try:
        with open(fmt_j) as fl:
            tmp_ms = fl.readline()
    except IOError:
        print u'Wrong file. Default parameters.'
    except TypeError:
        print u'Wrong key. Default parameters.'
    # Some types of filtering. It will be flt_j for True, and Default else.
    if flt_j:
        # String to list of parameters.
        flt_j = flt_j.split("s.")[-1].split("=")
        shb = {u"LEVEL": u"'%s'" % flt_j[0], u"type": u"'%s'" % flt_j[1]}
        for i, j in shb.items():
            tmp_ms = tmp_ms.replace(i, j)
    else:
        shb = {u"LEVEL": u"'level'", u"type": u"'ERROR'"}
        for i, j in shb.items():
            tmp_ms = tmp_ms.replace(i, j)
    return tmp_ms
def j_pars(log):
    """
    Parsing of incoming string.
    Parameters
    ----------
    :param log: str
        String with data.
    Returns
    -------
    :return:
        Result of parsing.
    """
    template = Template(template_mes)
    # String to dictionary.
    try:
        log = ast.literal_eval(log)
    except ValueError:
        print u"Wrong input data!"
        sys.exit(2)
    result = template.render(args=log)
    if result:
        print result
try:
    opts, args = getopt.getopt(sys.argv[1:], u'h:f:f', [u'help', u'format=', u'filter='])
except getopt.GetoptError:
    j_usage()
    sys.exit(2)
jformat = None
jfilter = None
for opt, arg in opts:
    if opt in u'--help':
        j_usage()
        sys.exit(2)
    elif opt == u'--format':
        jformat = arg
    elif opt == u'--filter':
        jfilter = arg
if not jformat:
    print u"Default format, use help for detail.\n"
if not jfilter:
    print u"Default filter, use help for detail.\n"
template_mes = j_param(jformat, jfilter)
try:
    while True:
        tm = sys.stdin.readline()
        j_pars(tm),
except KeyboardInterrupt:
    print u"Exit"
noob_saibot
Шаблон. Но будет работать и без него.
kelseyradley
Вариант Однако и без него будет работать.  buildnow gg 
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB