File size: 3,672 Bytes
f4fac26
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import logging
from os.path import dirname, abspath
import os
import colorlog 
import time

from config import PROJECT_ROOT

# 自定义日志格式
class Logger(object):
    def __init__(self, logger_name: str, level=logging.DEBUG, std_out: bool=True, save2file: bool=False, file_name: str=None) ->None:
        super().__init__()

        if std_out == False and save2file == False:
            raise ValueError('args: [std_out, save2file], at less one of them must be True')

        # 默认的格式化
        datefmt = "%Y-%m-%d %H:%M:%S"
        
        # 输出到控制台
        if std_out:
            
            std_logfmt = "[%(asctime)s.%(msecs)03d] [%(levelname)s]: %(log_color)s%(message)s"

            self.stdout_logger = logging.getLogger('{}_std'.format(logger_name))
            self.stdout_logger.setLevel(level)

             # 彩色输出格式化
            log_colors_config = {
                'DEBUG': 'cyan',
                'INFO': 'green',
                'WARNING': 'yellow',
                'ERROR': 'red',
                'CRITICAL': 'red'
            }
            formatter = colorlog.ColoredFormatter(
                        fmt=std_logfmt,
                        datefmt=datefmt,
                        log_colors=log_colors_config,
                        )
            
            sh = logging.StreamHandler()
            sh.setLevel(level)        
            sh.setFormatter(formatter)
            
            self.stdout_logger.addHandler(sh)
       
                    
         # 输出到文件
        if save2file:

            file_logfmt = "[%(asctime)s.%(msecs)03d] [%(levelname)s]: %(message)s"

            self.file_logger = logging.getLogger('{}_file'.format(logger_name))
            self.file_logger.setLevel(level)

            base_dir = PROJECT_ROOT + '/logs' # 获取上级目录的绝对路径
            if not os.path.exists(base_dir):
                os.mkdir(base_dir)
            
            log_file = ''
            if file_name is not None:
                log_file = file_name
            else:
                log_file = base_dir + '/' + logger_name  + '-' + str(time.strftime('%Y%m%d', time.localtime())) +'.log'

            fh = logging.FileHandler(filename=log_file, mode='a', encoding='utf-8')
            fh.setLevel(level)
            save_formatter =  logging.Formatter(
                fmt=file_logfmt,
                datefmt=datefmt,
                )
            fh.setFormatter(save_formatter)
            self.file_logger.addHandler(fh)

    def info(self, message: str, std_out: bool=True, save_to_file: bool=False) -> None:
        if std_out:
            self.stdout_logger.info(message)
        if save_to_file:
            self.file_logger.info(message)

    def debug(self, message: str, std_out: bool=True, save_to_file: bool=False) -> None:
        if std_out:
            self.stdout_logger.debug(message)
        if save_to_file:
            self.file_logger.debug(message)

    def warning(self, message: str, std_out: bool=True, save_to_file: bool=False) -> None:
        if std_out:
            self.stdout_logger.warning(message)
        if save_to_file:
            self.file_logger.warning(message)

    def error(self, message: str, std_out: bool=True, save_to_file: bool=False) -> None:
        if std_out:
            self.stdout_logger.error(message)
        if save_to_file:
            self.file_logger.error(message)

if __name__ == "__main__":
    log = Logger('test', std_out=True, save2file=True, file_name='../logs/test.log')
    # log = Logger('test', save2file=True)
    log.info('test info')
    log.info('test file log', save_to_file=True)