Python:logging

logging 模塊是 python 中用於打印日誌。html

日誌系統有以下幾種等級:DEBUG INFO WARNING ERROR CRITICAL,默認等級是 WARNING。 python

簡單示例api

import logging
logging.warning('Watch out!')  # will print a message to the console
logging.info('I told you so')  # will not print anything

 輸出日誌到文件安全

import logging
logging.basicConfig(filename='example.log',level=logging.DEBUG)
logging.debug('This message should go to the log file')
logging.info('So should this')
logging.warning('And this, too')

 修改日誌打印格式app

import logging
logging.basicConfig(format='%(asctime)s %(message)s', datefmt='%m/%d/%Y %I:%M:%S %p')
logging.warning('is when this event was logged.')

datefmt 是可選參數。模塊化

logging 庫採用了模塊化方法,而且提供瞭如下幾種組件:函數

  • loggers 提供接口可供應用程序的代碼直接使用
  • handlers 將日誌記錄(由 loggers 建立)發送到適當的目標
  • filters 提供了更精細的設施,用於肯定要輸出的日誌記錄
  • formatters 指定最終輸出中日誌記錄的佈局

經過調用Logger類實例上的方法(如下稱爲 logger)來執行日誌記錄。每一個實例都有一個名稱,它們在概念上以點(句點)做爲分隔符排列在命名空間層次結構中。Logger 名稱能夠是您想要的任何名稱,並指示記錄消息源自的應用程序區域。佈局

命名 loggers 時使用的一個好習慣是在每一個使用日誌記錄的模塊中使用模塊級記錄器,命名以下: this

logger = logging.getLogger(__name__)

 Loggers 模塊經常使用的配置方法:Logger.setLevel( ) Logger.addHandler( ) Logger.removeHandler( ) Logger.addFilter( ) Logger.removeFilter( )spa

Handlers 模塊經常使用的實例有 StreamHandler FileHandler 等, 經常使用的配置方法有 setLevel( ) setFormatter( ) addFilter( ) removeFilter( )

Formatters 模塊中的 Formatter 對象配置日誌消息的最終順序,結構和內容。構造函數有兩個可選參數, 消息格式字符串和日期格式字符串。

logging.Formatter.__init__(fmt=None, datefmt=None)

 下面是一個實例:

import logging

# create logger
logger = logging.getLogger('simple_example')
logger.setLevel(logging.DEBUG)

# create console handler and set level to debug
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)

# create formatter
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

# add formatter to ch
ch.setFormatter(formatter)

# add ch to logger
logger.addHandler(ch)

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

 下面是從配置文件讀取日誌文件配置信息的示例:

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')

 這是 loggin.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=

配置文件能夠參考官方文檔。 

配置文件中必須包含的三個 section 是 [loggers] [handlers] [formatters],例如 loggers 中又包含一些  entity,例如 logger 中 log01 的 entity,它相應的 section 就是 [logger_log01],例如 [formatters] 中 form01 的 section 是 [formatter_form01]

能夠按照天來分割日誌文件,使用的 handler 是 logging.handlers 包下的 TimedRotatingFileHandler 類。參考文檔是在這裏

例以下面這個 handler 能夠按照每分鐘分割日誌文件。

# add time rotating file handler
th = logging.handlers.TimedRotatingFileHandler('my.log', when='M')
th.setLevel(logging.DEBUG)
th.setFormatter(formatter01)
logger.addHandler(th)

如何將上面的代碼轉化成配置呢?以下:

[handler_fileHandler]
class=handlers.TimedRotatingFileHandler
level=DEBUG
formatter=formatter01
args=('my.log', 'M')

logging 是線程安全的,在一個進程內的多個線程同時往同一個文件寫日誌是安全的。可是多個進程往同一個文件寫日誌是不安全的。

 

參考:

https://docs.python.org/2.7/library/logging.html

https://docs.python.org/2/howto/logging.html

相關文章
相關標籤/搜索