Форум сайта python.su
Уважаемые форумчане, прошу натыкать носом в места кода где я сделал либо откровенную глупость, либо недочёт. Скрипт обрабатывает логи, поступающие на 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)
Прикреплённый файлы:
log (13,6 KБ)
Офлайн
Шаблон. Но будет работать и без него.
Прикреплённый файлы:
template (122 байта)
Офлайн
Вариант Однако и без него будет работать. buildnow gg
Офлайн