Skip to content

Logger

Log handler This module provides a log handler which helps developer process log easily.

Examples:

>>> from cptools import LogHandler
>>> logger = LogHandler(name='test')
>>> logger.info('hello')

LogHandler

Bases: logging.Logger

LogHandler

Source code in cptools\logger.py
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
class LogHandler(logging.Logger):
    """LogHandler
    """

    def __init__(self, name: str = '', level: int = INFO, stream: bool = True, file: bool = False,
                 log_path: str = './log'):
        """Initialize log handler
        Args:
            name: logger name
            level: log level, default: INFO
            stream: print log to stdout
            file: print log to file
            log_path: where to save log, default: `./log`
        """
        self.name = name if name else self.__class__.__name__
        self._level = level
        self._log_path = Path(log_path)
        if file and not self._log_path.exists():
            os.makedirs(str(self._log_path))
        logging.Logger.__init__(self, self.name, level=self._level)
        if stream:
            self.__setStreamHandler__()
        # if file and platform.system() != "Windows":
        if file:
            self.__setFileHandler__()

    @property
    def log_path(self):
        return self._log_path

    def __setFileHandler__(self, level=None):
        """
        set file handler
        :param level:
        :return:
        """
        file_path = self._log_path.joinpath('{name}.log'.format(name=self.name))
        # 设置日志回滚, 保存在log目录, 一天保存一个文件, 保留15天
        file_handler = TimedRotatingFileHandler(filename=str(file_path), when='D', interval=1, backupCount=15)
        file_handler.suffix = '%Y%m%d.log'
        if not level:
            file_handler.setLevel(self._level)
        else:
            file_handler.setLevel(level)
        formatter = logging.Formatter('%(asctime)s %(filename)s-line:%(lineno)d <%(name)s> [%(levelname)s] %(message)s')

        file_handler.setFormatter(formatter)
        self.file_handler = file_handler
        self.addHandler(file_handler)

    def __setStreamHandler__(self, level=None):
        """
        set stream handler
        :param level:
        :return:
        """
        stream_handler = logging.StreamHandler()
        formatter = logging.Formatter('%(asctime)s %(filename)s-line:%(lineno)d <%(name)s> [%(levelname)s] %(message)s')
        stream_handler.setFormatter(formatter)
        if not level:
            stream_handler.setLevel(self._level)
        else:
            stream_handler.setLevel(level)
        self.addHandler(stream_handler)

__init__(name='', level=INFO, stream=True, file=False, log_path='./log')

Initialize log handler

Parameters:

Name Type Description Default
name str

logger name

''
level int

log level, default: INFO

INFO
stream bool

print log to stdout

True
file bool

print log to file

False
log_path str

where to save log, default: ./log

'./log'
Source code in cptools\logger.py
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
def __init__(self, name: str = '', level: int = INFO, stream: bool = True, file: bool = False,
             log_path: str = './log'):
    """Initialize log handler
    Args:
        name: logger name
        level: log level, default: INFO
        stream: print log to stdout
        file: print log to file
        log_path: where to save log, default: `./log`
    """
    self.name = name if name else self.__class__.__name__
    self._level = level
    self._log_path = Path(log_path)
    if file and not self._log_path.exists():
        os.makedirs(str(self._log_path))
    logging.Logger.__init__(self, self.name, level=self._level)
    if stream:
        self.__setStreamHandler__()
    # if file and platform.system() != "Windows":
    if file:
        self.__setFileHandler__()

__setFileHandler__(level=None)

set file handler :param level: :return:

Source code in cptools\logger.py
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
def __setFileHandler__(self, level=None):
    """
    set file handler
    :param level:
    :return:
    """
    file_path = self._log_path.joinpath('{name}.log'.format(name=self.name))
    # 设置日志回滚, 保存在log目录, 一天保存一个文件, 保留15天
    file_handler = TimedRotatingFileHandler(filename=str(file_path), when='D', interval=1, backupCount=15)
    file_handler.suffix = '%Y%m%d.log'
    if not level:
        file_handler.setLevel(self._level)
    else:
        file_handler.setLevel(level)
    formatter = logging.Formatter('%(asctime)s %(filename)s-line:%(lineno)d <%(name)s> [%(levelname)s] %(message)s')

    file_handler.setFormatter(formatter)
    self.file_handler = file_handler
    self.addHandler(file_handler)

__setStreamHandler__(level=None)

set stream handler :param level: :return:

Source code in cptools\logger.py
84
85
86
87
88
89
90
91
92
93
94
95
96
97
def __setStreamHandler__(self, level=None):
    """
    set stream handler
    :param level:
    :return:
    """
    stream_handler = logging.StreamHandler()
    formatter = logging.Formatter('%(asctime)s %(filename)s-line:%(lineno)d <%(name)s> [%(levelname)s] %(message)s')
    stream_handler.setFormatter(formatter)
    if not level:
        stream_handler.setLevel(self._level)
    else:
        stream_handler.setLevel(level)
    self.addHandler(stream_handler)