我使用Python的日志记录模块的一些调试字符串登录到效果很好的文件。 现在,除此之外,我想使用这个模块也打印出来的字符串到标准输出。 我该怎么做呢? 为了记录我的字符串到一个文件我用下面的代码:
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.debug("I am written to the file")
感谢您对这里一些帮助!
刚刚得到的句柄根记录并添加StreamHandler
。 该StreamHandler
写至标准错误。 不知道是否你真的需要在标准输出标准错误,但是这是我用,当我安装Python的记录,我也加FileHandler
为好。 然后我所有的日志,去这两个地方(这是它听起来像你想要的)。
import logging
logging.getLogger().addHandler(logging.StreamHandler())
如果要输出到stdout
,而不是stderr
,你只需要把它指定到StreamHandler
构造函数。
import sys
# ...
logging.getLogger().addHandler(logging.StreamHandler(sys.stdout))
你还可以添加一个Formatter
它,因此你的所有日志行都有一个共同的头。
即:
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
logging.basicConfig()
可以采取关键字参数handlers
因为Python 3.3,用相同的格式器设置多个处理程序时,这简化记录设置很多,尤其是:
handlers
-如果指定,这应该是已经创建的处理程序可迭代添加到根记录。 这不已经有一个格式设置的任何处理程序将被分配在这个函数创建的默认格式。
因此,从接受的答案相当长的和详细的示例代码就像变成这样:
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()
])
(或者与import sys
+ StreamHandler(sys.stdout)
每原题的要求。)
为了得到记录器,使用
logger = logging.getLogger()
后来在脚本中,使用logger.info()
输出有用的日志信息。
添加StreamHandler中不带任何参数到stderr,而不是标准输出。 如果一些其他进程对标准输出转储的依赖(即编写一个插件NRPE时),那么请务必明确指定标准输出,或者你可能会遇到一些意想不到的麻烦。
这里有一个简单的例子,从再利用问题的假设值和日志文件:
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)
任一运行basicConfig
与stream=sys.stdout
如设置任何其他处理程序或记录任何消息,或手动添加之前的论点StreamHandler
是推动消息到stdout至根记录器(或所需的任何其他记录器,对于这个问题) 。
已经反复使用呆呆的代码在多个Python包后,我终于将它转换成一个微小的独立Python包,你可以在这里找到:
https://github.com/acschaefer/duallog
该代码是有据可查的,易于使用。 只需下载.py
文件,并将其包含在您的项目,或者通过安装全包pip install duallog
。
对于2.7,请尝试以下操作:
fh = logging.handlers.RotatingFileHandler(LOGFILE, maxBytes=(1048576*5), backupCount=7)