logging器configurationlogin到文件并打印到标准输出

我正在使用Python的日志logging模块来logging一些debuggingstring到一个文件工作得很好。 现在,另外,我想使用这个模块也打印到标准输出的string。 我该怎么做呢? 为了将我的stringlogging到一个文件,我使用下面的代码:

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) 

然后调用一个logging器函数

 logger.debug("I am written to the file") 

谢谢你在这里的帮助!

只需获取根logging器的句柄并添加StreamHandler即可。 StreamHandler写入stderr。 不知道你是否真的需要标准输出stderr,但这是我使用当我设置Pythonlogging器,我也添加FileHandler。 然后我所有的日志都去两个地方(这是你想要的)。

 import logging logging.getLogger().addHandler(logging.StreamHandler()) 

您也可以添加一个格式化程序,以便您的所有日志行都有一个共同的标题。

即:

 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) 

打印到以下格式:

 2012-12-05 16:58:26,618 [MainThread ] [INFO ] my message 

添加一个没有参数的StreamHandler进入stderr而不是stdout。 如果其他进程依赖于标准输出转储(即写入NRPE插件),则确保明确指定标准输出,否则可能会遇到一些意想不到的麻烦。

下面是一个快速示例,重用问题中的假定值和LOGFILE:

 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) 

在设置任何其他处理程序或logging任何消息之前,以stream=sys.stdout作为参数运行basicConfig ,或手动添加将消息推送到根logging器(或其他所需的任何其他logging器)的StreamHandler , 。

logging.basicLogging()可以接受自Python 3.3以来的关键字参数handlers ,这可以简化日志logging设置,特别是在使用相同的格式化程序设置多个处理程序时:

handlers – 如果指定,这应该是已经创build的处理程序添加到根logging器的迭代。 任何尚未设置格式化程序的处理程序都将被分配在此函数中创build的默认格式化程序。

从被接受的答案中得到的相当长和冗长的例子代码就变成了这样:

 import logging logging.basicConfig( format="%(asctime)s [%(threadName)-12.12s] [%(levelname)-5.5s] %(message)s", handlers=[ logging.FileHandler("{0}/{1}.log".format(logPath, fileName)), logging.StreamHandler() ]) 

(或者根据原始问题的要求使用import sys + StreamHandler(sys.stdout) 。)

对于2.7,请尝试以下操作:

 fh = logging.handlers.RotatingFileHandler(LOGFILE, maxBytes=(1048576*5), backupCount=7)