一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術(shù)及教程分享平臺!
分類導(dǎo)航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務(wù)器之家 - 腳本之家 - Python - Python logging模塊異步線程寫日志實現(xiàn)過程解析

Python logging模塊異步線程寫日志實現(xiàn)過程解析

2020-06-30 10:21印第安海盜 Python

這篇文章主要介紹了Python logging模塊異步線程寫日志實現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下

通過logging模塊,重寫一個logging2模塊,獨立開啟線程,將待寫的日志信息異步放入隊列,做到日志輸出不影響主流程性能,環(huán)境python3.8

logging2.py

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
import os
import threading
import queue
import time
import datetime
import logging
from logging.handlers import RotatingFileHandler
 
class logging2(threading.Thread):
  AQueue = queue.Queue(100000)
  nPID = os.getpid()
  Adt = datetime.datetime.now().strftime('%Y%m%d')
  nCount = 1
  
  def __init__(self, threadID, name, module, logLevel):
    threading.Thread.__init__(self)
    self.threadID = threadID
    self.name = name
    self.module = module
    
    print("set loglevel: [%s]" % (logLevel) )
    formatter = logging.Formatter('%(asctime)s|%(name)s|%(process)d|%(levelname)s|%(message)s')
    logfile = "log_" + self.module + "_" + str(logging2.nPID) + "_" + str(logging2.Adt) + ".log"
    self.logger = logging.getLogger(__name__)
    
    self.rHandler = RotatingFileHandler(logfile, maxBytes = 10*1024*1024, backupCount = 10)
    self.rHandler.setFormatter(formatter)
    
    self.console = logging.StreamHandler() 
    self.console.setFormatter(formatter)
    
    if logLevel == 'DEBUG' :
      self.logger.setLevel(level = logging.DEBUG)
      self.rHandler.setLevel(logging.DEBUG)
      self.console.setLevel(logging.DEBUG)
    elif logLevel == 'INFO' :
      self.logger.setLevel(level = logging.INFO)
      self.rHandler.setLevel(logging.INFO)
      self.console.setLevel(logging.INFO)
    elif logLevel == 'WARNING' :
      self.logger.setLevel(level = logging.WARN)
      self.rHandler.setLevel(logging.WARN)
      self.console.setLevel(logging.WARN)
    elif logLevel == 'ERROR' :
      self.logger.setLevel(level = logging.ERROR)
      self.rHandler.setLevel(logging.ERROR)
      self.console.setLevel(logging.ERROR)   
 
    self.logger.addHandler(self.rHandler)
    self.logger.addHandler(self.console)   
 
  #如果跨天了,則重新生成新的文件名
  def reSetLog(self):
    AdtTemp = datetime.datetime.now().strftime('%Y%m%d')
    #比較新的時間
    if AdtTemp == logging2.Adt:
      return(True)
      
    logging2.Adt = AdtTemp
    logfile = "log_" + self.module + "_" + str(logging2.nPID) + "_" + str(AdtTemp) + ".log"
    self.rHandler = RotatingFileHandler(logfile, maxBytes = 1*1024, backupCount = 10)
    
    self.logger.addHandler(self.rHandler)
    self.logger.addHandler(self.console) 
    logging2.nCount += 1
    
  def run(self):
    print ("開啟日志線程:" + self.name)
    i = 0
    while True:
      #data = "queue test data"
      #debug(data)
      #print("Queuesize: %s" % (logging2.AQueue.qsize()))
      self.reSetLog()
      if logging2.AQueue.empty() == False:
        #從隊列獲取日志消息
        data = logging2.AQueue.get()
        #解析日志消息,格式:日志級別,內(nèi)容
        level = list(data.keys())[0]
        content = data.get(level)
        #把內(nèi)容按分隔符|解析成list傳入?yún)?shù)
        lstContent = list(content.split('|'))
        if level == 'DEBUG' :
          self.logger.debug(*lstContent)
        elif level == 'INFO' :
          self.logger.info(*lstContent)
        elif level == 'WARNING' :
          self.logger.warn(*lstContent)
        elif level == 'ERROR' :
          self.logger.error(*lstContent)
      else:
        time.sleep(0.5)
 
    print ("退出線程:" + self.name) 
  
