Python多线程写日志

标签 python logging python-multithreading

我有一个 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/

相关文章:

python - 如何重新排序和重命名 pandas pivot?

python - 为什么是一个包罗万象的尝试 :/except: not enough to catch an exception?

python - 使用 Python 3.7.1 在 Windows 10 中创建快捷方式文件

amazon-web-services - 如何登录亚马逊网络服务(AWS)?

debugging - 如何在 Rust 中打印表达式及其值?

python - 如何在线程内运行递归函数?

python - ThreadPoolExecutor().map 与 ThreadPoolExecutor().submit 有何不同?

python - 扩展 __str__() 而不是替换它

python - 线程的 Django 全局数据

c# - 如何在多部分/表单数据请求的请求正文中记录文件内容