Двойная регистрация Python на основе аргумента - PullRequest
0 голосов
/ 06 ноября 2019

Я пытаюсь получить запись в журнал файлов, а также в консоль на основе предоставленного аргумента.

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

logFormatter = logging.Formatter("%(asctime)s [%(threadName)-12.12s] [%(levelname)-5.5s]  %(message)s")
_logger = logging.getLogger(__name__)

fileHandler = logging.FileHandler("{0}/{1}.log".format(logPath, fileName), mode='a')
fileHandler.setLevel(logging.DEBUG)
fileHandler.setFormatter(logFormatter)
_logger.addHandler(fileHandler)

def parse_args(args):
    parser = argparse.ArgumentParser(
        description="My Script")
    parser.add_argument(
        "-v",
        "--verbose",
        dest="loglevel",
        help="set loglevel to INFO",
        action="store_const",
        const=logging.INFO)
    parser.add_argument(
        "-vv",
        "--very-verbose",
        dest="loglevel",
        help="set loglevel to DEBUG",
        action="store_const",
        const=logging.DEBUG)
    return parser.parse_args(args)

def setup_logging(loglevel):
    logformat = "%(asctime)s [%(threadName)-12.12s] [%(levelname)-5.5s]  %(message)s"
    logging.basicConfig(level=loglevel, stream=sys.stdout, format=logformat, datefmt="%Y-%m-%d %H:%M:%S")

def main(args):
    args = parse_args(args)
    setup_logging(args.loglevel)
    _logger.info("Script starts here")
    """main code"""
    _logger.info("Script ends here")

def run():
    """Entry point for console_scripts
    """
    main(sys.argv[1:])

if __name__ == "__main__":
    run()

будет работать нормальнокогда я запускаю скрипт с аргументом -v или -vv, но когда это не так, файл журнала провайдера также не создается, когда я ожидаю, что все журналы будут сохранены там в любое время.

Как я могу указать, чтофайл журнала будет создаваться каждый раз и stdout только по подробному запросу?

PS. Я переместил некоторый код в

def setup_logging(loglevel):
    logFormatter = logging.Formatter("%(asctime)s [%(threadName)-12.12s] [%(levelname)-5.5s]  %(message)s")

    if loglevel is not None:
        logformat = "%(asctime)s [%(threadName)-12.12s] [%(levelname)-5.5s]  %(message)s"
        logging.basicConfig(level=loglevel, stream=sys.stdout, format=logformat, datefmt="%Y-%m-%d %H:%M:%S")

    _logger.setLevel(logging.DEBUG)
    fileHandler = logging.handlers.TimedRotatingFileHandler("{0}/{1}.log".format(logPath, logFileName), when="midnight")
    fileHandler.setFormatter(logFormatter)
    _logger.addHandler(fileHandler)

, который будет все время регистрироваться в файле журнала, а затем выводиться на нем, но в файле журнала сохраняется только выходной журнал, установленный как INFO, и ничего, что получается как DEBUGкак видно при беге как многословный -vv

Ответы [ 2 ]

0 голосов
/ 11 ноября 2019

У меня исправлено путем обновления setup_logging():

_logger = logging.getLogger()
http_client_logger = logging.getLogger("http.client")

def print_to_log(*args):
    http_client_logger.debug(" ".join(args))


def setup_logging(loglevel, logPath, logFile):
    fileHandler = logging.handlers.TimedRotatingFileHandler("{0}/{1}.log".format(logPath, logFile), when="midnight")
    fileHandler.setLevel(logging.DEBUG)
    handlers = [fileHandler]

    if loglevel is not None:
        # if a log level is configured, use that for logging to the console
        stream_handler = logging.StreamHandler(sys.stdout)
        stream_handler.setLevel(loglevel)
        handlers.append(stream_handler)

    if loglevel == logging.DEBUG:
        # when logging at debug level, make http.client extra chatty too
        http.client.HTTPConnection.debuglevel = 1

    logformat = "%(asctime)s [%(threadName)-12.12s] [%(levelname)-5.5s]  %(message)s"
    logging.basicConfig(format=logformat, datefmt="%Y-%m-%d %H:%M:%S", handlers=handlers, level=logging.DEBUG)
0 голосов
/ 06 ноября 2019

Вам не хватает значения по умолчанию для уровня логирования, если ни одна опция не указана.

parser.add_argument(
    "-v",
    "--verbose",
    dest="loglevel",
    help="set loglevel to INFO",
    action="store_const",
    default=logging.DEBUG, # <---- You are missing this line here
    const=logging.INFO)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...