【Python】日志模块logging

这篇博客详细介绍了Python的logging模块,包括日志的基础概念、作用、等级及其组成。通过示例展示了如何创建日志收集器,设置级别,以及使用不同的日志输出渠道如控制台和文件。此外,还讲解了Formatter格式化器的用法,并给出了日志类的编写和配置文件的使用建议,结合异常处理和日志输出,强调了日志在软件开发中的重要性。

一.日志基础

1.什么是日志?

记录软件运行状态,几时几分,运行了什么模块,传递什么请求

2.日志的作用?

可以用来分析问题信息

3.日志等级?
  • [Debug]调式
  • [Error]:错误输出
  • [Warning]
  • [Critical]/[Fatal]
3.日志组成

日志收集器logger——系统默认是RootLogger

日志输出渠道handlers 控制台或者文件

二.示例

1.示例1
import logging


logging.debug("debug")
logging.info("info")
logging.warning("warning")
logging.error("error")
logging.critical("crital")

结果:系统默认的日志收集器就是级别是warming级别起步的,所以输出的日志是从

WARNING:root:warning
ERROR:root:error
CRITICAL:root:crital
2.示例2

1.定义一个日志收集器并设置级别

my_logger = logging.getLogger("python")
my_logger.setLevel("DEBUG")

2.指定输出渠道

  • StreamHandler——控制台
  • FileHandler 输出指定文件,设定级别
ch_1 = logging.StreamHandler()
ch = logging.FileHandler("text.log",encoding="UTF-8")
ch.setLevel("DEBUG")

3.建立连接

my_logger.addHandler(ch)

my_logger.debug("debug")
my_logger.info("info")
my_logger.warning("warning")
my_logger.error("error")
my_logger.critical("crital")

最后日志的输出级别是收集器和输出渠道的交集

4.关闭连接

my_logger.removeFilter(ch)
my_logger.removeFilter(ch_1)
3.Formatter 格式化器

单个格式设定

%(levelname)s

python语言设定格式

formatter = logging.Formatter("%(levelname)s")

ch = logging.StreamHandler()
ch.setLevel("DEBUG")
ch.setFormatter(formatter)

Formatter常用日志格式

formatter = logging.Formatter("[%(asctime)s]-[%(levelname)s]-%(filename)s-%(name)s-日志信息:%(message)s")


[2019-03-02 14:29:25,005]-[DEBUG]-py_log.py-pyLog-日志信息:debug
[2019-03-02 14:29:25,005]-[INFO]-py_log.py-pyLog-日志信息:info
[2019-03-02 14:29:25,005]-[WARNING]-py_log.py-pyLog-日志信息:warning
[2019-03-02 14:29:25,005]-[ERROR]-py_log.py-pyLog-日志信息:error
[2019-03-02 14:29:25,005]-[CRITICAL]-py_log.py-pyLog-日志信息:crital

常用Formatter格式:

格式信息
%(name)sLogger的名字
%(levelno)s数字形式日志级别
%(levelname)s文本形式的日志级别

三.作业

  • 1:编写一个日志类,能够实现输出文件到指定文件和console
  • 2:结合配置文件类实现日志类的可配置,具体参考老师的代码以及视频
  • 3:结合日志类以及do_excel类,加上异常判断 与日志输出
1.使用方式

可以和配置文件结合起来使用
可以和try except异常处理结合起来使用

作业

配置:

[LOG]
#log测试类
logger_name = py_log
logger_level = DEBUG
output_file_name = log.log
output_file_level = DEBUG
formatter = [%%(asctime)s]-[%%(levelname)s]-%%(filename)s-日志信息:%%(message)s

代码:

# 1:编写一个日志类,能够实现输出文件到指定文件和console
# 2:结合配置文件类实现日志类的可配置,具体参考老师的代码以及视频
# 3:结合日志类以及do_excel类,加上异常判断 与日志输出

import logging
import configparser


class MyLogger(object):

    def __init__(self):
        self.cf = configparser.ConfigParser()
        self.cf.read("log.conf", encoding="UTF-8")
        self.logger_name = self.cf.get("LOG", "logger_name")
        self.logger_level = self.cf.get("LOG", "logger_level")
        self.output_file_name = self.cf.get("LOG", "output_file_name")
        self.output_file_level = self.cf.get("LOG", "output_file_level")
        self.formatter = self.cf.get("LOG", "formatter")

    def my_log(self, level, msg):
        my_logger = logging.getLogger(self.logger_name)
        my_logger.setLevel(self.logger_level)

        ch = logging.StreamHandler()
        ch_1 = logging.FileHandler(self.output_file_name, encoding="UTF-8")
        ch.setLevel(self.output_file_level)

        formatter = logging.Formatter(self.formatter)
        ch.setFormatter(formatter)
        ch_1.setFormatter(formatter)

        my_logger.addHandler(ch)
        my_logger.addHandler(ch_1)

        if level == "DEBUG":
            my_logger.debug(msg)
        elif level == "INFO":
            my_logger.info(msg)
        elif level == "WARNING":
            my_logger.warning(msg)
        elif level == "ERROR":
            my_logger.error(msg)
        else:
            my_logger.critical(msg)

        my_logger.removeFilter(ch_1)
        my_logger.removeFilter(ch)

    def debug(self, msg):
        self.my_log("DEBUG", msg)

    def info(self, msg):
        self.my_log("INFO", msg)

    def error(self, msg):
        self.my_log("ERROR", msg)

    def warning(self, msg):
        self.my_log("WARNING", msg)

    def critical(self, msg):
        self.my_log("CRITICAL", msg)


if __name__ == '__main__':
    my = MyLogger()
    my.error("报错了")

————————————————————————————————————愿你被世界温柔所待,996式的上班给自己带来的或许就是紧凑,以及忙碌之后的空虚感,又或许自己本身就是一个不服输的人,不甘心比别人差,逼着自己去做很多事,但实际上又不情愿。讨厌这样的人,又会不得不成为这样的人。
记得很久前玩SIM4,捏了一个娃,从青少年时候,不断练习技能,去社交,去赚钱,去提高知名度成为名人,选择社区中最好看的娃结婚生子,或许赚了很多钱,技能满级,最后到老年时光,看到他那没多少的人生期望点数,这又有什么用呢?
一直很喜欢SIM游戏,练习技能只要花时间就会提高的,无论天赋,想交的朋友只要不断友善就会提高好感度,不论什么职业都是受尊重也不会被歧视。
我们不怕努力二字,只怕努力后一无所获。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值