python-2-重定向输出logging模块

来源:互联网 发布:淘宝晒图内裤爆光图片 编辑:程序博客网 时间:2024/05/22 08:14

一、简单用法,打印到屏幕:

import logginglogging.debug('debug message')  logging.info('info message')  logging.warning('warning message')  logging.error('error message')  logging.critical('critical message')

由输入可以知道,默认情况下python的logging模块将日志打印到标准输出(屏幕sys.stdout),级别为warning,logger为root用户

(日志级别critical > error > warning > info > debug > notset)


二、升级用法

自定义输出,配置级别,格式,日志位置:

import logging  logging.basicConfig(level=logging.DEBUG,                      format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',                      datefmt='%a, %d %b %Y %H:%M:%S',                      filename='/tmp/test.log',                      filemode='w')    logging.debug('debug message')  logging.info('info message')  logging.warning('warning message')  logging.error('error message')  logging.critical('critical message')  


三、高级用法

用到logger,handler,formatter,filter等:


1、什么是logger?

每个输出都需要一个logger,没有显式指定,默认都是root logger,如第一个例子

logger=logging.getLogger()返回默认logger,即root logger


2、什么是handler?

a)streamHandler

流处理器,logging模块自带handler之一,能够将日志信息输出到sys.stdout,sys.stderr或者类文件对象(类文件对象:支持write()和flush()方法等方法的对象)

class logging.StreamHandler(stream=None)
日志会输出到指定的stream中,如果stream为空,则默认输出到sys.stderr。


b)FileHandler

文件处理器,logging模块自带handler之一,将日志输出到磁盘

class logging.FileHandler(filename,mode='a',encoding=None,delay=False)
默认模式为append,且文件可以无限增大


高级用法的典型步骤:

1)创建logger

2)创建handler

3)定义formatter

4)给handler添加formatter

5)给logger添加handler


import logging #1)创建一个logger logger = logging.getLogger('mylogger') logger.setLevel(logging.DEBUG) #2)创建一个handler,用于写入日志文件 fh = logging.FileHandler('test.log') fh.setLevel(logging.DEBUG) #再创建一个handler,用于输出到控制台 ch = logging.StreamHandler() ch.setLevel(logging.DEBUG) #3)定义handler的输出格式(formatter)formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') #4)给handler添加formatterfh.setFormatter(formatter) ch.setFormatter(formatter) #5)给logger添加handler logger.addHandler(fh) logger.addHandler(ch) 


四、通过写配置文件

让程序读取来使用logging模块,配置文件logging.conf

[loggers]  keys=root,simpleExample    [handlers]  keys=consoleHandler    [formatters]  keys=simpleFormatter    [logger_root]  level=DEBUG  handlers=consoleHandler    [logger_simpleExample]  level=DEBUG  handlers=consoleHandler  qualname=simpleExample  #完全通道名,用于非rootpropagate=0#0表示root,1表示非root的logger,继承于父logger[handler_consoleHandler]  class=StreamHandler  level=DEBUG  formatter=simpleFormatter  args=(sys.stdout,)    [formatter_simpleFormatter]  format=%(asctime)s - %(name)s - %(levelname)s - %(message)s  datefmt=


程序

import logging    import logging.config        logging.config.fileConfig("logging.conf")    # 采用配置文件         # create logger     logger = logging.getLogger("simpleExample")        # "application" code     logger.debug("debug message")    logger.info("info message")    logger.warn("warn message")    logger.error("error message")    logger.critical("critical message")


五、多模块使用logging
logging模块保证在同一个解释器中,多次调用logging.getLogger('log_name')都会返回同一个logger实例,即使在多模块情况下也是如此。
所以在多模块场景下使用logging,应该在main模块中配置logging,这个配置会作用于多个子模块,在这些子模块中可以直接通过getLogger获取Logger对象。


main.py


import logging    import logging.config        logging.config.fileConfig('logging.conf')    root_logger = logging.getLogger('root')    root_logger.debug('test root logger...')        logger = logging.getLogger('main')    logger.info('test main logger')    logger.info('start import module \'mod\'...')    import mod        logger.debug('let\'s test mod.testLogger()')    mod.testLogger()        root_logger.info('finish test...')

子模块mod.py:


import logging    import submod        logger = logging.getLogger('main.mod')    logger.info('logger of mod say something...')        def testLogger():        logger.debug('this is mod.testLogger...')        submod.tst()


子子模块submod.py:

import logging        logger = logging.getLogger('main.mod.submod')    logger.info('logger of submod say something...')        def tst():        logger.info('this is submod.tst()...')