日志字段信息与日志格式
一条日志信息对应的是一个事件的发生,而一个事件通常需要包括以下几个内容:
-
事件发生时间
-
事件发生位置
-
事件的严重程度--日志级别
-
事件内容
上面这些都是一条日志记录中可能包含的字段信息,当然还可以包括一些其他信息,如进程ID、进程名称、线程ID、线程名称等。日志格式就是用来定义一条日志记录中包含那些字段的,且日志格式通常都是可以自定义的。
日志功能的实现
几乎所有开发语言都会内置日志相关功能,或者会有比较优秀的第三方库来提供日志操作功能,比如:log4j,log4php等。它们功能强大、使用简单。Python自身也提供了一个用于记录日志的标准库模块--logging。
logging模块是Python内置的标准模块,主要用于输出运行日志,可以设置输出日志的等级、日志保存路径、日志文件回滚等;相比print,具备如下优点:
-
可以通过设置不同的日志等级,在release版本中只输出重要信息,而不必显示大量的调试信息;
-
print将所有信息都输出到标准输出中,严重影响开发者从标准输出中查看其它数据;logging则可以由开发者决定将信息输出到什么地方,以及怎么输出。
1、 logging模块的日志级别
logging模块默认定义了以下几个日志等级,它允许开发人员自定义其他日志级别,但是这是不被推荐的,尤其是在开发供别人使用的库时,因为这会导致日志级别的混乱。
日志等级(level) 描述 DEBUG 最详细的日志信息,典型应用场景是 问题诊断 INFO 信息详细程度仅次于DEBUG,通常只记录关键节点信息,用于确认一切都是按照我们预期的那样进行工作 WARNING 当某些不期望的事情发生时记录的信息(如,磁盘可用空间较低),但是此时应用程序还是正常运行的 ERROR 由于一个更严重的问题导致某些功能不能正常运行时记录的信息 CRITICAL 当发生严重错误,导致应用程序不能继续运行时记录的信息
应用上线或部署生产环境时,应该使用WARNING或ERROR或CRITICAL级别的日志来降低机器的I/O压力和提高获取错误日志信息的效率。日志级别的指定通常都是在应用程序的配置文件中进行指定的。
-
上面列表中的日志等级是从上到下依次升高的,即:DEBUG < INFO < WARNING < ERROR < CRITICAL,而日志的信息量是依次减少的;
-
当为某个应用程序指定一个日志级别后,应用程序会记录所有日志级别大于或等于指定日志级别的日志信息,而不是仅仅记录指定级别的日志信息,nginx、php等应用程序以及这里的python的logging模块都是这样的。同样,logging模块也可以指定日志记录器的日志级别,只有级别大于或等于该指定日志级别的日志记录才会被输出,小于该等级的日志记录将会被丢弃。
-
logging模块定义的模块级别的常用函数
函数 说明 logging.debug(msg, *args, **kwargs) 创建一条严重级别为DEBUG的日志记录 logging.info(msg, *args, **kwargs) 创建一条严重级别为INFO的日志记录 logging.warning(msg, *args, **kwargs) 创建一条严重级别为WARNING的日志记录 logging.error(msg, *args, **kwargs) 创建一条严重级别为ERROR的日志记录 logging.critical(msg, *args, **kwargs) 创建一条严重级别为CRITICAL的日志记录 logging.log(level, *args, **kwargs) 创建一条严重级别为level的日志记录 logging.basicConfig(**kwargs) 对root logger进行一次性配置 其中
logging.basicConfig(**kwargs)
函数用于指定“要记录的日志级别”、“日志格式”、“日志输出位置”、“日志文件的打开模式”等信息,其他几个都是用于记录各个级别日志的函数。
默认情况下Python的logging模块将日志打印到了标准输出中,且只显示了大于等于WARNING级别的日志,这说明默认的日志级别设置为WARNING(日志级别等级CRITICAL > ERROR > WARNING > INFO > DEBUG)
#首先设置日志的名称,并指定日志的级别
#指定记录日志的路径,并设置记录日志的级别
#指定输出在cmd窗口的对象,并设置显示级别
#设置记录日志和显示窗口日志的格式
#将记录日志和显示窗口日志的格式分别加入相应的对象
#开始打印日志
#窗口显示日志与颜色的混用,配合ctypes使用,在linux中,不存在windll模块,c相关的不清楚,欢迎留言解决import logging,ctypes class Logger(): def __init__(self,path,clevel=logging.DEBUG,flevel=logging.DEBUG): self.logger=logging.getLogger(path) self.logger.setLevel(logging.DEBUG) fmt=logging.Formatter('[%(asctime)s] [%(levelname)s] %(message)s','%Y-%m-%d %H:%M:%S') #设置cmd日志 sh=logging.StreamHandler() sh.setFormatter(fmt) sh.setLevel(clevel) #设置文件日志 fh=logging.FileHandler(path) fh.setFormatter(fmt) fh.setLevel(flevel) #将设置好的加入logger对象 self.logger.addHandler(sh) self.logger.addHandler(fh) #设置窗口显示的错误级别的颜色 self.show_white=0x0007 self.show_blue=0x01 self.show_green=0x02 self.show_red=0x04 self.show_yellow=self.show_red|self.show_green self.std_output_handles=-11 self.std_output_handle=ctypes.windll.kernel32.GetStdHandle(self.std_output_handles) def debug(self,message): self.logger.debug(message) def info(self,message): self.logger.info(message) def war(self,message): color=self.show_yellow self.set_color(color) self.logger.warning(message) def error(self,message): color=self.show_red self.set_color(color) self.logger.error(message) def cri(self,message): self.logger.critical(message) def set_color(self,color): handle=self.std_output_handle bool=ctypes.windll.kernel32.SetConsoleTextAttribute(handle,color) return bool if __name__=='__main__': logyyx=Logger('/root/python_test/logs/alllog.log',logging.ERROR,logging.DEBUG) logyyx.debug('一个debug信息') logyyx.info('一个info信息') logyyx.war('一个warning信息') logyyx.error('一个error信息') logyyx.cri('一个致命的critical信息')