我应该如何在多进程/线程环境中进行日志记录

时间:2018-10-03 15:02:15

标签: java python multithreading

我有一个服务器,该服务器派生一个新的守护程序线程来处理每个传入的请求。如果同时出现多个请求,则可能同时运行多个守护程序线程。我想在所有这些线程中进行整齐的日志记录。在这种情况下,我有一些问题。问题1和2在某种程度上是通用的,并询问人们采用的标准方式。问题3是特定于python的。

  1. 如何从不同的线程登录?
    我觉得我应该有一个运行在某个端口上的日志服务器(或者说侦听某个队列),并且所有线程都将日志传递到哪个队列(队列)。日志服务器应将所有这些日志记录到单个文件中。如果所有线程都直接登录到同一文件,这将避免锁定文件。我当时在考虑使用单个日志文件,而不是为不同的线程使用不同的文件,因为我将收到很多请求(每秒可能成千上万个),因此创建了很多并行线程。每个线程具有单独的文件可能会使系统不堪重负。这是正确的方法吗? Python日志记录手册本身具有example doing this with queue

  2. 如何区分不同线程的日志?
    由于所有线程的代码都是相同的,因此我会反复获得相同的日志。但是为了区分它们,我在不同的类之间生成并传递了uuid。然后,不同的线程使用其记录器名称中包含的uuid进行记录,如下所示:

    time | uuid1.class1 | INFO | message1
    time | uuid2.class1 | INFO | message1
    time | uuid1.class2 | INFO | message2
    time | uuid2.class2 | INFO | message2
    time | uuid1.class2 | INFO | message3
    time | uuid2.class2 | INFO | message3
    

    因此,如您所见,它们是在同一线程中运行的两个类。在这里我可以 使用uuid区分不同线程的不同消息。

  3. (如果我在第2点中所做的是正确的)我应该如何在线程的所有组件中共享相同的uuid,尤其是在python中?目前,我正在将uuid传递给每个类的构造函数。每个类都使用uuid创建一个记录器:

    logging.getlogger(uuid+'.class1')
    

    但这在处理类时有效。我还从模块调用函数,即不是类的方法。在这种情况下,我不能简单地告诉模块要在其执行的线程中使用哪个uuid。我是否应该有一些线程局部变量来保存所有类和模块在特定线程中创建各自的记录器时要使用的uuid?

0 个答案:

没有答案