logging 模块使用
1. logging
1.1 什么是 logging
logging
模块是 Python 内置的日志管理模块,不需要额外安装。
使用:
import logging
logging.critical('this is critical msg')
logging.error('this is error msg')
logging.warning('this is warning msg')
logging.info('this is info msg')
运行结果如下:
CRITICAL:root:this is critical msg
ERROR:root:this is error msg
WARNING:root:this is warning msg
默认只输出 warning
以上级别的日志,日志级别:
CRITICAL(严重错误) > ERROR > WARNING(默认) > INFO > DEBUG > NOTSET
默认日志格式:
LOGLEVEL:LOGGERNAME:msg
1.2 logging 模块中的几个重要概念
logging 中不得不知道的几个概念:Logger,Handler,Formatter,Filter
- Logger 记录器:暴露了应用程序代码能直接使用的接口。
- Handler 处理器:将(记录器产生的)日志记录发送至合适的目的地。
- Filter 过滤器:提供了更好的粒度控制,它可以决定输出哪些日志记录。
- Formatter 格式化器:指明了最终输出中日志记录的布局。
Logger 记录器
使用接口debug,info,warn,error,critical
之前必须创建Logger
实例:
# 创建 Logger 实例
logger = logging.getLogger(logger_name)
如果没有创建 Logger
实例,那么默认创建一个 root logger
,且默认日志级别为 warning
,处理器为 StreamHandler
(即将日志信息打印输出在屏幕上),输出格式为一个简单的使用程序输出格式。
logger 实例其他操作:
logger.setLevel(logging.ERROR) # 设置日志级别
logger.addHandler(handler_name) # 为Logger实例增加一个处理器
logger.removeHandler(handler_name) `# 为Logger实例删除一个处理器
Handler 处理器
常用 Handler 处理器有 :StreamHandler,FileHandler,NullHandler
创建方法:
# StreamHandler
sh = logging.StreamHandler(stream=None)
# FileHandler
fh = logging.FileHandler(filename, mode='a', encoding=None, delay=False)
# NullHandler
# 不做任何的格式化或者输出的 handler
根据处理器对象,可以设置日志级别、格式化日志增加或删除过滤器等操作:
sh.setLevel(logging.WARN) # 指定日志级别,低于WARN级别的日志将被忽略
sh.setFormatter(formatter_name) # 设置一个格式化器formatter
sh.addFilter(filter_name) # 增加一个过滤器,可以增加多个
sh.removeFilter(filter_name) # 删除一个过滤器
Handler 类型及作用:
类型 | 说明 |
---|---|
logging.StreamHandler | 指定向流对象进行 |
logging.FileHandler | 指定文件 |
logging.handlers.RotaingFileHandler | 指定文件,但可管理文件大小,当超过指定值后则重新创建日志文件 |
logging.handlers.TimedRotatingFileHandler | 指定文件,超过指定周期后重新创建日志文件 |
logging.handlers.SocketHandler | 指定socket |
logging.handlers.SyslogHandler | 指定syslog服务器 |
logging.handlers.HTTPHandler | 使用post/get请求提交数据到web服务器 |
更多关于 Handler 可以访问 Python logging.handlers
Formatter 格式化器
Formatter 格式化器可以用来指定日志输出格式,默认的时间格式为 %Y-%m-%d %H:%M:%S
。
创建方法:
# fmt:消息的格式化字符串,datefmt:日期字符串,若不指定 fmt,将使用'%(message)s'。若不指定 datefmt,将使用ISO8601日期格式
formatter = logging.Formatter(fmt=None, datefmt=None)
# 示例,指定输出当前时间、日志等级名字、线程名、消息
fmt = logging.Formatter('%(asctime)s - %(levelname)s - %(threadName)s - %(message)s')
fh = logging.FileHandler('/tmp/test.log')
格式化参数:
参数 | 说明 |
---|---|
%(name)s | Logger的名字 |
%(levelno)s | 数字日志级别 |
%(levelname)s | 文本日志级别 |
%(pathname)s | 调用日志输出函数的模块文件路径 |
%(filenames)s | 调用日志输出函数的模块文件名 |
%(module)s | 调用日志输出函数的模块名 |
%(funcName)s | 调用日志输出函数的函数名 |
%(lineno)d | 调用日志输出函数语句所在行号 |
%(created)f | 当前时间 |
%(relativeCreated)d | 当前时间 |
%(asctime)s | 当前时间,格式’2015-05-28 20:50:03,345’ |
%(thread)d | 线程id |
%(threadName)s | 线程名 |
%(process)d | 进程id |
%(message)s | 消息 |
Filter 过滤器
进行更为复杂的日志过滤,只允许特定 Logger
层次以下的事件通过。
创建方法:
filter = logging.Filter(name='')
Tips
Logger 是一个树状结构,它可以有多个处理器,一个处理器也可以有多个格式化器或过滤器,且日志级别可继承
示例
import logging
logger = logging.getLogger()
# 控制台 handler 对象,标准输出
# sh = logging.StreamHandler()
fh = logging.FileHandler(filename='test.log')
# 当前时间、日志等级名字、线程名、消息
fmt = logging.Formatter('%(asctime)s - %(levelname)s - %(threadName)s - %(message)s')
# 将格式添加到对象中
# sh.setFormatter(fmt)
fh.setFormatter(fmt)
# 添加到 logger 中
# logger.addHandler(sh)
logger.addHandler(fh)
logger.warning('This is a warning log...')
1.3 配置方式
logging 模块支持自定义配置,配置方式有:
- basicConfig:简单配置
- dictConfig:通过字典进行配置
- fileConfig:通过一个文件进行配置
- listen:通过一个端口进行配置
以上配置方式非必须,可以不使用以上方式配置,而直接调用 Logger 实例。
basicConfig
logging.basicConfig(level=logging.DEBUG, format='', datefmt='', filemode='', filename='', stream='')
# 示例
logging.basicConfig(filename='logger.log', level=logging.INFO)
参数:
关键字 | 描述 |
---|---|
filename | 创建一个 FileHandler,使用指定的文件名 |
filemode | 如果指明了文件名,指明打开文件的模式(如果没有指明filemode,默认为 a) |
format | 指定日志输出格式 |
datefmt | 指定日志输出时间/日期格式 |
level | 指定日志等级 |
stream | 创建 StreamHandler。与 filename 不兼容,如果两个都有,stream 被忽略 |
2. 在 Django 中使用 logging
Django 使用 Python 自带的 logging
模块作为日志打印工具。
日志级别:info
、debug
、error
、warning
、CRITICAL
。
logging
是线程安全的,其主要由以下四部分组成:
- Logger(记录器) :用户使用的直接接口,将日志传递给
Handler
- Handler(处理器) :控制日志输出到哪里,
console
,file
等(一个logger
可以有多个Handler
) - Filter(过滤器) :控制哪些日志可以从
logger
流向Handler
- Formatter(格式化器) :控制日志的格式
在 Django 中使用 logging
在 settings.py
最后添加如下代码:
BASE_LOG_DIR = os.path.join(BASE_DIR, "log")
LOGGING = {
'version': 1, # 保留字
'disable_existing_loggers': False, # 禁用已经存在的logger实例
# 日志文件的格式
'formatters': {
# 详细的日志格式
'standard': {
'format': '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]'
'[%(levelname)s][%(message)s]'
},
# 简单的日志格式
'simple': {
'format': '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'
},
# 定义一个特殊的日志格式
'collect': {
'format': '%(message)s'
}
},
# 过滤器
'filters': {
'require_debug_true': {
'()': 'django.utils.log.RequireDebugTrue',
},
},
# 处理器
'handlers': {
# 在终端打印
'console': {
'level': 'DEBUG',
'filters': ['require_debug_true'], # 只有在Django debug为True时才在屏幕打印日志
'class': 'logging.StreamHandler',
'formatter': 'simple'
},
# 默认的
'default': {
'level': 'INFO',
'class': 'logging.handlers.RotatingFileHandler', # 保存到文件,自动切
'filename': os.path.join(BASE_LOG_DIR, "xxx_info.log"), # 日志文件
'maxBytes': 1024 * 1024 * 50, # 日志大小 50M
'backupCount': 3, # 最多备份几个
'formatter': 'standard',
'encoding': 'utf-8',
},
# 专门用来记错误日志
'error': {
'level': 'ERROR',
'class': 'logging.handlers.RotatingFileHandler', # 保存到文件,自动切
'filename': os.path.join(BASE_LOG_DIR, "xxx_err.log"), # 日志文件
'maxBytes': 1024 * 1024 * 50, # 日志大小 50M
'backupCount': 5,
'formatter': 'standard',
'encoding': 'utf-8',
},
# 专门定义一个收集特定信息的日志
'collect': {
'level': 'INFO',
'class': 'logging.handlers.RotatingFileHandler', # 保存到文件,自动切
'filename': os.path.join(BASE_LOG_DIR, "xxx_collect.log"),
'maxBytes': 1024 * 1024 * 50, # 日志大小 50M
'backupCount': 5,
'formatter': 'collect',
'encoding': "utf-8"
}
},
'loggers': {
# 默认的logger应用如下配置
'': {
'handlers': ['default', 'console', 'error'], # 上线之后可以把'console'移除
'level': 'DEBUG',
'propagate': True, # 向不向更高级别的logger传递
},
# 名为 'collect'的logger还单独处理
'collect': {
'handlers': ['console', 'collect'],
'level': 'INFO',
}
},
}
在视图中使用 logging
from django.shortcuts import render, HttpResponse
import logging
# 生成一个以当前文件名为名字的logger实例
logger = logging.getLogger(__name__)
# 生成一个名为collect的logger实例
collect_logger = logging.getLogger("collect")
def index(request):
logger.debug("debug1。。。。")
logger.info("info1。。。。")
logger.debug("debug2")
collect_logger.info("用户:rose")
return HttpResponse("OK")
运行流程
logging 模块使用的更多相关文章
- Python Logging模块的简单使用
前言 日志是非常重要的,最近有接触到这个,所以系统的看一下Python这个模块的用法.本文即为Logging模块的用法简介,主要参考文章为Python官方文档,链接见参考列表. 另外,Python的H ...
- logging 模块误用导致的内存泄露
首先介绍下怎么发现的吧, 线上的项目日志是通过 logging 模块打到 syslog 里, 跑了一段时间后发现 syslog 的 UDP 连接超过了 8W, 没错是 8 W. 主要是 logging ...
- python logging模块详解[转]
一.简单将日志打印到屏幕: import logging logging.debug('debug message') logging.info('info message') logging.war ...
- python logging模块
1.logging模块提供了四个组件logger:日志类,有两个功能1)配置日志的等级,处理器handler,过滤器filterlogger.setLevel(logging.INFO)logger. ...
- python logging模块可能会令人困惑的地方
python logging模块主要是python提供的通用日志系统,使用的方法其实挺简单的,这块就不多介绍.下面主要会讲到在使用python logging模块的时候,涉及到多个python文件的调 ...
- Python之logging模块
一.引言 之前在写一些小程序的时候想把日志内容打到文件中,所以就自己写了一个logger.py的程序,如下: #!/usr/bin/python # -*- coding=utf-8 -*- impo ...
- logging模块转载博客
转载自:http://blog.csdn.net/zyz511919766/article/details/25136485 简单将日志打印到屏幕: [python] view plain copy ...
- Python中的logging模块
http://python.jobbole.com/86887/ 最近修改了项目里的logging相关功能,用到了python标准库里的logging模块,在此做一些记录.主要是从官方文档和stack ...
- Python中的日志管理Logging模块
1.基本的用法 import logging logging.debug('This is debug message') logging.info('This is info message') l ...
- Python日志输出——logging模块
Python日志输出——logging模块 标签: loggingpythonimportmodulelog4j 2012-03-06 00:18 31605人阅读 评论(8) 收藏 举报 分类: P ...
随机推荐
- c++中的重载、覆盖和隐藏
1 重载发生在同一个类内部. 同一个类内部,具有相同的函数名,但是参数列表不同,那么就是重载.因为c++编译器编译时,将函数名和函数列表一起对函数进行了重命名. 2 覆盖和隐藏发生在子类和父类之间. ...
- Flask:web表单
客户端发送的所有通过POST发出的请求信息都可以通过request.form获取.但是如果我们要生成表单的HTML代码和验证提交的表单数据那么就需要采用另外的方法.Flask-WTF扩展可以把处理we ...
- java中的clone方法
Java中对象的创建 clone顾名思义就是复制, 在Java语言中, clone方法被对象调用,所以会复制对象.所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创建一个新的对象.那 ...
- Pandas一些小技巧
Pandas有一些不频繁使用容易忘记的小技巧 1.将不同Dataframe写在一个Excel的不同Sheet,或添加到已有Excel的不同Sheet(同名Sheet会覆盖) from pandas i ...
- Java for LeetCode 084 Largest Rectangle in Histogram【HARD】
For example, Given height = [2,1,5,6,2,3], return 10. 解题思路: 参考Problem H: Largest Rectangle in a Hist ...
- 微信小程序开发:学习笔记[3]——WXSS样式
微信小程序开发:学习笔记[3]——WXSS样式 快速开始 介绍 WXSS(WeiXin Style Sheets)是一套用于小程序的样式语言,用于描述WXML的组件样式,也就是视觉上的效果. WXSS ...
- ruby 字符串
字符串处理函数 1.返回字符串的长度 str.length => integer 2.判断字符串中是否包含另一个串 str.include? other_str => true or fa ...
- python之virtualenv 与 virtualenvwrapper 详解
在使用 Python 开发的过程中,工程一多,难免会碰到不同的工程依赖不同版本的库的问题: 亦或者是在开发过程中不想让物理环境里充斥各种各样的库,引发未来的依赖灾难. 此时,我们需要对于不同的工程使用 ...
- IOS 状态栏 显示与隐藏网络活动状态
IOS中显示和隐藏状态栏的网络活动标志 //在向服务端发送请求状态栏显示网络活动标志: [[UIApplication sharedApplication] setNetworkActivityInd ...
- HAOI 2017 游记
省选 2017年4月23日 流水账式游记,不喜勿喷. Day0: 准备出发,上午敲了一顿板子,板子敲完了就打小游戏,老师也不管了. 过程中各种奶,说什么今年一定考仙人掌啦,今年一定考字符串啦,今年一定 ...