(4)logging(日志模块)
日志分成几个常用的级别
debug 10
代表程序调试过程中的信息
info 20
代表普通日志信息,用户的访问等等
warning 30
警告日志,有可能出错,但是目前还没出错的
error 40
程序明确的错误
critical 50
软件崩溃等严重的问题产生的日志
日志特点:向上传递
比如日志级别设置成30,那么30以下的则不会输出
日志实例
比如我需要产生相关级别的日志
logging.debug('debug...')
logging.info('info...')
logging.warning('warning...')
logging.error('error...')
logging.critical('critical...')
PS:默认日志级别是30
日志基本使用
logging.basicConfig(
format='%(asctime)s - %(name)s - %(levelname)s - %(module)s: %(message)s', #设置日志的格式
datefmt='%Y-%m-%d %H:%M:%S', #设置时间显示格式(如果用默认则不需要设置,这里不用写)
level=10, #设置日志的等级
)
acstime 代表日志的时间 #不设置有默认的格式,也可以在日志的开头设置
name 代表日志名 #日志名是由第一步logging的时候设定的参数
levelname 代表日志级别 #是由第六步设置的时候创建的
mouule 代表那个模块产生的日志 #这个是自动的
message 代表具体日志信息 #这里是由最后调用的时候传入的
logging模块的使用方式
第一步
logger #产生不同级别日志
logger1 = logger.gerlogger('这里传入日志名') #根据需求传入日志名
PS:logger是和handler关联的,并不是和formatter关联
第二步
handler #控制日志输出的位置 (终端或者文件)
sh=logging.StreamHandler() #往终端输出的
fh1 = logging.FileHandler(‘a1.log’,ending='utf-8) #往文件输出的,括号内可以指定文件的路径,文件的模式,字符编码
fh2 = logging.FileHandler('a2'.log,ending='utf-8)
第三步
formatter #控制logger对象的日志格式
formatter1=logging.Formatter() #生成日志格式,括号内可以指定日志格式fmt、单独修改时间的格式datefmt
fmt='%(asctime)s - %(name)s - %(levelname)s - %(module)s: %(message)s',
datefmt='%Y-%m-%d %H:%M:%S %p',
formatter2=logging.Formatter() #生成日志格式,括号内可以指定日志格式fmt、单独修改时间的格式datefmt
fmt='%(asctime)s - %(message)s',
datefmt='%Y-%m-%d %H:%M:%S %p',
PS:这里生成的格式数量不限
第四步
建立logger对象与handler对象的关联关系
logger1.addHandler('sh') #这里用addHandler方法将第二步的日志输出位置传入括号内
logger1.addHandler('fh1')
logger1.addHandler('fh2')
第五步
建立handler对象与formatter对象的关联关系
sh.serFormatter(formatter1) #这里用setFormatter方法将第三步定义的格式捆绑给第二步
f1.serFormatter(formatter2)
f2.serFormatter(formatter2)
第六步
设置日志级别
logger1.setLevel(10) #这里定义logger1的日志通过级别
sh.serLevel(10) #这里定义handler的日志通过级别
fh1.serLevel(10)
fh2.serLevel(10)
PS:由于sh、fh1、fh2都是捆绑在logger1层的下面,所以logger1的日志级别必须和下面捆绑层的级别一样才能放行
第七部
产生日志(logger1.xxx 这里xxx可以自己定义需要调用的日志种类)
logger1.debug(‘这里就是传入message需要的信息,可以自己写’) #这一步是调用日志
关系示意图

PS:logger生成日志给handler,然后handler在输出的时候已经提前绑定了一个标准化的格式,所以一个fomatter可以给多handler用
PS:logger可以设置日志级别,但是logger设置了级别后handler一定要设置一样的级别,不然会出现logger如果级别过高,hanlder设置低级别日志,那么logger不放行,则handler无法生成需要的日志,反过来handler也同理
logging模块最终的用法(这个是写在setting文件下的)
import logging """
logging配置
"""
logfile_path='bbb.log' #这里写到项目就要做一个绝对路径,就是用os模块下的sys获取一个绝对路径 # 定义三种日志输出格式 开始 standard_format = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]' \
'[%(levelname)s][%(message)s]' #其中name为getlogger指定的名字,这里的格式不限, simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s' # log配置字典
LOGGING_DIC = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'standard': { #standard(标准格式)就是相当于自定义一的日志格式名称,完全可以自定义
'format': standard_format #这个format不能变是固定格式,能变的也就是后面的value这个变量
},
'simple': { #simple(简单格式)就是相当于自定义一的日志格式名称,完全可以自定义
'format': simple_format #这个format不能变是固定格式,能变的也就是后面的value这个变量
},
},
'filters': {},
'handlers': { #这里的下面可以设置多个级别的日志
#console打印到终端的日志
'console': { #这里的console是可以变的,就是我们自定义的输出位置,就相当于第二步的sh、fh1这样的变量名
'level': 'DEBUG', #这里设置一个日志的级别
'class': 'logging.StreamHandler', # 打印到屏幕
'formatter': 'simple' #这里和日志的格式做一个关联,不能乱写,就是formatters下面定义的日志格式
}
#default打印到文件的日志,收集info及以上的日志
'default': {
'level': 'DEBUG',
'class': 'logging.FileHandler', # 保存到文件
'formatter': 'standard',#这里和日志的格式做一个关联,不能乱写,就是formatters下面定义的日志格式
'filename': logfile_path, # 日志文件的变量
'encoding': 'utf-8', # 日志文件的编码,再也不用担心中文log乱码了
},
},
'loggers': { #这里也不限数量,下面的日志名可以自己定义多个种类,比如值打印到终端或者两者都打印
#logging.getLogger(__name__)拿到的logger配置
'': { #这里日志名为空,当用户调用的时候就可以用这个默认的配置去写入,这样就把日志名写活了,不用去写重复代码
'handlers': ['default', 'console'], # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
'level': 'DEBUG',
},
},
}
最后要写一个common调用日志变量的模块
import logging.config
import settings def get_logger(name):
logging.config.dictConfig(settings.LOGGING_DIC) #dictConfig从字典中加载配置(setting模块下的'字典名称')
logger1=logging.getLogger('这里的变量就是你要指定的日志名') #这里就是调用模块中的字典下的一个key(loggers)
#下的一个key(你所写的日志名),并且将返回值放到变量
return logger1
在业务逻辑中调用
import common (这个模块下的函数功能)
#业务逻辑里面进行调用
logger1=get_logger('用户交易') #这里调用字典下loggers下面的功能,就是日志名
logger1.debug('调试信息') #这里就是你要写入日志信息的内容 logger2=get_logger('用户权限')
logger2.debug('权限相关问题.....')
日志中标准化格式%详解
可在logging.basicConfig()函数中通过具体参数来更改logging模块默认行为,可用参数有
filename:用指定的文件名创建FiledHandler(后边会具体讲解handler的概念),这样日志会被存储在指定的文件中。
filemode:文件打开方式,在指定了filename时使用这个参数,默认值为“a”还可指定为“w”。
format:指定handler使用的日志显示格式。
datefmt:指定日期时间格式。
level:设置rootlogger(后边会讲解具体概念)的日志级别
stream:用指定的stream创建StreamHandler。可以指定输出到sys.stderr,sys.stdout或者文件,默认为sys.stderr。若同时列出了filename和stream两个参数,则stream参数会被忽略。 #格式
%(name)s:Logger的名字,并非用户名,详细查看 %(levelno)s:数字形式的日志级别 %(levelname)s:文本形式的日志级别 %(pathname)s:调用日志输出函数的模块的完整路径名,可能没有 %(filename)s:调用日志输出函数的模块的文件名 %(module)s:调用日志输出函数的模块名 %(funcName)s:调用日志输出函数的函数名 %(lineno)d:调用日志输出函数的语句所在的代码行 %(created)f:当前时间,用UNIX标准的表示时间的浮 点数表示 %(relativeCreated)d:输出日志信息时的,自Logger创建以 来的毫秒数 %(asctime)s:字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒 %(thread)d:线程ID。可能没有 %(threadName)s:线程名。可能没有 %(process)d:进程ID。可能没有 %(message)s:用户输出的消息
(4)logging(日志模块)的更多相关文章
- logging 日志模块学习
logging 日志模块,用于记录系统在运行过程中的一些关键信息,以便于对系统的运行状况进行跟踪,所以还是灰常重要滴,下面我就来从入门到放弃的系统学习一下日志既可以在屏幕上显示,又可以在文件中体现. ...
- logging日志模块
为什么要做日志: 审计跟踪:但错误发生时,你需要清除知道该如何处理,通过对日志跟踪,你可以获取该错误发生的具体环境,你需要确切知道什么是什么引起该错误,什么对该错误不会造成影响. 跟踪应用的警告和错误 ...
- python 自动化之路 logging日志模块
logging 日志模块 http://python.usyiyi.cn/python_278/library/logging.html 中文官方http://blog.csdn.net/zyz511 ...
- day31 logging 日志模块
# logging 日志模块 ****** # 记录用户行为或者代码执行过程 # print 来回注释比较麻烦的 # logging # 我能够“一键”控制 # 排错的时候需要打印很多细节来帮助我排错 ...
- logging日志模块的使用
logging日志模块的使用 logging模块中有5个日志级别: debug 10 info 20 warning 30 error 40 critical 50 通常使用日志模块,是用字典进行配置 ...
- Python入门之logging日志模块以及多进程日志
本篇文章主要对 python logging 的介绍加深理解.更主要是 讨论在多进程环境下如何使用logging 来输出日志, 如何安全地切分日志文件. 1. logging日志模块介绍 python ...
- Python 中 logging 日志模块在多进程环境下的使用
因为我的个人网站 restran.net 已经启用,博客园的内容已经不再更新.请访问我的个人网站获取这篇文章的最新内容,Python 中 logging 日志模块在多进程环境下的使用 使用 Pytho ...
- Python logging(日志)模块
python日志模块 内容简介 1.日志相关概念 2.logging模块简介 3.logging模块函数使用 4.logging模块日志流处理流程 5.logging模块组件使用 6.logging配 ...
- 约束、自定义异常、hashlib模块、logging日志模块
一.约束(重要***) 1.首先我们来说一下java和c#中的一些知识,学过java的人应该知道,java中除了有类和对象之外,还有接口类型,java规定,接口中不允许在方法内部写代码,只能约束继承它 ...
- pyhton——logging日志模块的学习
https://www.cnblogs.com/yyds/p/6901864.html 本节内容 日志相关概念 logging模块简介 使用logging提供的模块级别的函数记录日志 logging模 ...
随机推荐
- import 与 import static
原文链接:https://www.geeksforgeeks.org/static-import-java/ java中的静态引用 直接解释 一般引入类的方式:import java.lang.Mat ...
- JELLYFISH - Fast, Parallel k-mer Counting for DNA
kmer分析其实是非常耗费计算资源的,如果我们自己写脚本来分析kmer的话,首先要将所有的序列打断成一定长度的kmer,然后将所有的kmer存储起来,最后统计每个kmer出现的频率,或者统计出现指定次 ...
- java服务突然被挂掉,停止服务处理方案
一.问题背景 该问题出现在我们测试环境.测试环境部署了很多java应用. 其中一个数据服务(主要提供订单交易数据聚合查询),用着用着就服务挂掉了也就是进程没有了. 二.分析过程 1.了解服务器配置 ...
- Ubuntu中vi命令的编辑模式异常
今天更改Ubuntu软件源的时候,进入源文件的编辑模式时,发现删除键和编辑都不能正常使用,百度之后,知道是由于Ubuntu预装的是vim-tiny,而我们需要使用vim-full.在此记录下该问题以便 ...
- Graph (floyd)
Description Everyone knows how to calculate the shortest path in a directed graph. In fact, the oppo ...
- Oracle12c中数据删除(delete)新特性之数据库内归档功能
有些应用有“标记删除”的概念,即不是删除数据,而是数据依然保留在表中,只是对应用不可见而已.这种需求通常通过如下方法实现: 1) 给相关表增加一个另外的列,该列存储标志数据被删除的标记. 2) 给 ...
- JavaScript学习总结(五)——Javascript中==和===的区别
一.JavaScript"=="的作用 当==两边的内容是字符串时,则比较字符串的内容是否相等. 当==两边的内容是数字时,则比较数字的大小是否相等. 当==两边的内容是对象或者是 ...
- Keil 中文显示乱码解决办法
在将代码文件转换成UTF-8之前还要把Keil的环境也设置成UTF-8的模式,方法是:“Edit”——〉“Configuration...”——〉“Encoding”,选择“Encode in UTF ...
- poj2892
题解: 答案=后缀-前缀-1 如果被轰了,那么就时0 在一开始加入0,n+1,保证有前缀后缀 代码: #include<cstdio> #include<cmath> #inc ...
- noip2005循环
题解: 迭代,一次次k累加计算 代码: #include<bits/stdc++.h> using namespace std; ; ][N],ans[N]; char s[N]; boo ...