本帖最后由 不二晨 于 2018-12-24 14:41 编辑
日志字段信息与日志格式
一条日志信息对应的是一个事件的发生,而一个事件通常需要包括以下几个内容:
事件发生时间
事件发生位置
事件的严重程度--日志级别
事件内容
上面这些都是一条日志记录中可能包含的字段信息,当然还可以包括一些其他信息,如进程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信息')
---------------------
【转载】仅作分享,侵删
原文:https://blog.csdn.net/qq_24726509/article/details/83899397
|
|