Python标准库中的logging模块


     1.将日志输出到屏幕
import  logging

logging.debug('This  is  debug  message')
logging.info('This  is  info  message')
logging.warning('This  is  warning  message')

        屏幕上只打印:
        WARNING:root:This  is  warning  message
        默认情况下,logging将日志打印到屏幕,日志级别为WARNING;  日志级别大小关系为:CRITICAL  >  ERROR  >  WARNING  >  INFO  >  DEBUG  >  NOTSET。
        可以自己定义日志级别(见下面例子)。

        2.通过logging.basicConfig函数对日志的输出格式及方式做相关配置
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='mytest.log',
                                filemode='w')

logging.debug('This  is  debug  message')
logging.info('This  is  info  message')
logging.warning('This  is  warning  message')

        找到./myapp.log文件,打开。内容为:
Sat,  31  Mar  2018  17:29:33  loggingtest.py[line:10]  DEBUG  This  is  debug  message
Sat,  31  Mar  2018  17:29:33  loggingtest.py[line:11]  INFO  This  is  info  message
Sat,  31  Mar  2018  17:29:33  loggingtest.py[line:12]  WARNING  This  is  warning  message
        logging.basicConfig函数各参数:
        filename:  指定日志文件名
        filemode:  和file函数意义相同,指定日志文件的打开模式,'w'或'a'
        format:  指定输出的格式和内容,format可以输出很多有用信息,如上例所示:
        %(levelno)s:  打印日志级别的数值
        %(levelname)s:  打印日志级别名称
        %(pathname)s:  打印当前执行程序的路径,其实就是sys.argv[0]
        %(filename)s:  打印当前执行程序名
        %(funcName)s:  打印日志的当前函数
        %(lineno)d:  打印日志的当前行号
        %(asctime)s:  打印日志的时间
        %(thread)d:  打印线程ID
        %(threadName)s:  打印线程名称
        %(process)d:  打印进程ID
        %(message)s:  打印日志信息
        datefmt:  指定时间格式,同time.strftime()
        level:  设置日志级别,默认为logging.WARNING
        stream:  指定将日志的输出流,可以指定输出到sys.stderr,sys.stdout或者文件,默认输出到sys.stderr,当stream和filename同时指定时,stream被忽略

        3.将日志同时输出到文件和屏幕
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='myapp.log',
                                filemode='w')

#定义一个StreamHandler,将INFO级别或更高的日志信息打印到标准错误,并将其添加到当前的日志处理对象#
console  =  logging.StreamHandler()
console.setLevel(logging.INFO)
formatter  =  logging.Formatter('%(name)-12s:  %(levelname)-8s  %(message)s')
console.setFormatter(formatter)
logging.getLogger('').addHandler(console)

logging.debug('This  is  debug  message')
logging.info('This  is  info  message')
logging.warning('This  is  warning  message')

屏幕上打印:
交互  Python  进程已退出。
root                :  DEBUG        This  is  debug  message
root                :  INFO          This  is  info  message
root                :  WARNING    This  is  warning  message

        ./myapp.log文件中内容为:
Sat,  31  Mar  2018  17:41:11  loggingtest.py[line:16]  DEBUG  This  is  debug  message
Sat,  31  Mar  2018  17:41:11  loggingtest.py[line:17]  INFO  This  is  info  message
Sat,  31  Mar  2018  17:41:11  loggingtest.py[line:18]  WARNING  This  is  warning  message

        4.logging之日志回滚

import  logging
from  logging.handlers  import  RotatingFileHandler

