python--杂识--11--logging

文章展示了如何在Python中使用logging模块进行基本的日志记录,包括设置错误级别、格式化输出。然后,它介绍了更高级的用法,如自定义日志上下文类,实现彩色日志输出,并提供了一个装饰器来改变日志的颜色和格式。最后,示例展示了如何将日志输出到文件,并根据日志级别显示不同颜色。
摘要由CSDN通过智能技术生成

1 简单使用

import logging


logging.basicConfig(level=logging.ERROR, format='[%(levelname)s-%(asctime)s-PID:%(process)d-%(filename)s->%(funcName)s-line:%(lineno)d]: %(message)s')

def test():
	try:
		5/0
	except Exception as e:
	    logging.error(e)


if __name__ == "__main__":
    test()


"""
运行结果:
[root@Chasing-Dreams test]#  python test.py 
[ERROR-2023-04-11 17:10:06,385-PID:6062-test.py->test-line:10]: division by zero
"""

2 高级使用

import logging
import colorlog

class LoggerContext:
    def __init__(self, name="logger", level=logging.DEBUG, log_file="log.log"):
        self.name = name
        self.level = level
        self.logger = None
        self.log_file = log_file

    def __enter__(self):
        self.logger = logging.getLogger(self.name)
        self.logger.setLevel(self.level)
        # 创建控制台输出处理器
        console_handler = logging.StreamHandler()
        console_handler.setLevel(self.level)

        # 创建文件输出处理器
        file_handler = logging.FileHandler(self.log_file)
        file_handler.setLevel(self.level)

        # 设置日志格式
        log_format = '%(log_color)s[%(asctime)s-%(name)s-%(levelname)s-%(filename)s:%(lineno)d]:%(reset)s %(message)s'
        formatter = colorlog.ColoredFormatter(log_format,
                                              datefmt='%Y-%m-%d %H:%M:%S',
                                              log_colors={
                                                  'DEBUG': 'white',
                                                  'INFO': 'green',
                                                  'WARNING': 'yellow',
                                                  'ERROR': 'red',
                                                  'CRITICAL': 'bold_red,bg_white',
                                              })
        console_handler.setFormatter(formatter)
        file_handler.setFormatter(formatter)

        # 添加处理器到 logger 对象
        self.logger.addHandler(console_handler)
        self.logger.addHandler(file_handler)
        return self.logger

    def __exit__(self, exc_type, exc_value, traceback):
        # 清除 logger 对象的处理器
        for handler in self.logger.handlers[:]:
            self.logger.removeHandler(handler)


def main():
    logger.debug("这是一条DEBUG日志")
    logger.info("这是一条INFO日志")
    logger.warning("这是一条WARNING日志")
    logger.error("这是一条ERROR日志")
    logger.critical("这是一条CRITICAL日志")


if __name__ == "__main__":
    with LoggerContext(level=logging.INFO) as logger:
        main()


"""
运行结果:
(base) [root@Chasing-Dreams test]# python test.py 
[2023-12-29 14:06:19-logger-DEBUG-test.py:47]: 这是一条DEBUG日志       # 白色
[2023-12-29 14:06:19-logger-INFO-test.py:48]: 这是一条INFO日志         # 绿色
[2023-12-29 14:06:19-logger-WARNING-test.py:49]: 这是一条WARNING日志   # 黄色
[2023-12-29 14:06:19-logger-ERROR-test.py:50]: 这是一条ERROR日志       # 红色
[2023-12-29 14:06:19-logger-CRITICAL-test.py:51]: 这是一条CRITICAL日志 # 白底红色
"""
import logging


def set_logger(log_level=logging.ERROR, log_file="/var/log/log.log"):
    def add_log_color(fn):
        def new(*args):
            yellow = "\x1b[33m"
            red = "\x1b[31m"
            green = "\x1b[32m"
            blue = "\x1b[36m"
            normal = "\x1b[0m"
            levelno = args[1].levelno
            if levelno >= logging.CRITICAL:
                color = red
            elif levelno >= logging.ERROR:
                color = red
            elif levelno >= logging.WARNING:
                color = yellow
            elif levelno >= logging.INFO:
                color = green
            elif levelno >= logging.DEBUG:
                color = blue
            else:
                color = normal
            try:
                args[1].msg = color + str(args[1].msg) + normal
            except Exception as e:
                print(e)
            args[1].levelname = color + args[1].levelname + normal
            args[1].pathname = args[1].pathname.replace("[此处写脚本所在目录,绝对路径]", "../")
            return fn(*args)
        return new

    logging.StreamHandler.emit = add_log_color(logging.StreamHandler.emit)
    logging.basicConfig(level=log_level,
                        filename=log_file,
                        format="%(asctime)s-%(levelname)-16s-[%(pathname)-20s:%(funcName)-15s:%(lineno)-4d] - %(message)s",
                        datefmt="%Y-%m-%d %H:%M:%S")


def main():
    set_logger(log_level=logging.DEBUG, log_file="log.log")
    logging.debug("这是一条DEBUG日志")
    logging.info("这是一条INFO日志")
    logging.warning("这是一条WARNING日志")
    logging.error("这是一条ERROR日志")
    logging.critical("这是一条CRITICAL日志")


if __name__ == "__main__":
    main()


"""
运行结果:
(base) [root@Chasing-Dreams test]# python test.py 
(base) [root@Chasing-Dreams test]# tailf log.log 
2024-02-01 16:17:47-DEBUG  -[/tools/test/test2.py:main           :43  ] - 这是一条DEBUG日志      # 蓝色
2024-02-01 16:17:47-INFO   -[/tools/test/test2.py:main           :44  ] - 这是一条INFO日志       # 绿色
2024-02-01 16:17:47-WARNING-[/tools/test/test2.py:main           :45  ] - 这是一条WARNING日志    # 黄色
2024-02-01 16:17:47-ERROR  -[/tools/test/test2.py:main           :46  ] - 这是一条ERROR日志      # 红色
2024-02-01 16:17:47-CRITICAL-[/tools/test/test2.py:main           :47  ] - 这是一条CRITICAL日志  # 红色

"""
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值