通过logging模块,重写一个logging2模块,独立开启线程,将待写的日志信息异步放入队列,做到日志输出不影响主流程性能,环境python3.8
logging2.py
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()
#解析日志消息,格式:日志级别,内容
level = list(data.keys())[0]
content = data.get(level)
#把内容按分隔符|解析成list传入参数
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 = ""
#传入多个参数用竖线分隔符分开
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):
# 创建新线程
thread1 = logging2(1, "Thread-log", module, level)
# 开启新线程
thread1.start()
# thread1.join()
测试桩logMain.py
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')
测试结果
生成日志文件:
-rw-rw-r--. 1 zxl zxl 10152463 6月 24 17:52 log_logMain_57554_20200624.log
文件内容如下:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件!
如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
白云城资源网 Copyright www.dyhadc.com
暂无“Python logging模块异步线程写日志实现过程解析”评论...
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
2025年11月09日
2025年11月09日
- 小骆驼-《草原狼2(蓝光CD)》[原抓WAV+CUE]
- 群星《欢迎来到我身边 电影原声专辑》[320K/MP3][105.02MB]
- 群星《欢迎来到我身边 电影原声专辑》[FLAC/分轨][480.9MB]
- 雷婷《梦里蓝天HQⅡ》 2023头版限量编号低速原抓[WAV+CUE][463M]
- 群星《2024好听新歌42》AI调整音效【WAV分轨】
- 王思雨-《思念陪着鸿雁飞》WAV
- 王思雨《喜马拉雅HQ》头版限量编号[WAV+CUE]
- 李健《无时无刻》[WAV+CUE][590M]
- 陈奕迅《酝酿》[WAV分轨][502M]
- 卓依婷《化蝶》2CD[WAV+CUE][1.1G]
- 群星《吉他王(黑胶CD)》[WAV+CUE]
- 齐秦《穿乐(穿越)》[WAV+CUE]
- 发烧珍品《数位CD音响测试-动向效果(九)》【WAV+CUE】
- 邝美云《邝美云精装歌集》[DSF][1.6G]
- 吕方《爱一回伤一回》[WAV+CUE][454M]
