Python日誌(logging)模塊使用方法簡介

介紹
A logger is configured to have a log level . This log level describes the severity of the messages that the logger will handle. Python defines the following log levels:

§  DEBUG :  Low  level  system  information  for  debugging  purposes
§  INFO :  General  system  information
§  WARNING :  Information  describing  a  minor  problem  that  has  occurred.
§  ERROR :  Information  describing  a  major  problem  that  has  occurred.
§  CRITICAL :  Information  describing  a  critical  problem  that  has  occurred.
Each  message  that  is  written  to  the  logger  is  a  Log  Record .  Each  log  record  also  has  a  log  level  indicating  the  severity  of  that  specific  message.  A  log  record  can  also  contain  useful  metadata  that  describes  the  event  that  is  being  logged.  This  can  include  details  such  as  a  stack  trace  or  an  error  code.

When  a  message  is  given  to  the  logger,  the  log  level  of  the  message  is  compared  to  the  log  level  of  the  logger.  If  the  log  level  of  the  message  meets  or  exceeds  the  log  level  of  the  logger  itself,  the  message  will  undergo  further  processing.  If  it  doesn ' t,  the  message  will  be  ignored.

Once  a  logger  has  determined  that  a  message  needs  to  be  processed,  it  is  passed  to  a  Handler .
簡單的範例

#-*-  coding:  utf -8  -*-
import  logging
"""logging的簡單使用示例
"""
 
if  __name__  ==  '__main__' :
    
    #  最簡單的用法,不推薦直接用logging模塊
    logging.debug(u '這個不會被打印出來' )
    logging.info(u '這個也不會被打印出來' )
    logging.warning(u '這個就會了,因為logging默認的級別是WARNING,低於這個等級的信息就會被忽略' )


稍微難一點的範例
#-*- coding: utf -8 -*- import logging """logging的使用示例 """ if __name__ == '__main__' : # python 官方文檔中提供的一段示例,使用logging模塊產生logger對象 FORMAT = '%( asctime )-15s %( clientip )s %(user)-8s %(message)s' logging.basicConfig(format = FORMAT) d = { 'clientip' : '192.168.0.1' , 'user' : 'fbloggs' } # 創建一個日誌對象 logger = logging.getLogger( 'tcpserver' ) logger.warning( 'Protocol problem: %s' , 'connection reset' , extra = d) # 設置級別 logger.setLevel(logging.DEBUG) logger.debug( 'Hello' , extra = d)
複雜一點的用法,為logger 添加了若干個handler 。

#-*-  coding:  utf -8  -*-
import  logging ,  logging.config
"""logging的使用示例
"""
 
if  __name__  ==  '__main__' :
    
    #  比較複雜的用法
    LOGGING  =  {
               #  版本,總是1
               'version' :  1 ,
               'disable_existing_loggers' :  True ,
               'formatters' :  {
                              'verbose' :  { 'format' :  '%( levelname )s  %( asctime )s  %(module)s  %(process)d  %(thread)d  %(message)s' },
                               'simple' :  { 'format' :  '%( levelname )s  %(message)s' },
                               'default' :  {
                                           'format'  :  '%( asctime )s  %(message)s' ,
                                           'datefmt'  :  '%Y-%m-%d  %H:%M:%S'
                                }
                },
               'handlers' :  {
                            'null' :  {
                                     'level' : 'DEBUG' ,
                                     'class' : 'logging.NullHandler' ,
                            },
                            'console' :{
                                       'level' : 'DEBUG' ,
                                       'class' : 'logging.StreamHandler' ,
                                       'formatter' :  'default'
                            },
                            'file' :  {
                                     'level' :  'INFO' ,
                                     #  TimedRotatingFileHandler 會將日誌按一定時間間隔寫入文件中,並
                                     #  將文件重命名為'原文件名​​+時間戮'這樣的形式
                                     #  Python 提供了其它的handler,參考logging.handlers
                                     'class' :  'logging.handlers.TimedRotatingFileHandler ' ,
                                     'formatter' :  'default' ,
                                     #  後面這些會以參數的形式傳遞給TimedRotatingFileHandler 的
                                     #  構造器
 
                                     #  filename所在的目錄要確保存在
                                     'filename'  :  'log' ,
                                     #  每5分鐘刷新一下
                                     'when'  :  'M' ,
                                     'interval'  :  1 ,
                                     'encoding'  :  'utf8' ,
                            }
                },
               'loggers'  :  {
                            #  定義了一個logger
                            'mylogger'  :  {
                                          'level'  :  'DEBUG' ,
                                          'handlers'  :  [ 'console' ,  'file' ],
                                          'propagate'  :  True
                            }
                } 
    }
    logging.config.dictConfig(LOGGING)
    logger  =  logging.getLogger( 'mylogger' )
    logger.info( 'Hello' )
另外,還可以通過配置文件來配置logging ,方法如下:

配置文件(log_conf ):
[loggers]
keys=root, mylogger
 
[handlers]
keys=null,console,file
 
[formatters]
keys=verbose,simple,default
 
[formatter_verbose]
format=%( levelname )s  %( asctime )s  %(module)s  %(process)d  %(thread)d  %(message)s
datefmt =
class=logging.Formatter
 
[formatter_simple]
format=%( levelname )s  %(message)s
datefmt =
class=logging.Formatter
 
[formatter_default]
format=%( asctime )s  %(message)s
datefmt =%Y-%m-%d  %H:%M:%S
class=logging.Formatter
 
[logger_mylogger]
level=DEBUG
handlers=console,file
propagate=1
qualname =
 
[logger_root]
level=NOTSET
handlers=
 
[handler_null]
class=NullHandler
level=DEBUG
args =()
 
[handler_console]
class=StreamHandler
level=DEBUG
args =()
 
[handler_file]
class=handlers.TimedRotatingFileHandler
level=INFO
formatter=default
args =('log','M',1,0,'utf8')
 
Python 代碼:
#-*-  coding:  utf -8  -*-
import  logging ,  logging.config
"""logging的使用示例
"""
 
if  __name__  ==  '__main__' :
    
    #  使用配置文件
    logging.config.fileConfig( 'log_conf' )
    logger  =  logging.getLogger( 'mylogger' )
    logger.info( 'Hello' )

留言

這個網誌中的熱門文章

Json概述以及python對json的相關操作

遠程控制管理工具ipmitool

從Kubernetes到Cloud Native——雲原生應用之路