python类库31[logging]

 

一 简单使用

def  TestLogBasic():
    
import  logging 
    logging.basicConfig(filename 
=   ' log.txt ' , filemode  =   ' a ' , level  =  logging.NOTSET, format  =   ' %(asctime)s - %(levelname)s: %(message)s ' )
    logging.debug(
' this is a message ' )
    logging.info(
" this is a info " )
    logging.disable(
30 ) # logging.WARNING
    logging.warning( " this is a warnning " )
    logging.critical(
" this is a critical issue " )
    logging.error(
" this is a error " )
    logging.addLevelName(
88 , " MyCustomError " )
    logging.log(
88 , " this is an my custom error " )
    
try :
      
raise  Exception( ' this is a exception ' )
    
except :
      logging.exception( 
' exception ' )
    logging.shutdown()

TestLogBasic()

说明:(此实例为最简单的用法,用来将log记录到log文件中)

1)logging.basicConfig()中定义默认的log到log.txt,log文件为append模式,处理所有的level大于logging.NOTSET的logging,log的格式定义为'%(asctime)s - %(levelname)s: %(message)s'

2)使用logging.debug()...等来log相应level的log;

3)使用logging.disable()来disable某个logging level;

4)使用logging.addLevelName增加自定义的logging level;

5)使用logging.log来log自定义的logging level的log;

 

输出的text的log如下:

2011-01-18 10:02:45,415 - DEBUG: this is a message
2011-01-18 10:02:45,463 - INFO: this is a info
2011-01-18 10:02:45,463 - CRITICAL: this is a critical issue
2011-01-18 10:02:45,463 - ERROR: this is a error
2011-01-18 10:02:45,463 - MyCustomError: this is an my custom error
2011-01-18 10:02:45,463 - ERROR: exception
Traceback (most recent call last):
  File "testlog.py", line 15, in TestLogBasic
    raise Exception('this is a exception')
Exception: this is a exception

 

二 logging的level

# logging level 
# logging . NOTSET  0
# logging . DEBUG   10
# logging . INFO  20
# logging . WARNING  30  
# logging . ERROR  40  
# logging . CRITICAL  50

logging的level对应于一个int,例如10,20...用户可以自定义logging的level。

可以使用logging.setLevel()来指定要处理的logger级别,例如my_logger.setLevel(logging.DEBUG)表示只处理logging的level大于10的logging。
 

三 Handlers

Handler定义了log的存储和显示方式。

 

NullHandler 不做任何事情。

StreamHandler实例发送错误到流(类似文件的对象)。
FileHandler实例发送错误到磁盘文件。
BaseRotatingHandler是所有轮徇日志的基类,不能直接使用。但是可以使用RotatingFileHandler和TimeRotatingFileHandler。
RotatingFileHandler实例发送信息到磁盘文件,并且限制最大的日志文件大小,并适时轮徇。
TimeRotatingFileHandler实例发送错误信息到磁盘,并在适当的事件间隔进行轮徇。
SocketHandler实例发送日志到TCP/IP socket。
DatagramHandler实例发送错误信息通过UDP协议。
SMTPHandler实例发送错误信息到特定的email地址。
SysLogHandler实例发送日志到UNIX syslog服务,并支持远程syslog服务。
NTEventLogHandler实例发送日志到WindowsNT/2000/XP事件日志。
MemoryHandler实例发送日志到内存中的缓冲区,并在达到特定条件时清空。
HTTPHandler实例发送错误信息到HTTP服务器,通过GET或POST方法。


NullHandler,StreamHandler和FileHandler类都是在核心logging模块中定义的。其他handler定义在各个子模块中,叫做logging.handlers。

当然还有一个logging.config模块提供了配置功能。

 

四 FileHandler + StreamHandler

def  TestHanderAndFormat():
    
import  logging
    logger 
=  logging.getLogger( " simple " )
    logger.setLevel(logging.DEBUG)
    
    
#  create file handler which logs even debug messages
    fh  =  logging.FileHandler( " simple.log " )
    fh.setLevel(logging.DEBUG)
    
    
#  create console handler with a higher log level
    ch  =  logging.StreamHandler()
    ch.setLevel(logging.ERROR)
    
    
