如何在自定义的Python日志记录器中获取进程、线程名称和日志级别?

17

我正在开发自定义日志程序,根据要求,我需要在调用函数内获取进程、线程和对象名称(在下面的示例中,在get_configured_logger函数内需要获取obj),以及对象所属的类名。请参考下面代码中的注释,给出一些实现这一需求的想法。

import logging, logging.handlers
from logging import StreamHandler, Formatter
class A:
  def get_configured_logger(self,name):
      logger = logging.getLogger(name)
      if (len(logger.handlers) == 0):                
                FORMAT = "%(process)s %(thread)s:-(asctime)s - %(name)s - %(levelname)s - %(message)-%(module)"

                #print 'process:',process
                #print 'thread:',thread
                #print 'levelname:',levelname
                #print  'Module:',(name portion of filename).

                #print 'obj:,'name of the object(Eg:obj),current function( Eg: get_configured_logger) called by' 
                #print 'class name:(obj is instance of class)' 
                formatter = logging.Formatter(fmt=FORMAT)                                 
                handler = logging.StreamHandler()
                handler.setFormatter(formatter)
                logger.addHandler(handler)
                logger.setLevel(logging.DEBUG)        
      return logger

if __name__=="__main__":
    obj=A()
    logger = obj.get_configured_logger("DEMO")
    logger.debug("TEST")

谢谢

hema

2个回答

42

要在日志消息中添加当前进程/线程名称,可以在格式字符串中指定:

%(processName)s %(threadName)s

将它们作为字符串获取:

process_name = multiprocessing.current_process().name
thread_name = threading.current_thread().name

仅为完整起见,我想添加ident属性以获取线程的标识符。对于当前进程,我通常使用os.getpid() - leoschet

7

线程名称

文档中描述了一种简单的接口来访问当前的Thread,然后您可以使用它的name属性来获取线程名称。

您可以使用以下代码:

import threading
threading.current_thread().name

请注意,这并不是唯一的。

进程名称

获取进程名称并不容易,因为它取决于您使用的操作系统。但是,您可以通过以下方式获取进程ID(pid):

import os
os.getpid()

如果你使用multiprocessing模块并启动子进程,那么可以使用该模块,它提供了与Threading模块非常相似的接口。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接