最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python 實(shí)現(xiàn)多進(jìn)程日志輪轉(zhuǎn)ConcurrentLogHandler

 更新時間:2021年03月15日 10:27:53   作者:qq_41864652  
這篇文章主要介紹了python 實(shí)現(xiàn)多進(jìn)程日志輪轉(zhuǎn)ConcurrentLogHandler,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

記錄日志是我們程序中必不可少的一個功能,但是日志文件如果沒有合理的管理,時間長了幾百兆的日志文件就很難分析了(都不想打開看),但是又不可能經(jīng)常手動去管理它

日志輪轉(zhuǎn):根據(jù)時間或者文件大小控制日志的文件個數(shù),不用我們手動管理

python中l(wèi)ogging模塊內(nèi)置的有幾個支持日志輪轉(zhuǎn)的handler

常用的有TimedRotatingFileHandler根據(jù)時間輪轉(zhuǎn) RotatingFileHandler根據(jù)文件大小輪轉(zhuǎn)

但是內(nèi)置的這些handler是多線程安全的,而不支持多進(jìn)程(可以修改源碼加鎖保證進(jìn)程安全)

多進(jìn)程的時候可以使用ConcurrentLogHandler(需要自行安裝)按照文件大小輪轉(zhuǎn)

pip install ConcurrentLogHandler

一、簡單的日志輪轉(zhuǎn)功能實(shí)現(xiàn):

