国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > JS > 正文

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

2024-05-06 16:34:10
字體:
供稿:網(wǎng)友

前言

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

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

我們?cè)谝粋€(gè)模塊內(nèi),就可以這么使用來記錄日志

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

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

按照官方文檔的介紹,logging 是線程安全的,也就是說,在一個(gè)進(jìn)程內(nèi)的多個(gè)線程同時(shí)往同一個(gè)文件寫日志是安全的。但是(對(duì),這里有個(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é)

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


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到JavaScript/Ajax教程頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 扶余县| 兴安盟| 怀来县| 茂名市| 松江区| 忻城县| 景德镇市| 德清县| 桂东县| 资源县| 历史| 家居| 大荔县| 安吉县| 彩票| 邹平县| 永州市| 太和县| 灵璧县| 西昌市| 虎林市| 红原县| 宜兴市| 昭平县| 建阳市| 亚东县| 克什克腾旗| 鸡泽县| 高安市| 博白县| 龙游县| 新兴县| 望城县| 新密市| 会同县| 英德市| 遂昌县| 德兴市| 什邡市| 卓资县| 阳新县|