14

私はカスタマイズされたロガープログラムを開発しています。要件に従って、呼び出された関数内のオブジェクトのプロセス、スレッド、および名前(以下の例では、そのobjは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")

ありがとう

ヘマ

4

2 に答える 2

37

現在のプロセス/スレッド名をログ メッセージに追加するには、フォーマット文字列で指定できます。

%(processName)s %(threadName)s

それらを文字列として取得するには:

process_name = multiprocessing.current_process().name
thread_name = threading.current_thread().name
于 2012-10-20T16:54:20.470 に答える
6

スレッド名

ドキュメントでは、現在の にアクセスするための簡単なインターフェイスについて説明しています。Threadその後、そのname属性を使用してスレッド名を取得できます。

その後、次を使用できます。

import threading
threading.current_thread().name

ユニークではないことに注意してください。

プロセス名

これは使用している OS に依存するため、プロセス名を取得する簡単な方法はありません。ただし、次のようにしてプロセス ID ( pid) を取得できます。

import os
os.getpid()

multiprocessingこれは、モジュールを使用してサブプロセスを起動する場合を除きます。その場合、multiprocessingモジュールのインターフェイスと非常によく似たインターフェイスを提供するモジュールを使用できThreadingます。

于 2012-10-20T16:40:04.400 に答える