logging 模块,django日志记录以及项目中的使用!
项目日志的配置组成!(官方文档)
Loggers 日志系统的入口,每个日志信息都会写入其中!并且规定了日志等级(每条消息都有)向记录器发出消息时,会将消息的日志级别与记录器的日志级别进行比较。如果邮件的日志级别达到或超过记录器本身的日志级别,则邮件将进行进一步处理
Handlers 确定记录器中每条消息发生情况的引擎。它描述了特定的日志记录行为,例如将消息写入屏幕,文件或网络套接字。处理程序也具有日志级别。如果日志记录的日志级别未达到或超过处理程序的级别,则处理程序将忽略该消息
Filters 过滤器 过滤器用于提供对从记录器到处理程序的日志记录传递的额外控制。默认情况下,将处理满足日志级别要求的任何日志消息。但是,通过安装筛选器,您可以在日志记录过程中添加其他条件
Formatters 日志记录需要呈现为文本。格式化程序描述该文本的确切格式。格式化程序通常由包含LogRecord属性的Python格式化字符串组成 。但是,也可以编写自定义格式化程序来实现特定的格式化行为
import logging # 将日志输出到一个文件之中 写入的方式是追加 比较方式是按照数字进行比较的 # %(asctime)s %(message)s 表示时间在信息的前面! # logging.basicConfig(filename='log.txt',level=logging.INFO, # format='%(asctime)s %(message)s',datefmt='%m/%d/%Y %I:%M:%S %p') # logging.debug("it is debug !") # logging.info("it is info") # logging.error("it is error") # create logger #指定 由什么触发的日志 # # logger 对象 logger = logging.getLogger('sxu') logger.setLevel(logging.DEBUG) # create console handler and set level to debug # 输出到屏幕 获取到屏幕操作对象 ch = logging.StreamHandler() # 全局的日志级别 局部必须要高全局 如果低于 就要按照全局的来! ch.setLevel(logging.DEBUG) # create file handler and set level to warning # 输出到文件! fh = logging.FileHandler("access.log") fh.setLevel(logging.WARNING) # create formatter # 定义输出个格式 formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') formatter_file = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s') # add formatter to ch and fh ch.setFormatter(formatter) fh.setFormatter(formatter_file) # add ch and fh to logger #注册到 logger 之中 指定自定义的输出格式 logger.addHandler(ch) logger.addHandler(fh) # 'application' code logger.debug('debug message') logger.info('info message') logger.warn('warn message') logger.error('error message') logger.critical('critical message')
Formatter可以指定以下输出格式
# -*- coding: utf-8 -*- import logging import sys '''常见logging用法''' # 获取logger实例,如果参数为空则返回root logger # logger 是全局变量 ,要保证调用一次,调用得多了,就会重复实现! # 在 flask之中是放在 current_app 之中的! # 这是最基本的入口,该方法参数可以为空, # 默认的logger名称是root,如果在同一个程序中一直都使用同名的logger,其实会拿到同一个实例 # 只要你在程序中使用过root logger,那么默认你打印的所有日志都算它一份 # 如果项目有人使用 root logger ,可以尝试试用一下方式进行关闭 # logging.getLogger().handlers = [] # 删除所有的handler # logging.getLogger().setLevel(logging.CRITICAL) # 将它的级别设置到最高 logger = logging.getLogger(__name__) # 指定logger输出格式 formatter = logging.Formatter( '%(asctime)s %(levelname)-8s: %(message)s' ) # 文件日志,输出到指定的文件之中! file_handler = logging.FileHandler( "test.log" ) ## 可以通过setFormatter指定输出格式 file_handler.setFormatter( formatter ) # 控制台日志 console_handler = logging.StreamHandler( sys.stdout ) console_handler.formatter = formatter # 也可以直接给formatter赋值 # 为logger添加的日志处理器 logger.addHandler( file_handler ) logger.addHandler( console_handler ) # 指定日志的最低输出级别,默认为WARN级别 logger.setLevel( logging.INFO ) # 输出不同级别的log # 比 print 更加对项目维护友好! logger.debug( 'this is debug info' ) logger.info( 'this is information' ) logger.warn( 'this is warning message' ) logger.error( 'this is error message' ) logger.fatal( 'this is fatal message, it is same as logger.critical' ) logger.critical( 'this is critical message' ) # 格式化输出 service_name = "Booking" logger.error('%s service is down!' % service_name) # 使用python自带的字符串格式化,不推荐 logger.error('%s service is down!', service_name) # 使用logger的格式化,推荐 logger.error('%s service is %s!', service_name, 'down') # 多参数格式化 logger.error('{} service is {}'.format(service_name, 'down')) # 使用format函数,推荐 # 等同于error级别,但是会额外记录当前抛出的异常堆栈信息 logger.exception('this is an exception message') #2018-08-28 11:02:31,138 INFO : this is information #2018-08-28 11:02:31,140 WARNING : this is warning message #2018-08-28 11:02:31,140 ERROR : this is error message #2018-08-28 11:02:31,140 CRITICAL: this is fatal message, it is same as logger.critical #2018-08-28 11:02:31,140 CRITICAL: this is critical message #2018-08-28 11:02:31,141 ERROR : Booking service is down! #2018-08-28 11:02:31,141 ERROR : Booking service is down! #2018-08-28 11:02:31,141 ERROR : Booking service is down! #2018-08-28 11:02:31,141 ERROR : Booking service is down # 移除一些日志处理器 logger.removeHandler( file_handler )
在 django 模块的使用(配置文件)!
LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'formatters': { 'verbose': { # 规定了输出格式! 'format': '%(levelname)s %(asctime)s %(module)s' '%(process)d %(thread)d %(message)s' }, }, 'handlers': { 'console': { 'class': 'logging.StreamHandler', 'formatter': 'verbose' }, 'default': { 'level':'DEBUG', 'class':'logging.handlers.RotatingFileHandler', 'filename': '/sourceDns/log/all.log', #日志输出文件 'maxBytes': 1024*1024*5, #文件大小 'backupCount': 5, #备份份数 'formatter':'standard', #使用哪种formatters日志格式 } }, 'loggers': { # 处理器的入口! '': { 'handlers': ['console'], #指定了 handlers 'level': 'DEBUG', 'propagate': True, }, 'django': { 'handlers': ['console'], 'level': 'INFO', 'propagate': True, # 向不向更高级别的logger传递 }, } }
在 django 中的使用!(django 代码)
# __name__通用,自动检测,如果不使用 __name__ 就要指定到当前 view.py,例如:test.app.view.py logger = logging.getLogger(__name__) try: mysql= connectMysql('127.0.0.1', '3306', 'david') except Exception,e: logger.error(e)