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 庫採用了模塊化方法,而且提供瞭如下幾種組件:函數
經過調用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 是線程安全的,在一個進程內的多個線程同時往同一個文件寫日誌是安全的。可是多個進程往同一個文件寫日誌是不安全的。
參考: