本作品采用知识共享署名-非商业性使用-相同方式共享 3.0 Unported许可协议进行许可。允许非商业转载,但应注明作者及出处。
作者:liuyuan_jq
2011-03-30
创建日志对象
# 创建一个日志对象,可以带一个名字,可以缺省 root_logger = logging.getLogger('')
设置日志级别
# 设置日志级别,小于指定级别的信息被忽略,缺省: logging.WARNING root_logger.setLevel(logging.DEBUG)
创建控制台日志处理器
# 创建一个Handler日志处理器 console = logging.StreamHandler(sys.stderr) console_format = '%(message)s' # 创建一个日志格式器,规范日志的输出格式,缺省为:%(messages)s # 将格式器绑定到处理器上 console.setFormatter(logging.Formatter(console_format)) # 设置控制台显示级别 console.setLevel(logging.INFO) # TODO: command line switch # 将处理器绑定到日志对象上 root_logger.addHandler(console)
创建文件日志处理器
# RotatingFileHandler 发送信息到磁盘文件,并且限制最大的日志文件大小,并适时轮徇 file_handler = logging.handlers.RotatingFileHandler( 'logging_example.log', # use a full path ) file_format = '%(asctime)s %(levelname)6s %(name)s %(message)s' file_handler.setFormatter(logging.Formatter(file_format)) file_handler.setLevel(logging.DEBUG) root_logger.addHandler(file_handler)
发送日志
################################################################################ # 返回一个logger,可以指定名字,如果没有指定名字则返回根logger。 # 指定的名字典型的为以点分隔的分层次的名字。 # 选择一个恰当的名字,让别人知道,谁在输出日志。 # 所有使用相同名字调用这个函数都会返回相同的logger实例。 #这意味着logger实例不需要在应用中到处传递。 ################################################################################ # Log sample messages with different levels log = logging.getLogger(__name__) log.info('on the console and in the file') log.debug('only in the file') log.error('simple error message')
运行结果
################################################################################ # 结果 # logging_example.log # 2011-03-30 10:17:40,104 INFO __main__ on the console and in the file # 2011-03-30 10:17:40,105 DEBUG __main__ only in the file # 2011-03-30 10:17:40,105 ERROR __main__ simple error message # 2011-03-30 10:17:40,106 ERROR __main__ failure message # console # on the console and in the file # simple error message # failure message ################################################################################
完整代码
#!/usr/bin/env python # encoding: utf-8 """Sending log output to a file and the console at the same time. """ import logging import logging.handlers import sys # Log verbosely # 创建一个日志对象,可以带一个名字,可以缺省 root_logger = logging.getLogger('') # 设置日志级别,小于指定级别的信息被忽略,缺省: logging.WARNING root_logger.setLevel(logging.DEBUG) ################################################################################ # Set up console output to stderr # 创建一个Handler日志处理器 console = logging.StreamHandler(sys.stderr) console_format = '%(message)s' # 创建一个日志格式器,规范日志的输出格式,缺省为:%(messages)s # 将格式器绑定到处理器上 console.setFormatter(logging.Formatter(console_format)) # 设置控制台显示级别 console.setLevel(logging.INFO) # TODO: command line switch # 将处理器绑定到日志对象上 root_logger.addHandler(console) ################################################################################ # Include debug messages when logging to a file # RotatingFileHandler 发送信息到磁盘文件,并且限制最大的日志文件大小,并适时轮徇 file_handler = logging.handlers.RotatingFileHandler( 'logging_example.log', # use a full path ) file_format = '%(asctime)s %(levelname)6s %(name)s %(message)s' file_handler.setFormatter(logging.Formatter(file_format)) file_handler.setLevel(logging.DEBUG) root_logger.addHandler(file_handler) ################################################################################ # 返回一个logger,可以指定名字,如果没有指定名字则返回根logger。 # 指定的名字典型的为以点分隔的分层次的名字。 # 选择一个恰当的名字,让别人知道,谁在输出日志。 # 所有使用相同名字调用这个函数都会返回相同的logger实例。 #这意味着logger实例不需要在应用中到处传递。 ################################################################################ # Log sample messages with different levels log = logging.getLogger(__name__) log.info('on the console and in the file') log.debug('only in the file') log.error('simple error message') # Replace excepthook with logger def log_exception(exc_type, exc_value, traceback): logging.getLogger(__name__).error(exc_value) sys.excepthook = log_exception # Send exceptions to the logger automatically raise RuntimeError('failure message') ################################################################################ # 结果 # logging_example.log # 2011-03-30 10:17:40,104 INFO __main__ on the console and in the file # 2011-03-30 10:17:40,105 DEBUG __main__ only in the file # 2011-03-30 10:17:40,105 ERROR __main__ simple error message # 2011-03-30 10:17:40,106 ERROR __main__ failure message # console # on the console and in the file # simple error message # failure message ################################################################################