Log日志

981 阅读3分钟

1.log是什么?

Log就是记录操作系统或者软件中发生的事件,或者记录网络聊天软件中用户护发的消息并存储在相应的文件中,以方便后期对软件的开发和调试等

2.为什么需要使用log日志?

一个好的log系统,录入的时间,录入的信息,进程线程的ID这些基本信息得应该有吧,然后更重要的还是需要给不同的log设置不同的级别,这样后期运维,查bug等才能快速地定位。

3.log日志等级?

log一般分为5个级别,Debug, Info, Warning, Error, Fatal, 其中每个级别如何选择,以及储存log的字体颜色也很有讲究

4.每个等级的意义?

一般来说,Debug是log中最普通常见,等级也是最低的。Debug的信息,可以让你更了解系统以及软件的状态,运行逻辑,或者一些变量信息等,合理使用Debug信息,对软件调试环境很有用,一般采用系统默认颜色,黑色或灰色储存。

Info的信息,是需要反馈给用户看的,需要让用户明白你的软件目前在干什么,Info这种东西,其实也可以看做是软件交互上面的一部分。同样,因为Info需要展现给用户看,并让用户明白,所以Info里面的信息也需要写得更详细,也应该包含更少的技术细节,一般Info采用白色的字体来储存。

剩下的Warning, Error, Fatal也都是表示程序不能够按照设计思路的正常运行,级别也更高,也需要更加留意

当Warning信息出现的时候,就意味着,程序无法自行处理目前的情况,可能需要程序员干涉看看是怎么回事。有Warning出现的时候,程序虽然可以依旧运行,但是并不能保证未来程序还能运行,可能Warning到后来也会变成一个Error,所以需要程序员留意一下,一般Warning可以用黄色的字体储存。

当有Error信息出现的时候,内部代码可能某个地方需要检查一下。一般大型项目里面都包含了异常处理,所以可能Error出现的时候,程序依旧能正常运行,不过这个时候还是需要程序员来处理,所以才有Error这种级别的log,一般也用红色的字体储存,更能让程序员注意到。

如果一个程序出现Fatal这种最高级别的log,那就意味着,程序已经崩溃,需要程序员紧急修复的情况了。储存Fatal这种级别的log,应该比Error更能让人注意到,可以选择紫色或者更鲜艳的红色存储Fatal信息。

每个级别对应的数字值为 CRITICAL:50,ERROR:40,WARNING:30,INFO:20,DEBUG:10,NOTSET:0。 Python 中日志的默认等级是 WARNING,DEBUG 和 INFO 级别的日志将不会得到显示,在 logging 中更改设置

5.日志Demo


import logging
import os
import time
from logging import handlers


class Logger(object):
    # 日志级别关系映射
    level_relations = {
        'debug': logging.DEBUG, 'info': logging.INFO, 'warning': logging.WARNING,
        'error': logging.ERROR, 'critical': logging.CRITICAL
    }

    def __init__(self,log_path,level):
        # 创建日志文件名
        self.filename = "{}.log".format(time.strftime("%Y%m%d", time.localtime()))

        self.logger = logging.getLogger(self.filename)

        # 设置文件路径
        # filename = os.fspath(filename)
        if not os.path.exists(log_path):
            os.mkdir(log_path)
        # self.baseFilename = os.path.join(log_path, filename)
        abspath = os.path.dirname(os.path.abspath(__file__))
        self.directory = os.path.join(abspath, log_path)

        self.baseFilename = os.path.join(self.directory, self.filename)

        # 设置日志等级
        self.logger.setLevel(self.level_relations.get(level))

        # 加载日志配置
        self.logconfig()

    def logconfig(self):
        '''日志配置'''

        # 日志输出格式配置
        fmt = '%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s'
        format_str = logging.Formatter(fmt)

        # 将日志文件发送到终端
        stream_hander = logging.StreamHandler()
        stream_hander.setFormatter(format_str)

        # 将日志文件发送到磁盘文件
        # file_hander = logging.FileHandler(filename=self.baseFilename,mode='a',encoding="UTF-8")
        # file_hander.setFormatter(format_str)

        # 将日志文件发送磁盘并且设置文件大小,自动切割
        file_hander_r = logging.handlers.RotatingFileHandler(filename=self.baseFilename,mode='a',encoding="UTF-8",maxBytes=100*1024*1024,backupCount=10)
        file_hander_r.setFormatter(format_str)

        # 将终端打印和日志保存操作 添加到handler处理
        self.logger.addHandler(stream_hander)
        # self.logger.addHandler(file_hander)
        self.logger.addHandler(file_hander_r)

    def getlogger(self):
        return self.logger

if __name__ == '__main__':
    logger = Logger('log',level="info").getlogger()
    logger.info("我是李小龙!")


6.定时清除系统日志文件

www.cnblogs.com/grimm/p/879…

7.参考文章

juejin.cn/post/684490…