66 lines
2.0 KiB
Python
66 lines
2.0 KiB
Python
# -*- 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))
|