1

アプリケーションは python ロギングを使用します。異なるモジュールがあり、各モジュールにはロガーがあり、最上位階層にルートがあります。サードパーティ API と通信する 3 つのモジュールがあります。サードパーティ API からのリクエスト/レスポンスのログを追跡するには時間がかかります。そのため、ログ メッセージに基づいて、ログを別のログ ファイルにリダイレクトする必要があります。これにより、API 要求/応答ログの追跡が簡素化されます。ログ レベルに基づくログのリダイレクトは非常に一般的ですが、ログ メッセージの内容に基づいて API 固有のログを別のログ ファイルにリダイレクトする効率的な設計を思い付くことができません。以下は、要件を達成するために使用できるアプローチです。

class APILevelLogHandler(logging.Handler):
    def __init__(self):
        logging.Handler.__init__(self)
    def emit(self, record):
        import re, os, socket
        logFileList = []
        matchObj = re.search('\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}', str(record.msg))
    logPath = "/tmp/"
    try:
        if matchObj and socket.inet_aton(matchObj.group()):
            if not matchObj.group() in logFileList:
                logFileList.append(matchObj.group())
                if not os.path.isdir(logPath):
                    try:
                        os.makedirs(logPath)
                    except OSError:
                        print "Exception", ex, callstack.ExcepCallStack()
            if "dataReceived" in record.msg or "send" in record.msg:
                with open(str(os.path.join(logPath, matchObj.group()+".log")), 'a') as f:
                    f.write(record.msg + '\n')
    except Exception, ex:
        print "Exception", ex, callstack.ExcepCallStack()

アプリケーションの Python ロギングのセットアップ中に、ハンドラーが次のようにルート ロガーに追加されます。

logger = logging.getLogger('')
logger.addHandler(APILevelLogHandler())

Output.log
API test1 1.1.1.1 data send
API test2 2.2.2.2 data send
API test1 1.1.1.1 data received
API test1 1.1.1.1 data send
API test2 2.2.2.2 data received
API test1 1.1.1.1 data received

Expected output
1.1.1.1.log
API test1 1.1.1.1 data send
API test1 1.1.1.1 data received
API test1 1.1.1.1 data send
API test1 1.1.1.1 data received

2.2.2.2.log
API test2 2.2.2.2 data send
API test2 2.2.2.2 data received

上記の要件を達成するためのより良い設計を提案してください。

ありがとう、ランジャン

もう1つの考えられる解決策:

上記のアプローチでは、既存のプロセスに余分なオーバーヘッドが追加されます。RotatingFileHandler ハンドラーによって提供される同じ機能を使用する場合は、機能を書き直す必要があります。したがって、ロギングが1つのモジュールから行われる場合にうまく機能するもう1つの提案がありますが、私の場合、ロギングは複数のモジュールから行われます。したがって、一般的なログ設定からログをリダイレクトする必要があります。複数のモジュールを使用する他の方法があれば教えてください。

    logFileName = "logFileName_extracted_from_message"
    self.apilevelLogger = logging.getLogger(logFileName)
    if any(isinstance(item, logging.handlers.RotatingFileHandler) for item in logging.getLogger('').handlers):
        handler = logging.handlers.RotatingFileHandler(logFileName, maxBytes=10e6, backupCount=3)
        self.apilevelLogger.addHandler(handler)
        self.apilevelLogger.setLevel(logging.INFO)

    self.apilevelLogger.info("API test1 1.1.1.1 send data")

2番目に近づいたのは、いいえ。作成されたロガーの数は no と同じです。のログ ファイルが作成されました。すべてのモジュールに同じコードを追加するのではなく、さらに改善する余地があることを願っています。効率化・デザイン性の向上にお役立てください。

ありがとう、ランジャン

4

1 に答える 1