#!/usr/bin/env python
# -*- coding: utf-8 -*- 
import os
import logging
from cloghandler import ConcurrentRotatingFileHandler
from config import LOG_PATH, LOG_FILENAME, LOG_MAX_BYTES
 
 
def create_logger(log_path=os.getcwd(), # 存放日志的目錄
         level=logging.DEBUG,
         formatter=logging.BASIC_FORMAT, # 日志輸出格式
         logger_name="", # 可以使用logging.getlogger(logger_name)使用此logger
         mode='a', 
         delay=0,
         debug=True,
         log_filename=LOG_FILENAME, # 保存日志的文件名(備份出的文件會以此名+.1、 .2命名)
         encoding=None,
         maxBytes=LOG_MAX_BYTES, # 每個日志文件的最大容量
         backupCount=3 # 最多備份幾個日志文件):
  # 判斷存放日志的文件夾是否存在 如果不存在新建
  if not os.path.exists(log_path):
    os.mkdir(log_path)
  # 存放log的文件名
  log_filename = os.path.join(log_path, log_filename)
 
  # 創(chuàng)建一個logger
  logger = logging.getLogger(logger_name)
  # 設(shè)置日志等級
  logger.setLevel(level)
  # 創(chuàng)建一個滾動日志處理器
  crfh = ConcurrentRotatingFileHandler(log_filename, mode=mode, maxBytes=maxBytes, backupCount=backupCount, delay=delay, debug=debug, encoding=encoding)
  # 定義handler的輸出格式
  # 設(shè)定日志輸出格式
  crfh.setFormatter(formatter)
  # 添加日志處理器
  logger.addHandler(crfh)
  # 返回logger對象
  return logger
 
# 日志格式
formatter_log = logging.Formatter('%(asctime)s - %(filename)s [line: %(lineno)d] 【%(levelname)s】 ----- %(message)s')
# 生成一個logger
logger = create_logger(log_path=LOG_PATH, logger_name="mylogger", formatter=formatter_log) 
 

這樣就可以在其他模塊導(dǎo)入logger進(jìn)行使用了

logger.error("error msg") 

有時候我們會記錄一些數(shù)據(jù)到文件中,如果多個程序同時寫入同一文件會把數(shù)據(jù)寫亂 我們也可以使用這個模塊來代替f.write()

from config import CHANNEL_PATH, CHANNEL_FILENAME, LOG_MAX_BYTES
# 只需要把日志的格式改為只存入信息就可以了
formatter_writer = logging.Formatter('%(message)s')
# 創(chuàng)建一個寫入器(logger)
writer = create_logger(logger_name="writer",log_path=CHANNEL_PATH, log_filename=CHANNEL_FILENAME, formatter=formatter_writer, level=logging.INFO)

這樣就可以使用writer.info("msg")記錄數(shù)據(jù)了

二、使用ini配置文件

創(chuàng)建文件xxx.ini

[loggers]
keys = root,public
 
[handlers]
keys = consoleHandler,publicFileHandler
 
[formatters]
keys = my_formatter
 
[logger_root]
level = DEBUG
handlers = consoleHandler
 
[logger_public]
handlers = publicFileHandler
qualname = public
propagate = 0
 
[handler_consoleHandler]
class = StreamHandler
level = DEBUG
formatter = my_formatter
args = (sys.stdout,)
 
[handler_publicFileHandler]
class = cloghandler.ConcurrentRotatingFileHandler
level = INFO
formatter = my_formatter
kwargs = {"filename": "./logs/public.log", "maxBytes": 1024 * 1024 * 10, "backupCount": 10, "delay": True, "debug": True}
 
[formatter_my_formatter]
format = %(asctime)s - %(filename)s [line: %(lineno)d] [%(levelname)s] ----- %(message)s
datefmt = %Y-%m-%d %H:%M:%S
 

創(chuàng)建mylogger.py

import logging
import logging.config 
logging.config.fileConfig("./xxx.ini") 
logger = logging.getLogger("public") 
logger.info("hello world!")

補(bǔ)充:python日志輪轉(zhuǎn)RotatingFileHandler動態(tài)加載導(dǎo)致不能記錄日志問題

linux下:

Traceback (most recent call last): File “/usr/lib64/python2.7/logging/handlers.py”, line 77, in emit self.doRollover() File “/usr/lib64/python2.7/logging/handlers.py”, line 136, in doRollover os.rename(sfn, dfn) OSError: [Errno 13] Permission denied Logged from file utils.py, line 89

windows下:

Traceback (most recent call last): File “F:\Python27\lib\logging\handlers.py”, line 77, in emit self.doRollover() File “F:\Python27\lib\logging\handlers.py”, line 142, in doRollover os.rename(self.baseFilename, dfn) WindowsError: [Error 32] Logged from file utils.py, line 89

這是由于django開發(fā)模式時會同時啟動兩個進(jìn)程加載settings.py,導(dǎo)致日志文件占用后無法重命名或者刪除

都知道django開發(fā)模式下如果有文件變動會自動重新啟動,所以同時又兩個進(jìn)程,一個是程序正常運(yùn)行的進(jìn)程,另一個是用來監(jiān)聽變更并重啟服務(wù)的進(jìn)程,他們都會加載一遍settings.py,可以在settings.py中加print然后啟動會看到控制臺又兩次輸出。

解決方式:

python C:\Users\pc\Desktop\yunserver-1.1\manage.py runserver --noreload 0.0.0.0:8000

使用不動態(tài)加載方式運(yùn)行(這樣可能會影響開發(fā)環(huán)境中動態(tài)加載)

以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。

相關(guān)文章

  • Django后端接收嵌套Json數(shù)據(jù)及解析詳解

    Django后端接收嵌套Json數(shù)據(jù)及解析詳解

    這篇文章主要介紹了Django后端接收嵌套Json數(shù)據(jù)及解析詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-07-07
  • Python+Opencv實(shí)現(xiàn)計算閉合區(qū)域面積

    Python+Opencv實(shí)現(xiàn)計算閉合區(qū)域面積

    這篇文章主要介紹了利用Python?Opencv計算閉合區(qū)域的面積的原理以及實(shí)現(xiàn)代碼,文中的講解詳細(xì)易懂,感興趣的小伙伴快跟隨小編一起學(xué)習(xí)一下吧
    2022-03-03
  • Django視圖函數(shù)的具體使用

    Django視圖函數(shù)的具體使用

    這篇文章主要介紹了Django視圖函數(shù)的具體使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • Python文件操作與數(shù)據(jù)處理實(shí)戰(zhàn)指南

    Python文件操作與數(shù)據(jù)處理實(shí)戰(zhàn)指南

    文件操作與數(shù)據(jù)處理是Python編程中最基礎(chǔ)也是最重要的技能之一,無論是數(shù)據(jù)分析、Web開發(fā)還是自動化腳本編寫,都離不開對文件的讀寫和各種數(shù)據(jù)處理操作,本文將全面介紹Python中的文件操作方法和常用數(shù)據(jù)處理技巧,需要的朋友可以參考下
    2025-04-04
  • 磁盤垃圾文件清理器python代碼實(shí)現(xiàn)

    磁盤垃圾文件清理器python代碼實(shí)現(xiàn)

    幾行Python代碼打造自己的磁盤垃圾文件清理器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • python禁止位置傳參函數(shù)詳解

    python禁止位置傳參函數(shù)詳解

    文章介紹了Python3.x中的關(guān)鍵字參數(shù)特性,說明了如何在函數(shù)定義中使用*符號來限制參數(shù)只能通過關(guān)鍵字傳遞,而不是位置,這種特性在處理參數(shù)較多或順序可能導(dǎo)致混淆的函數(shù)時特別有用,提高了代碼的可讀性和健壯性
    2024-11-11
  • Python的信號庫Blinker用法詳解

    Python的信號庫Blinker用法詳解

    在本篇文章里小編給大家整理了一篇關(guān)于Python的信號庫Blinker用法詳解內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。
    2020-12-12
  • Flask自定義序列化超詳細(xì)講解

    Flask自定義序列化超詳細(xì)講解

    序列化其實(shí)就是將數(shù)據(jù)轉(zhuǎn)化成一種可逆的數(shù)據(jù)結(jié)構(gòu),自然,逆向的過程就叫做反序列化。php將數(shù)據(jù)序列化和反序列化會用到兩個函數(shù):serialize 將對象格式化成有序的字符串、unserialize 將字符串還原成原來的對象
    2022-11-11
  • Linux下python與C++使用dlib實(shí)現(xiàn)人臉檢測

    Linux下python與C++使用dlib實(shí)現(xiàn)人臉檢測

    這篇文章主要為大家詳細(xì)介紹了Linux下python與C++使用dlib實(shí)現(xiàn)人臉檢測,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • Django環(huán)境下使用Ajax的操作代碼

    Django環(huán)境下使用Ajax的操作代碼

    AJAX 的主要目標(biāo)是在不刷新整個頁面的情況下,通過后臺與服務(wù)器進(jìn)行數(shù)據(jù)交換和更新頁面內(nèi)容,通過 AJAX,您可以向服務(wù)器發(fā)送請求并接收響應(yīng),然后使用 JavaScript 動態(tài)地更新頁面的部分內(nèi)容,這篇文章主要介紹了Django環(huán)境下使用Ajax,需要的朋友可以參考下
    2024-03-03

最新評論

丰镇市| 庆云县| 永仁县| 嘉祥县| 乐亭县| 宁远县| 石门县| 赞皇县| 遂宁市| 金秀| 正宁县| 宝兴县| 玛多县| 郸城县| 临漳县| 洪洞县| 大冶市| 雅安市| 苗栗县| 拜泉县| 郁南县| 新乡市| 资溪县| 清水河县| 惠来县| 神农架林区| 灯塔市| 昌图县| 波密县| 镇安县| 乐亭县| 望城县| 北票市| 德格县| 磐安县| 抚顺县| 伊宁县| 沁阳市| 盐池县| 永兴县| 措勤县|