Making Python loggers output all messages to stdout in addition to log file
有没有办法使用
1 2 | mylogger.critical("something failed") print"something failed" |
所有日志记录输出都由处理程序处理;只需将
以下是配置流处理程序(使用
1 2 3 4 5 6 7 8 9 10 11 | import logging import sys root = logging.getLogger() root.setLevel(logging.DEBUG) handler = logging.StreamHandler(sys.stdout) handler.setLevel(logging.DEBUG) formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') handler.setFormatter(formatter) root.addHandler(handler) |
记录到stdout的最简单方法:
1 2 3 | import logging import sys logging.basicConfig(stream=sys.stdout, level=logging.DEBUG) |
可以使用多个处理程序。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | import logging import auxiliary_module # create logger with 'spam_application' log = logging.getLogger('spam_application') log.setLevel(logging.DEBUG) # create formatter and add it to the handlers formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') # create file handler which logs even debug messages fh = logging.FileHandler('spam.log') fh.setLevel(logging.DEBUG) fh.setFormatter(formatter) log.addHandler(fh) # create console handler with a higher log level ch = logging.StreamHandler() ch.setLevel(logging.ERROR) ch.setFormatter(formatter) log.addHandler(ch) log.info('creating an instance of auxiliary_module.Auxiliary') a = auxiliary_module.Auxiliary() log.info('created an instance of auxiliary_module.Auxiliary') log.info('calling auxiliary_module.Auxiliary.do_something') a.do_something() log.info('finished auxiliary_module.Auxiliary.do_something') log.info('calling auxiliary_module.some_function()') auxiliary_module.some_function() log.info('done with auxiliary_module.some_function()') # remember to close the handlers for handler in log.handlers: handler.close() log.removeFilter(handler) |
请参阅:https://docs.python.org/2/howto/logging-cookbook.html
您可以为file和stdout创建两个处理程序,然后创建一个记录器,其中
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | import logging import sys file_handler = logging.FileHandler(filename='tmp.log') stdout_handler = logging.StreamHandler(sys.stdout) handlers = [file_handler, stdout_handler] logging.basicConfig( level=logging.DEBUG, format='[%(asctime)s] {%(filename)s:%(lineno)d} %(levelname)s - %(message)s', handlers=handlers ) logger = logging.getLogger('LOGGER_NAME') |
记录到文件和stderr的最简单方法:
1 2 3 4 5 6 | import logging logging.basicConfig(filename="logfile.txt") stderrLogger=logging.StreamHandler() stderrLogger.setFormatter(logging.Formatter(logging.BASIC_FORMAT)) logging.getLogger().addHandler(stderrLogger) |
这是一个基于功能强大但文档记录不足的
它不是将每条日志消息发送到stdout,而是将日志级别
如果系统的其他部分正在侦听
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | import logging import logging.config import sys class _ExcludeErrorsFilter(logging.Filter): def filter(self, record): """Filters out log messages with log level ERROR (numeric value: 40) or higher.""" return record.levelno < 40 config = { 'version': 1, 'filters': { 'exclude_errors': { '()': _ExcludeErrorsFilter } }, 'formatters': { # Modify log message format here or replace with your custom formatter class 'my_formatter': { 'format': '(%(process)d) %(asctime)s %(name)s (line %(lineno)s) | %(levelname)s %(message)s' } }, 'handlers': { 'console_stderr': { # Directs log messages with log level ERROR or higher to stderr 'class': 'logging.StreamHandler', 'level': 'ERROR', 'formatter': 'my_formatter', 'stream': sys.stderr }, 'console_stdout': { # Directs log messages with log level lower than ERROR to stdout 'class': 'logging.StreamHandler', 'level': 'DEBUG', 'formatter': 'my_formatter', 'filters': ['exclude_errors'], 'stream': sys.stdout }, 'file': { # Directs all log messages to a file 'class': 'logging.FileHandler', 'level': 'DEBUG', 'formatter': 'my_formatter', 'filename': 'my.log', 'encoding': 'utf8' } }, 'root': { # In general, this should be kept at 'NOTSET' to ensure it does # not interfere with the log levels set for each handler 'level': 'NOTSET', 'handlers': ['console_stderr', 'console_stdout', 'file'] }, } logging.config.dictConfig(config) |
由于没有人分享一个整洁的两个班轮,我将分享我自己的:
1 2 | logging.basicConfig(filename='logs.log', level=logging.DEBUG, format="%(asctime)s:%(levelname)s: %(message)s") logging.getLogger().addHandler(logging.StreamHandler()) |
这是一个非常简单的例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 | import logging l = logging.getLogger("test") # Add a file logger f = logging.FileHandler("test.log") l.addHandler(f) # Add a stream logger s = logging.StreamHandler() l.addHandler(s) # Send a test message to both -- critical will always log l.critical("test msg") |
输出将在stdout和文件中显示"test msg"。