【问题标题】:How to fetch process,thread name,levelname in customized python logger如何在自定义 python 记录器中获取进程、线程名称、级别名称
【发布时间】:2012-10-20 16:02:28
【问题描述】:

我正在开发定制的记录器程序,根据要求,我需要在被调用函数中获取对象的进程、线程和名称(在下面的示例中,它的 obj 需要在 get_configured_logger 函数中获取)和 obj 的类名属于。如下代码中的 cmets 所示,请给出一些想法来实现这一点。

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")

谢谢

血红素

【问题讨论】:

    标签: python python-3.x python-2.7 wxpython ironpython


    【解决方案1】:

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

    %(processName)s %(threadName)s
    

    将它们作为字符串获取:

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

    【讨论】:

    • 为了完整起见,我想添加ident 属性,用于获取线程的标识符。对于当前流程我通常使用os.getpid()
    【解决方案2】:

    线程名称

    documentation 描述了一个访问当前Thread 的简单接口,然后您可以使用其name 属性来获得线程名称。

    然后您可以使用:

    import threading
    threading.current_thread().name
    

    请注意,它不是唯一的。

    进程名称

    没有简单的方法来获取进程名称,因为这取决于您使用的操作系统。但是,您可以获取进程 ID (pid):

    import os
    os.getpid()
    

    除非您使用multiprocessing 模块并启动子进程,在这种情况下您可以使用multiprocessing 模块,它提供的界面与Threading 模块的界面非常相似。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-28
      • 1970-01-01
      相关资源
      最近更新 更多