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 )
View Code
在 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传递
            },
        }
    }
View Code
在 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)
View Code

 

posted @ 2018-08-28 11:24  十七楼的羊  阅读(274)  评论(0编辑  收藏  举报