基于参数的Python双重日志记录

我正在尝试根据提供的参数将日志记录到文件日志以及控制台。

该部分的代码如下:

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",help="set loglevel to DEBUG",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,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

jaychpk 回答:基于参数的Python双重日志记录

未提供任何选项时,您将缺少日志级别的默认值。

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)
,

我通过更新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)
本文链接:https://www.f2er.com/3150172.html

大家都在问