Tuesday, 6 August 2019

How to log request specific property in python logger

I have a python file 'server.py'

#!/usr/bin/env python

import sys, BaseHTTPServer
from mylogger import logging
logger = logging.getLogger(__name__)

class RESTRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
    def do_GET(self):
        logger.error('Just random log')
        self.send_response(200)
        self.end_headers()

def rest_server(port):
    'Starts the REST server'
    http_server = BaseHTTPServer.HTTPServer(('', port), RESTRequestHandler)
    print 'Starting HTTP server at port %d' % port
    try:
        http_server.serve_forever()
    except KeyboardInterrupt:
        pass
    print 'Stopping HTTP server'
    http_server.server_close()

def main(argv):
    rest_server(8080)

if __name__ == '__main__':
    main(sys.argv[1:])

I have another file 'mylogger.py'

__all__ = ['logging']

import logging
FORMAT = '%(asctime)s | %(tid)d | %(message)s'

def req_extractor(*args, **kargs):
    print(args)
    print(kargs)
    print(locals())
    # here i want to get request X-App-Tid
    return {'tid': 1}

class CustomLogger(logging.Logger):
    def _log(self, level, msg, args, exc_info=None, extra=None):
        reqObj = req_extractor()
        if extra is None: extra = {}
        reqObj.update(extra)
        super(CustomLogger, self)._log(level, msg, args, exc_info, reqObj)

logging.setLoggerClass(CustomLogger)

logging.basicConfig(
        filename='python.log',
        format=FORMAT,
        datefmt='%m/%d/%Y %I:%M:%S %p',
        level=logging.DEBUG)

when i make a curl call

curl -H 'X-App-Tid:1' -i http://localhost:8080

i get

07/23/2019 04:50:45 PM | 1 | Just random log

I am able to print tid in log, but i want to extract it from the request header X-App-Tid

Note : The file server.py is not allowed to change, but i can make any change in mylogger.py

Any help?



from How to log request specific property in python logger

No comments:

Post a Comment