# -*- coding:utf-8 -*-
"""
@author: yq
@time: 2022/8/29
@desc:
"""

import datetime
import logging
import logging.handlers
import os
import threading
import time
from os.path import dirname, realpath

import pytz

from commom.traceId_util import TraceIdFilter


def my_time(*args):
    return time.strptime(datetime.datetime.now(pytz.timezone("Asia/Shanghai")).strftime("%Y-%m-%d %H:%M:%S"),
                         "%Y-%m-%d %H:%M:%S")


_instance_lock = threading.Lock()
logger_map = {}


def get_logger(logger_name: str = None) -> logging.Logger:
    if logger_name is None:
        logger_name = "app"
    if logger_name in logger_map.keys():
        return logger_map.get(logger_name)
    with _instance_lock:
        if logger_name in logger_map.keys():
            return logger_map.get(logger_name)

        _logger = logging.Logger(logger_name)
        _logger.setLevel(logging.INFO)
        _logger.addFilter(TraceIdFilter())

        formatter = logging.Formatter(
            '[%(asctime)s] [requestId-%(requestId)s] [%(levelname)s] [%(threadName)s] [%(filename)s] [func:%(funcName)s line:%(lineno)d]\n %(message)s')
        formatter.converter = my_time

        log_path = os.path.join(dirname(dirname(realpath(__file__))), "logs")
        filename = os.path.join(log_path, f"{logger_name}.log")

        if not os.path.exists(dirname(filename)):
            os.makedirs(dirname(filename))
        print(f"日志路径:{filename}")

        handler = logging.handlers.TimedRotatingFileHandler(filename, when="MIDNIGHT", interval=7, backupCount=4,
                                                            encoding="utf8", atTime=datetime.time(0, 0, 0, 0))
        handler.setFormatter(formatter)
        _logger.addHandler(handler)

        console_handler = logging.StreamHandler()
        console_handler.setFormatter(formatter)
        _logger.addHandler(console_handler)

        logger_map[logger_name] = _logger

        return _logger