def debug(*content): 
  logMsg = ""
  #傳入多個參數(shù)用豎線分隔符分開
  for i in range(len(content)):
    if i == len(content)-1:
      logMsg += content[i]
    else:
      logMsg += content[i]+"|"
  logging2.AQueue.put({'DEBUG':logMsg})
      
def info(*content):
  logMsg = ""
  for i in range(len(content)):
    if i == len(content)-1:
      logMsg += content[i]
    else:
      logMsg += content[i]+"|"
  logging2.AQueue.put({'INFO':logMsg})
        
def warn(*content):
  logMsg = ""
  for i in range(len(content)):
    if i == len(content)-1:
      logMsg += content[i]
    else:
      logMsg += content[i]+"|"
  logging2.AQueue.put({'WARNING':logMsg})
    
def error(*content):
  logMsg = ""
  for i in range(len(content)):
    if i == len(content)-1:
      logMsg += content[i]
    else:
      logMsg += content[i]+"|"
  logging2.AQueue.put({'ERROR':logMsg})
          
def init(module, level):
  # 創(chuàng)建新線程
  thread1 = logging2(1, "Thread-log", module, level)
  # 開啟新線程
  thread1.start()
#  thread1.join()

測試樁logMain.py

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import sys
import os
import time
import threading
 
if __name__ == '__main__':
  import logging2
  logging2.init("logMain", "DEBUG")
  
  teststr = "22222"
  
  while True:
    logging2.debug('this is a debug log test [%s] ', teststr)
    logging2.info('this is a info log test [%s] [%s]', teststr, teststr)
    logging2.warn('this is a warn log test')
    logging2.error('this is a error log test')
    #time.sleep(0.1)
  
  
  print(threading.enumerate())
  
  print('press ctrl_c to exit')

測試結(jié)果

生成日志文件:

-rw-rw-r--. 1 zxl zxl 10152463 6月 24 17:52 log_logMain_57554_20200624.log

文件內(nèi)容如下:

Python logging模塊異步線程寫日志實現(xiàn)過程解析

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。

原文鏈接:https://www.cnblogs.com/yindianhaidao/p/13201074.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 好爽好粗 | chinesemature老女人 | 青青草国产精品 | 久久受www免费人成_看片中文 | 四虎影视色费永久在线观看 | 精品国产日韩一区三区 | 免费永久视频 | 欧美一级裸片 | 高跟翘臀老师后进式视频 | 99热.com| japanesepooping脱粪 | 亚洲成人网页 | 欧美va在线 | 久久免费看少妇级毛片蜜臀 | 熟睡中的麻麻大白屁股小说 | 成人欧美一区二区三区白人 | 欧美成人aaaa免费高清 | 91精品久久国产青草 | videodesexo中国妞 | 色婷婷久久综合中文久久一本 | 超兴奋朋友的中文字幕下 | 亚洲冬月枫中文字幕在线看 | 操碰97| 国产精品手机视频一区二区 | 久久成人永久免费播放 | 亚洲色图欧美色 | 国产成人啪精品午夜在线播放 | 国产亚洲女人久久久久久 | 天天综合天天综合色在线 | fuqer日本老师 | 青青网在线视频 | 免费看日产一区二区三区 | 久久无码AV亚洲精品色午夜麻豆 | jzzjzz视频免费播放 | 国产综合亚洲欧美日韩一区二区 | 从后面撕开老师的丝袜动态图 | 催眠 迷j系列小说 | 国语自产自拍秒拍在线视频 | 午夜私人福利影院 | www亚洲色图| 极品主播的慰在线播放 |