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("我是李小龙!")