# -*- coding: utf-8 -*- """ @File: logger.py @Date: 2020-09-14 @author: A2TEC @section MODIFYINFO 수정정보 - 수정자/수정일 : 수정내역 - 2022-01-14/hsj100@a2tec.co.kr : refactoring @brief: logger """ import json import logging from datetime import timedelta, datetime from time import time from fastapi.requests import Request from fastapi import Body from fastapi.logger import logger logger.setLevel(logging.INFO) async def api_logger(request: Request, response=None, error=None): time_format = '%Y/%m/%d %H:%M:%S' t = time() - request.state.start status_code = error.status_code if error else response.status_code error_log = None user = request.state.user if error: if request.state.inspect: frame = request.state.inspect error_file = frame.f_code.co_filename error_func = frame.f_code.co_name error_line = frame.f_lineno else: error_func = error_file = error_line = 'UNKNOWN' error_log = dict( errorFunc=error_func, location='{} line in {}'.format(str(error_line), error_file), raised=str(error.__class__.__name__), msg=str(error.ex), ) account = user.account.split('@') if user and user.account else None user_log = dict( client=request.state.ip, user=user.id if user and user.id else None, account='**' + account[0][2:-1] + '*@' + account[1] if user and user.account else None, ) log_dict = dict( url=request.url.hostname + request.url.path, method=str(request.method), statusCode=status_code, errorDetail=error_log, client=user_log, processedTime=str(round(t * 1000, 5)) + 'ms', datetimeUTC=datetime.utcnow().strftime(time_format), datetimeKST=(datetime.utcnow() + timedelta(hours=9)).strftime(time_format), ) if error and error.status_code >= 500: logger.error(json.dumps(log_dict)) else: logger.info(json.dumps(log_dict))