用于多线程的python记录器类

2024-10-04 05:28:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我在我的自由职业者项目中使用自己的logger类,通过ftp访问日志并检查错误。它为每个进程编写一个单独的文件,通过操作系统获取PID()功能。 这对于python多进程库很有用。但是我经常使用多线程而不是多处理,我不知道如何改进代码,为每个输出到stdout的线程编写一个单独的文件。你知道吗

class Logger(object):
    def __init__(self, realstdout, path='logs/'):
        today = datetime.datetime.now().isoformat()
        if path[-1] != '/':
            path = path+'/'
        os.mkdir(path + today)

        self.pid = str(os.getpid())
        self.handler = open(path + today + '/' + self.pid + '.txt', 'w', buffering=0)
        self.stdout = realstdout

    def write(self, buf):
        if buf == '\n' or buf == '(Pdb)':
            return
        buf = buf.replace('\n', '#')
        self.handler.write("[{0}]  [{1}] ".format(datetime.datetime.today(), self.pid) + buf + "\n")
        self.stdout.write("[{0}] ".format(self.pid) + buf + "\n")

    def flush(self):
        pass

    def __del__(self):
        self.handler.close()

怎么做?你知道吗


Tags: 文件pathselftodaydatetimeif进程os
1条回答
网友
1楼 · 发布于 2024-10-04 05:28:38

如果使用相同的策略,为每个工作线程记录一个单独的日志文件,那么每个线程都必须有某种标识符。因为每个线程都在同一个进程中执行,所以它们都具有相同的进程id

我相信你可以用线程标识符来识别它:

>>> threading.current_thread()
<_MainThread(MainThread, started 139944996378368)>
>>> threading.current_thread().ident
139944996378368

支持线程的记录器可能能够创建一个唯一标识符:

self.pid = str(threading.current_thread().ident)

相关问题 更多 >