16

I am developing customized logger program,as per the requirement i need to fetch the process,thread and name of object Inside the called function(In below example its obj needs to fetch inside the get_configured_logger function) and class name to which obj belongs. as shown with comments in below code, please give some ideas to achieve this.

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

Thanks

hema

user1559873
  • 6,650
  • 8
  • 25
  • 28

2 Answers2

41

To add current process/thread name to a log message you could specify in the format string:

%(processName)s %(threadName)s

To get them as strings:

process_name = multiprocessing.current_process().name
thread_name = threading.current_thread().name
jfs
  • 399,953
  • 195
  • 994
  • 1,670
  • Just for completeness I would like to add the `ident` attribute, for getting the thread's identifier. For the current process I usually use `os.getpid()` – leoschet Oct 05 '18 at 15:06
7

Thread name

The documentation describes an easy interface to access the current Thread, you can then use its name attribute to have the Thread name.

You can then use:

import threading
threading.current_thread().name

Be aware that it's not unique.

Process name

There is no easy way of getting the process name as this is dependent on the OS you are using. You can however get the process ID (pid) doing:

import os
os.getpid()

That is unless you are using the multiprocessing module and launch subprocesses, in which case you can use the multiprocessing module which presents an interface closely similar to that of the Threading module.

Thomas Orozco
  • 53,284
  • 11
  • 113
  • 116