logger configuration to log to file and print to stdout
我正在使用python的日志模块将一些调试字符串记录到一个运行良好的文件中。现在,除此之外,我还想使用这个模块将字符串输出到stdout。我该怎么做?为了将字符串记录到文件中,我使用以下代码:
1 2 3 4 5 6 7 8 9 10 | import logging import logging.handlers logger = logging.getLogger("") logger.setLevel(logging.DEBUG) handler = logging.handlers.RotatingFileHandler( LOGFILE, maxBytes=(1048576*5), backupCount=7 ) formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s") handler.setFormatter(formatter) logger.addHandler(handler) |
然后调用logger函数
1 | logger.debug("I am written to the file") |
号
谢谢你的帮助!
只需获得根记录器的句柄并添加
1 2 | import logging logging.getLogger().addHandler(logging.StreamHandler()) |
如果要输出到
1 2 3 | import sys # ... logging.getLogger().addHandler(logging.StreamHandler(sys.stdout)) |
号
您还可以向它添加一个
IE:
1 2 3 4 5 6 7 8 9 10 11 | import logging logFormatter = logging.Formatter("%(asctime)s [%(threadName)-12.12s] [%(levelname)-5.5s] %(message)s") rootLogger = logging.getLogger() fileHandler = logging.FileHandler("{0}/{1}.log".format(logPath, fileName)) fileHandler.setFormatter(logFormatter) rootLogger.addHandler(fileHandler) consoleHandler = logging.StreamHandler() consoleHandler.setFormatter(logFormatter) rootLogger.addHandler(consoleHandler) |
按以下格式打印:
1 | 2012-12-05 16:58:26,618 [MainThread ] [INFO ] my message |
。
由于python 3.3,
handlers – If specified, this should be an iterable of already created handlers to add to the root logger. Any handlers which don’t already have a formatter set will be assigned the default formatter created in this function.
号
因此,来自公认答案的相当长和冗长的示例代码变成了:
1 2 3 4 5 6 7 8 9 | import logging logging.basicConfig( level=logging.INFO, format="%(asctime)s [%(threadName)-12.12s] [%(levelname)-5.5s] %(message)s", handlers=[ logging.FileHandler("{0}/{1}.log".format(logPath, fileName)), logging.StreamHandler() ]) |
。
(或根据原始问题的要求使用
要获取记录器,请使用
1 | logger = logging.getLogger() |
在脚本的后面,使用
添加不带参数的streamHandler将转到stderr而不是stdout。如果其他进程依赖于stdout转储(即在编写nrpe插件时),请确保显式指定stdout,否则可能会遇到一些意外的问题。
下面是一个重用问题中假定值和日志文件的快速示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | import logging from logging.handlers import RotatingFileHandler from logging import handlers import sys log = logging.getLogger('') log.setLevel(logging.DEBUG) format = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s") ch = logging.StreamHandler(sys.stdout) ch.setFormatter(format) log.addHandler(ch) fh = handlers.RotatingFileHandler(LOGFILE, maxBytes=(1048576*5), backupCount=7) fh.setFormatter(format) log.addHandler(fh) |
或者在设置任何其他处理程序或记录任何消息之前,以
在多次使用Waterboy的代码后,我最终将其转换为一个小型的独立的python包,您可以在这里找到:
https://github.com/acschaefer/duallog
该代码有良好的文档记录,易于使用。只需下载
对于2.7,请尝试以下操作:
1 | fh = logging.handlers.RotatingFileHandler(LOGFILE, maxBytes=(1048576*5), backupCount=7) |
。