#定义一个RotatingFileHandler,最多备份5个日志文件,每个日志文件最大10M
Rthandler  =  RotatingFileHandler('myapp.log',  maxBytes=10*1024*1024,backupCount=5)
Rthandler.setLevel(logging.INFO)
formatter  =  logging.Formatter('%(name)-12s:  %(levelname)-8s  %(message)s')
Rthandler.setFormatter(formatter)
logging.getLogger('').addHandler(Rthandler)

        从上例和本例可以看出,logging有一个日志处理的主对象,其它处理方式都是通过addHandler添加进去的。
  
        logging的几种handle方式如下:
        logging.StreamHandler:  日志输出到流,可以是sys.stderr、sys.stdout或者文件
        logging.FileHandler:  日志输出到文件
        日志回滚方式,实际使用时用RotatingFileHandler和TimedRotatingFileHandler
        logging.handlers.BaseRotatingHandler
        logging.handlers.RotatingFileHandler
        logging.handlers.TimedRotatingFileHandler
        logging.handlers.SocketHandler:  远程输出日志到TCP/IP  sockets
        logging.handlers.DatagramHandler:  远程输出日志到UDP  sockets
        logging.handlers.SMTPHandler:  远程输出日志到邮件地址
        logging.handlers.SysLogHandler:  日志输出到syslog  
        logging.handlers.NTEventLogHandler:  远程输出日志到Windows  NT/2000/XP的事件日志  
        logging.handlers.MemoryHandler:  日志输出到内存中的制定buffer
        logging.handlers.HTTPHandler:  通过"GET"或"POST"远程输出到HTTP服务器

        由于StreamHandler和FileHandler是常用的日志处理方式,所以直接包含在logging模块中,而其他方式则包含在logging.handlers模块中,上述其它处理方式的使用请参见python手册!

        5.通过logging.config模块配置日志

#logger.conf

[loggers]
keys=root,example01,example02
[logger_root]
level=DEBUG
handlers=hand01,hand02
[logger_example01]
handlers=hand01,hand02
qualname=example01
propagate=0
[logger_example02]
handlers=hand01,hand03
qualname=example02
propagate=0

[handlers]
keys=hand01,hand02,hand03
[handler_hand01]
class=StreamHandler
level=INFO
formatter=form02
args=(sys.stderr,)
[handler_hand02]
class=FileHandler
level=DEBUG
formatter=form01
args=('mytest.log',  'a')
[handler_hand03]
class=handlers.RotatingFileHandler
level=INFO
formatter=form02
args=('mytest.log',  'a',  10*1024*1024,  5)

[formatters]
keys=form01,form02
[formatter_form01]
format=%(asctime)s  %(filename)s[line:%(lineno)d]  %(levelname)s  %(message)s
datefmt=%a,  %d  %b  %Y  %H:%M:%S
[formatter_form02]
format=%(name)-12s:  %(levelname)-8s  %(message)s
datefmt=

使用logger.conf例子:

import  logging
import  logging.config

logging.config.fileConfig("logger.conf")
logger  =  logging.getLogger("example01")

logger.debug('This  is  debug  message')
logger.info('This  is  info  message')
logger.warning('This  is  warning  message')


import  logging
import  logging.config

logging.config.fileConfig("logger.conf")
logger  =  logging.getLogger("example02")

logger.debug('This  is  debug  message')
logger.info('This  is  info  message')
logger.warning('This  is  warning  message')

        logging是线程安全的

        6.记录异常信息

        当你使用logging模块记录异常信息时,不需要传入该异常对象,只要你直接调用logger.error()  或者  logger.exception()就可以将当前异常记录下来。

#  记录异常信息
  
try:
        1  /  0
except:
        #  等同于error级别,但是会额外记录当前抛出的异常堆栈信息
        logger.exception('this  is  an  exception  message')


        7.GetLogger()方法

        这是最基本的入口,该方法参数可以为空,默认的logger名称是root,如果在同一个程序中一直都使用同名的logger,其实会拿到同一个实例,使用这个技巧就可以跨模块调用同样的logger来记录日志。
另外你也可以通过日志名称来区分同一程序的不同模块,比如这个例子。
        logger  =  logging.getLogger("App.UI")
        logger  =  logging.getLogger("App.Service")
 

猜你喜欢

转载自blog.csdn.net/www_rsqdz_net/article/details/79773056