欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解Python中l(wèi)ogging日志模塊在多進(jìn)程環(huán)境下的使用

 更新時(shí)間:2016年12月26日 16:00:56   作者:strivescript  
許多應(yīng)用程序中都會(huì)有日志模塊,用于記錄系統(tǒng)在運(yùn)行過程中的一些關(guān)鍵信息,以便于對系統(tǒng)的運(yùn)行狀況進(jìn)行跟蹤。這篇文章給大家主要介紹了在Python中l(wèi)ogging日志模塊在多進(jìn)程環(huán)境下的使用,需要的朋友可以參考借鑒,下面來一起看看吧。

前言

相信每位程序員應(yīng)該都知道,在使用 Python 來寫后臺任務(wù)時(shí),時(shí)常需要使用輸出日志來記錄程序運(yùn)行的狀態(tài),并在發(fā)生錯(cuò)誤時(shí)將錯(cuò)誤的詳細(xì)信息保存下來,以別調(diào)試和分析。Python 的 logging 模塊就是這種情況下的好幫手。

logging 模塊可以指定日志的級別,DEBUG、INFO、WARNING、ERROR、CRITICAL,例如可以在開發(fā)和調(diào)試時(shí),把 DEBUG 以上級別的日志都輸出,而在生產(chǎn)環(huán)境下,只輸出 INFO 級別。(如果不特別指定,默認(rèn)級別是 warning)

logging 還可以指定輸出到命令行或者文件,還可以按時(shí)間或大小分割日志文件。

關(guān)于 logging 的詳細(xì)使用,這里就不再細(xì)說,可以參考官方文檔,或者這里的介紹。

logging 的配置

通常情況下,我們需要將日志保存到文件中,并期望能自動(dòng)分割文件,避免日志文件太大。下面給出了一個(gè) logging 的配置例子。

import logging.config
 
logging.config.dictConfig({
 'version': 1,
 'disable_existing_loggers': True,
 'formatters': {
  'verbose': {
   'format': "[%(asctime)s] %(levelname)s [%(name)s:%(lineno)s] %(message)s",
   'datefmt': "%Y-%m-%d %H:%M:%S"
  },
  'simple': {
   'format': '%(levelname)s %(message)s'
  },
 },
 'handlers': {
  'null': {
   'level': 'DEBUG',
   'class': 'logging.NullHandler',
  },
  'console': {
   'level': 'DEBUG',
   'class': 'logging.StreamHandler',
   'formatter': 'verbose'
  },
  'file': {
   'level': 'DEBUG',
   'class': 'logging.RotatingFileHandler',
   # 當(dāng)達(dá)到10MB時(shí)分割日志
   'maxBytes': 1024 * 1024 * 10,
   # 最多保留50份文件
   'backupCount': 50,
   # If delay is true,
   # then file opening is deferred until the first call to emit().
   'delay': True,
   'filename': 'logs/mysite.log',
   'formatter': 'verbose'
  }
 },
 'loggers': {
  '': {
   'handlers': ['file'],
   'level': 'info',
  },
 }
})

我們在一個(gè)模塊內(nèi),就可以這么使用來記錄日志

import logging
logger = logging.getLogger(__name__)
 
if __name__ == '__main__':
 logger.info('log info')

多進(jìn)程環(huán)境下的使用

按照官方文檔的介紹,logging 是線程安全的,也就是說,在一個(gè)進(jìn)程內(nèi)的多個(gè)線程同時(shí)往同一個(gè)文件寫日志是安全的。但是(對,這里有個(gè)但是)多個(gè)進(jìn)程往同一個(gè)文件寫日志不是安全的。官方的說法是這樣的:

Because there is no standard way to serialize access to a single file across multiple processes in Python. If you need to log to a single file from multiple processes, one way of doing this is to have all the processes log to a SocketHandler, and have a separate process which implements a socket server which reads from the socket and logs to file. (If you prefer, you can dedicate one thread in one of the existing processes to perform this function.)

有的人會(huì)說,那我不用多進(jìn)程不就可以了。但是 Python 有一個(gè) GIL 的大鎖(關(guān)于 GIL 的糾葛可以看這里),使用多線程是沒法利用到多核 CPU 的,大部分情況下會(huì)改用多進(jìn)程來利用多核 CPU,因此我們還是繞不開不開多進(jìn)程下日志的問題。

為了解決這個(gè)問題,可以使用 ConcurrentLogHandler,ConcurrentLogHandler 可以在多進(jìn)程環(huán)境下安全的將日志寫入到同一個(gè)文件,并且可以在日志文件達(dá)到特定大小時(shí),分割日志文件。在默認(rèn)的 logging 模塊中,有個(gè) TimedRotatingFileHandler 類,可以按時(shí)間分割日志文件,可惜 ConcurrentLogHandler 不支持這種按時(shí)間分割日志文件的方式。

重新修改下 handlers 中的 class。

logging.config.dictConfig({
 ...
 'handlers': {
  'file': {
   'level': 'DEBUG',
   # 如果沒有使用并發(fā)的日志處理類,在多實(shí)例的情況下日志會(huì)出現(xiàn)缺失
   'class': 'cloghandler.ConcurrentRotatingFileHandler',
   # 當(dāng)達(dá)到10MB時(shí)分割日志
   'maxBytes': 1024 * 1024 * 10,
   # 最多保留50份文件
   'backupCount': 50,
   # If delay is true,
   # then file opening is deferred until the first call to emit().
   'delay': True,
   'filename': 'logs/mysite.log',
   'formatter': 'verbose'
  }
 },
 ...
})

運(yùn)行后可以發(fā)現(xiàn),會(huì)自動(dòng)創(chuàng)建一個(gè).lock文件,通過鎖的方式來安全的寫日志文件。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家學(xué)習(xí)或者使用python能帶來一定的幫助,如果有疑問大家可以留言交流。

相關(guān)文章

最新評論