File size: 3,756 Bytes
5fbd25d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
# -*- coding: utf-8 -*-

""" A simply logger.

This module is used to log the program.

@file: logger.py
@author: mrhan1993
@update: 2024-03-22
"""
import logging
import os
import sys

try:
    from colorlog import ColoredFormatter
except ImportError:
    from fooocusapi.utils.tools import run_pip
    run_pip(
        command="install colorlog",
        desc="Install colorlog for logger.",
        live=True
    )
finally:
    from colorlog import ColoredFormatter


own_path = os.path.dirname(os.path.abspath(__file__))
log_dir = "logs"
default_log_path = os.path.join(own_path, '../../', log_dir)

std_formatter = ColoredFormatter(
    fmt="%(log_color)s[%(asctime)s] %(levelname)-8s%(reset)s %(blue)s%(message)s",
    datefmt='%Y-%m-%d %H:%M:%S',
    reset=True,
    log_colors={
        'DEBUG': 'cyan',
        'INFO': 'green',
        'WARNING': 'yellow',
        'ERROR': 'red',
        'CRITICAL': 'red,bg_white',
    },
    secondary_log_colors={},
    style='%'
)

file_formatter = ColoredFormatter(
    fmt="[%(asctime)s] %(levelname)-8s%(reset)s %(message)s",
    datefmt='%Y-%m-%d %H:%M:%S',
    reset=True,
    no_color=True,
    style='%'
)


class ConfigLogger:
    """
    Configure logger.
    :param log_path: log file path, better absolute path
    :param std_format: stdout log format
    :param file_format: file log format
    """
    def __init__(self,
                 log_path: str = default_log_path,
                 std_format: ColoredFormatter = std_formatter,
                 file_format: ColoredFormatter = file_formatter) -> None:
        self.log_path = log_path
        self.std_format = std_format
        self.file_format = file_format


class Logger:
    """
    A simple logger.
    :param log_name: log name
    :param config: config logger
    """
    def __init__(self, log_name, config: ConfigLogger = ConfigLogger()):
        log_path = config.log_path
        err_log_path = os.path.join(str(log_path), f"{log_name}_error.log")
        info_log_path = os.path.join(str(log_path), f"{log_name}_info.log")
        if not os.path.exists(log_path):
            os.makedirs(log_path, exist_ok=True)

        self._file_logger = logging.getLogger(log_name)
        self._file_logger.setLevel("INFO")

        self._std_logger = logging.getLogger()
        self._std_logger.setLevel("INFO")

        # ๅˆ›ๅปบไธ€ไธชERROR็บงๅˆซ็š„handler๏ผŒๅฐ†ๆ—ฅๅฟ—่ฎฐๅฝ•ๅˆฐerror.logๆ–‡ไปถไธญ
        error_handler = logging.FileHandler(err_log_path, encoding='utf-8')
        error_handler.setLevel(logging.ERROR)

        # ๅˆ›ๅปบไธ€ไธชINFO็บงๅˆซ็š„handler๏ผŒๅฐ†ๆ—ฅๅฟ—่ฎฐๅฝ•ๅˆฐinfo.logๆ–‡ไปถไธญ
        info_handler = logging.FileHandler(info_log_path, encoding='utf-8')
        info_handler.setLevel(logging.INFO)

        # ๅˆ›ๅปบไธ€ไธช stream handler
        stream_handler = logging.StreamHandler(sys.stdout)

        error_handler.setFormatter(config.file_format)
        info_handler.setFormatter(config.file_format)
        stream_handler.setFormatter(config.std_format)

        # ๅฐ†handlerๆทปๅŠ ๅˆฐloggerไธญ
        self._file_logger.addHandler(error_handler)
        self._file_logger.addHandler(info_handler)
        self._std_logger.addHandler(stream_handler)

    def file_error(self, message):
        """file error log"""
        self._file_logger.error(message)

    def file_info(self, message):
        """file info log"""
        self._file_logger.info(message)

    def std_info(self, message):
        """std info log"""
        self._std_logger.info(message)

    def std_warn(self, message):
        """std warn log"""
        self._std_logger.warning(message)

    def std_error(self, message):
        """std error log"""
        self._std_logger.error(message)


logger = Logger(log_name="fooocus_api")