Как генерировать значения из моей бизнес-логики в файл журнала с помощью декораторов? - PullRequest
0 голосов
/ 26 декабря 2018

Я хочу сгенерировать значения из своей бизнес-логики в файле журнала, но я не уверен, как это сделать.

import time
import logging

logging.basicConfig(filename='new_example.log',level=logging.DEBUG)
logging.debug('This message should go to the log file')
logging.info('So should this')
logging.warning('And this, too')
logging.error('Please check')

def log_check(func):
    def wrapper(*args, **kwargs):
        start = time.time()
        result = func(*args, **kwargs)
        end = time.time()
        logging.info(func.__name__ + "took" + str ((end - start) * 1000) + "mili seconds")
        #logging.info('this is what {}'.format(func.__name__)+ func["user"] + " : " + func["passw"])
        print (func.__name__ + "took" + str ((end - start) * 1000) + "mili seconds")
        return result
    return wrapper()

@log_check
def login():
    user = raw_input("Username: ")
    passw = raw_input("Password: ")
    return {"user":user, "passw":passw}

Я хочу, чтобы сгенерированные мной значения для пользователя и пароля были сгенерированыв лог-файл.как я это сделал?Я получаю INFO:root:logintook1964.99991417mili seconds в качестве своей записи в моем файле журнала, но я хочу, чтобы вместе с ним были сгенерированы значения, которые я ввожу в качестве пользователя и пароля.

Ответы [ 2 ]

0 голосов
/ 26 декабря 2018

Вы не можете иметь общий декоратор, работающий, если он предполагает что-либо относительно возвращаемого значения декорированной функции - все, что вы можете здесь сделать, это записать результат (независимо от того, что это), то есть:

def log_check(func):
    def wrapper(*args, **kwargs):
        start = time.time()
        result = func(*args, **kwargs)
        end = time.time()
        # proper use of `logger` methods: dont build the whole string, just 
        # pass a format string and the matching arguments)
        logging.info("%s took %s milliseconds", func.__name__,  (end - start) * 1000)
        # if you hope to use this decorator on anything else than
        # your login function, don't assume _anything_ about what
        # the decorated func might return
        logging.info('func %s returned %s', func.__name__, result)
        return result


    # You want to return the wrapper function, not
    # to call it !!!
    # return wrapper()
    return wrapper

При этом не следует смешивать несвязанные проблемы, например данные об эксплуатации (выполнение функции времени) и данные, относящиеся к области (что вернула функция и т. Д.).Вместо этого я бы лично занялся ведением доменных имен внутри самой функции.И я бы НИКОГДА не регистрировал конфиденциальные данные, такие как пары имя пользователя / пароль (напомните мне, чтобы я никогда не использовал одну из ваших программ, если у вас есть привычка пропускать такие вещи).

0 голосов
/ 26 декабря 2018

Вы должны использовать result["user"] и result["passw"] вместо func["user"] и func["passw"], потому что значения находятся в возвращаемом значении функции, а не в самой функции:

def log_check(func):
    def wrapper(*args, **kwargs):
        start = time.time()
        result = func(*args, **kwargs)
        end = time.time()
        logging.info(func.__name__ + "took" + str ((end - start) * 1000) + "mili seconds")
        logging.info('this is what {}'.format(func.__name__)+ result["user"] + " : " + result["passw"])
        print (func.__name__ + "took" + str ((end - start) * 1000) + "mili seconds")
        return result
    return wrapper()
...