我有一个 HTTP Server 类,支持多线程,在将结果写回客户端时,它也会写入一些日志(日志记录模块)。 它会减慢请求速度,并且由于 POST/GET 方法仅在“返回”发生后才返回,因此我必须在发送结果之前写入日志。 我希望通过打开另一个线程来接收消息并写入日志来做到这一点。 我希望将我的 Logging 对象设置为“静态”,或者是唯一的类成员,并且共享给所有可以获取它的锁并使用它的线程。
import logging
LOG_FILENAME = 'babyServer.log'
class Logger(object):
logging.basicConfig(level=logging.DEBUG,
format='%(asctime)s %(levelname)-8s %(message)s',
datefmt='%a, %d %b %Y %H:%M:%S',
filename='serverLog.log',
filemode='wa')
@classmethod
def Write(cls,level,log):
level = level.lower()
if level == 'error':
logging.error(log)
if level == 'info':
logging.info(log)
if level == 'exception':
logging.exception(log)
因此,从该文件之外的某个地方,我当前有一个调用,例如 Logger.Write('信息', "一些信息") 相反,我希望此调用实际上会打开一个新线程,该线程拥有对我在 Logger 类中配置的单个日志记录的引用。
最佳答案
启动线程也有开销。
所以我建议你编写一个具有三个公共(public)函数的模块;
start(filename)
启动日志记录线程write(txt)
写入日志文件。stop()
停止日志记录线程。
write
函数将要记录的文本放入 FIFO Queue
并返回到调用线程。
日志记录线程从队列
读取项目并将其写入日志文件。
假设你有一个像这样的文件log.py
;
"""Module to log to a file."""
import Queue
import threading
_name = None
_lt = None
_q = None
_stop = False
def _run():
while not _stop:
txt = _q.get()
with open(_name, 'a+') as logfile:
logfile.write(txt)
def start(name):
global _lt, _q, _name
if _name:
raise RuntimeError('Logging already initialized')
_name = name
_q = Queue.Queue()
_lt = threading.Thread(target=_run)
_lt.start()
def stop():
global _stop
_stop = True
_lt.join()
def write(txt):
_q.put(txt, block=False)
使用日志记录模块而不是简单地写入文件作为读者的练习。
关于Python多线程写日志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18341506/