#  create formatter and add it to the handlers
    formatter  =  logging.Formatter( " %(asctime)s - %(name)s - %(levelname)s - %(message)s " )
    ch.setFormatter(formatter)
    fh.setFormatter(formatter)
    
    
#  add the handlers to logger
    logger.addHandler(ch)
    logger.addHandler(fh)

    
#  "application" code
    logger.debug( " debug message " )
    logger.info(
" info message " )
    logger.warn(
" warn message " )
    logger.error(
" error message " )
    logger.critical(
" critical message " )

TestHanderAndFormat()

 

说明:(此实例同时使用FileHandler和StreamHandler来实现同时将log写到文件和console)

1)使用logging.getLogger()来新建命名logger;

2)使用logging.FileHandler()来生成FileHandler来将log写入log文件,使用logger.addHandler()将handler与logger绑定;

3)使用logging.StreamHandler()来生成StreamHandler来将log写到console,使用logger.addHandler()将handler与logger绑定;

4)使用logging.Formatter()来构造log格式的实例,使用handler.setFormatter()来将formatter与handler绑定;

 

运行结果

simple.txt

2011-01-18 11:25:57,026 - simple - DEBUG - debug message
2011-01-18 11:25:57,072 - simple - INFO - info message
2011-01-18 11:25:57,072 - simple - WARNING - warn message
2011-01-18 11:25:57,072 - simple - ERROR - error message
2011-01-18 11:25:57,072 - simple - CRITICAL - critical message

 

console

2011-01-18 11:25:57,072 - simple - ERROR - error message
2011-01-18 11:25:57,072 - simple - CRITICAL - critical message

 

五 RotatingFileHandler

def  TestRotating():
    
import  glob
    
import  logging
    
import  logging.handlers
    
    LOG_FILENAME 
=   ' logging_rotatingfile_example.out '

    
#  Set up a specific logger with our desired output level
    my_logger  =  logging.getLogger( ' MyLogger ' )
    my_logger.setLevel(logging.DEBUG)

    
#  Add the log message handler to the logger
    handler  =  logging.handlers.RotatingFileHandler(LOG_FILENAME, maxBytes = 20 , backupCount = 5 )

    my_logger.addHandler(handler)

    
#  Log some messages
     for  i  in  range( 20 ):
        my_logger.debug(
' i = %d '   %  i)

    
#  See what files are created
    logfiles  =  glob.glob( ' %s* '   %  LOG_FILENAME)

    
for  filename  in  logfiles:
        
print (filename)
        
TestRotating()

 

说明:

RotatingFileHandler指定了单个log文件的size的最大值和log文件的数量的最大值,如果文件大于最大值,将分割为多个文件,如果log文件的数量多于最多个数,最老的log文件将被删除。例如此例中最新的log总是在logging_rotatingfile_example.out,logging_rotatingfile_example.out.5中包含了最老的log。

 

运行结果:

logging_rotatingfile_example.out
logging_rotatingfile_example.out.1
logging_rotatingfile_example.out.2
logging_rotatingfile_example.out.3
logging_rotatingfile_example.out.4
logging_rotatingfile_example.out.5

 

六 使用fileConfig来使用logger

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.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
propagate
= 0

[handler_consoleHandler]
class = StreamHandler
level
= DEBUG
formatter
= simpleFormatter
args
= (sys.stdout,)

[formatter_simpleFormatter]
format
=% (asctime)s  -   % (name)s  -   % (levelname)s  -   % (message)s
datefmt
=

 

运行结果:

2005-03-19 15:38:55,977 - simpleExample - DEBUG - debug message
2005-03-19 15:38:55,979 - simpleExample - INFO - info message
2005-03-19 15:38:56,054 - simpleExample - WARNING - warn message
2005-03-19 15:38:56,055 - simpleExample - ERROR - error message
2005-03-19 15:38:56,130 - simpleExample - CRITICAL - critical message

 

 

参考:

http://gashero.yeax.com/?p=16

http://www.cnblogs.com/yangze/archive/2010/12/21/1912377.html

 

完!

 

你可能感兴趣的:(logging)