Уведомления

Группа в Telegram: @pythonsu

#1 Март 3, 2016 15:04:47

noob_saibot
Зарегистрирован: 2013-09-11
Сообщения: 495
Репутация: +  20  -
Профиль   Отправить e-mail  

Укажите на проблемы

Уважаемые форумчане, прошу натыкать носом в места кода где я сделал либо откровенную глупость, либо недочёт. Скрипт обрабатывает логи, поступающие на 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 (Март 4, 2016 08:54:18)

Прикреплённый файлы:
attachment log (13,6 KБ)

Офлайн

#2 Март 3, 2016 15:13:26

noob_saibot
Зарегистрирован: 2013-09-11
Сообщения: 495
Репутация: +  20  -
Профиль   Отправить e-mail  

Укажите на проблемы

Шаблон. Но будет работать и без него.

Прикреплённый файлы:
attachment template (122 байта)

Офлайн

#3 Фев. 28, 2024 08:50:35

kelseyradley
Зарегистрирован: 2023-08-29
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Укажите на проблемы

Вариант Однако и без него будет работать.  buildnow gg 

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version