Skip to content
This repository was archived by the owner on Dec 21, 2024. It is now read-only.
This repository was archived by the owner on Dec 21, 2024. It is now read-only.

Question: how to have a unique ID per request #191

Description

@ppi-agray

I have a request to have a unique ID in the logs "per request".
I can reproduce the problem that I'm trying to solve by this loop:

    for i in range(3):
        update_logger(__name__) # this is where I try to set a unique ID
        # I want each of these messages to have the SAME unique_id
        logger.info('loop start')
        logger.info(f'loop: {i}')
        logger.info('loop end')

I'm hoping to have something like:

{"message": "loop start", "request_id": "XXX"}
{"message": "loop: 0", "request_id": "XXX"}
{"message": "loop end", "request_id": "XXX"}
{"message": "loop start", "request_id": "YYY"}
{"message": "loop: 1", "request_id": "YYY"}
{"message": "loop end", "request_id": "YYY"}
{"message": "loop start", "request_id": "ZZZ"}
{"message": "loop: 2", "request_id": "ZZZ"}
{"message": "loop end", "request_id": "ZZZ"}

But instead I'm getting a unique ID PER message:

{"message": "loop start", "request_id": "aaa1f7986f144601af5a533baee1aca7"}
{"message": "loop: 0", "request_id": "afd7c033339a4030adcfb6eff78a007f"}
{"message": "loop end", "request_id": "63c51ca47afc4f73920c0e6998bf61ac"}
{"message": "loop start", "request_id": "21484da3aa0b46559310cbef3b6c5391"}
{"message": "loop: 1", "request_id": "67bdb9a7944b479aac2c4f86bef2fd4c"}
{"message": "loop end", "request_id": "8d0f7469a34b405ba6adf0cf51118c33"}
{"message": "loop start", "request_id": "89a4387b10634d268b2fbe0fd35ce677"}
{"message": "loop: 2", "request_id": "bf4099ed93f046628baa18a8201ca201"}
{"message": "loop end", "request_id": "60777e3113b84daabd12b003384e4fb8"}

My full code is like this:

#from utilities.logs import get_logger
import logging
from pythonjsonlogger import jsonlogger
import uuid


class CustomJsonFormatter(jsonlogger.JsonFormatter):
    def add_fields(self, log_record, record, message_dict):
        super(CustomJsonFormatter, self).add_fields(log_record, record, message_dict)
        log_record['request_id'] = uuid.uuid4().hex


def get_logger(logger_name):
    handler = logging.StreamHandler()
    logger = logging.getLogger(logger_name)
    logger.setLevel(logging.INFO)
    formatter = CustomJsonFormatter('%(message)s')
    handler.setFormatter(formatter)
    logger.addHandler(handler)
    return logger


def update_logger(logger_name):
    logger = logging.getLogger(logger_name)
    myhandler = logger.handlers[0]
    myhandler.setFormatter(CustomJsonFormatter('%(message)s'))


logger = get_logger(__name__)


def main():
    for i in range(3):
        update_logger(__name__)
        # I want each of these messages to have the SAME unique_id
        logger.info('loop start')
        logger.info(f'loop: {i}')
        logger.info('loop end')


if __name__ == '__main__':
    main()

I was hoping the function add_fields would be called just once, when I'm setting the formatter, but it looks like it's called every time I print a log message.

Is there a way to do this with python-json-logger?

thanks!!!

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions