一、簡單使用
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
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
