day35-常见内置模块四(logging模块)
一、函数式简单配置(低配)
1、只能在屏幕上显示,或者写入文件,不能同时进行
import logging
logging.debug('调试')
logging.info('正常运行')
logging.warning('警告')
logging.warn('警告') #"The 'warn' function is deprecated(不赞成,反对), "use 'warning' instead"
logging.error('错误')
logging.critical('严重警告') 默认格式只显示 级别:Logger名称:用户输出信息
# WARNING:root:警告
# WARNING:root:警告
# ERROR:root:错误
# CRITICAL:root:严重警告
2、也可以设置日志格式后再显示
import logging
logging.basicConfig(level=logging.DEBUG,
# level=10,也可以用数字表示级别,级别从低到高依次是10,20,30,40,50
format='%(asctime)s %(filename)s [line:%(lineno)d) %(levelname)s %(message)s]',
datefmt='%Y-%m-%d %H:%M:%S', #2018-12-01 11:13:24
# datefmt='%a %d %b %Y %H:%M%S', # 日期格式 Sat 01 Dec 2018 11:1659
filename='a.log', #日志可以写到指定文件中,默认是a追加模式,且编码是GBK
# filemode='w' #可以更改写入文件的模式,但是实际中一般也不改
)
logging.debug('调试日志')
logging.info('运行日志')
logging.warning('警告日志')
logging.error('错误日志')
logging.critical('严重警告日志')
# 2018-12-01 11:25:15 test.py [line:25) DEBUG 调试日志]
# 2018-12-01 11:25:15 test.py [line:26) INFO 运行日志]
# 2018-12-01 11:25:15 test.py [line:27) WARNING 警告日志]
# 2018-12-01 11:25:15 test.py [line:28) WARNING 警告日志]
# 2018-12-01 11:25:15 test.py [line:29) ERROR 错误日志]
# 2018-12-01 11:25:15 test.py [line:30) CRITICAL 严重警告日志]
二、logger对象配置(标配)
可以设置在屏幕显示和写入文件
import logging #创建logging对象
logger = logging.getLogger() #创建文件对象
fh1 = logging.FileHandler('a1.log', encoding='utf-8')
fh2 = logging.FileHandler('a2.log', encoding='utf-8') #创建屏幕对象
sh = logging.StreamHandler() #分别设置日志格式
formater1 = logging.Formatter(
fmt='%(asctime)s %(filename)s [line:%(lineno)d) %(levelname)s %(message)s]',
datefmt='%Y-%m-%d %H:%M:%S'
) formater2 = logging.Formatter(
fmt='%(asctime)s %(filename)s %(levelname)s %(message)s]',
datefmt='%Y-%m-%d %H:%M:%S'
) formater3 = logging.Formatter(
fmt='%(asctime)s %(filename)s [line:%(lineno)d) %(levelname)s %(message)s]',
datefmt='%a %d %b %Y %H:%M%S'
) #给对象绑定格式
fh1.setFormatter(formater1)
fh2.setFormatter(formater2)
sh.setFormatter(formater3) logger.addHandler(fh1)
logger.addHandler(fh2)
logger.addHandler(sh) logger.setLevel(20) #logger级别设置为20
fh1.setLevel(30) #fh1级别设置为30,要比logger级别高才可以,否则按logger级别为准
fh2.setLevel(30) #fh2级别设置为30,要比logger级别高才可以,否则按logger级别为准
sh.setLevel(40) #sh级别设置为40,要比logger级别高才可以,否则按logger级别为准 logging.debug('调试日志')
logging.info('运行日志')
logging.warning('警告日志')
logging.error('错误日志')
logging.critical('严重警告日志') #a1.log
# 2018-12-01 12:07:18 test.py [line:84) WARNING 警告日志]
# 2018-12-01 12:07:18 test.py [line:85) ERROR 错误日志]
# 2018-12-01 12:07:18 test.py [line:86) CRITICAL 严重警告日志] # a2.log
# 2018-12-01 12:07:18 test.py WARNING 警告日志]
# 2018-12-01 12:07:18 test.py ERROR 错误日志]
# 2018-12-01 12:07:18 test.py CRITICAL 严重警告日志] # 屏幕显示
# Sat 01 Dec 2018 12:0718 test.py [line:85) ERROR 错误日志]
# Sat 01 Dec 2018 12:0718 test.py [line:86) CRITICAL 严重警告日志]
logging库提供了多个组件:Logger、Handler、Filter、Formatter。
Logger对象提供应用程序可直接使用的接口
Handler发送日志到适当的目的地
Filter提供了过滤日志信息的方法
Formatter指定日志显示格式
另外,可以通过:logger.setLevel(logging.Debug)设置级别,当然,也可以通过fh.setLevel(logging.Debug)单对文件流设置某个级别。
三、logger的配置文件(高配)
有的同学习惯通过logger的对象配置去完成日志的功能,但是上面这种方式需要创建各种对象,比如logger对象,fileHandler对象,ScreamHandler对象等等,比较麻烦,那么下面给你提供一种字典的方式,创建logger配置文件,这种才是工作中经常使用的实现日志功能的方法。
import os
import logging.config #自定义三种日志输出格式
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' id_simple_format = '[%(levelname)s] [%(asctime)s] %(message)s' #定义日志文件路径
logfile_name = 'log_test.log'
logfile_dir = os.path.dirname(__file__)
logfile_path = os.path.join(logfile_dir, logfile_name) #log配置字典
LOGGING_DIC = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'standard': {
'format': standard_format #调用上面定义的日志格式
},
'simple': {
'format': simple_format #调用上面定义的日志格式
},
},
'filters': {},
'handlers': {
#打印到终端的日志
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler', #打印到屏幕
'formatter': 'simple' #调用上面键值对的key
},
#打印到文件的日志
'default' :{
'level': 'DEBUG',
'class': 'logging.handlers.RotatingFileHandler', #保存到文件,使用循环切片的方法保存
'formatter': 'standard',
'filename': logfile_path, #调用上面定义的日志文件路径
'maxBytes': 1024*1024*100, #日志文件大小,这里设置最大为100M
'backupCount': 5, #日志文件个数,这里设置最多5个
'encoding': 'utf-8', #这里可以设置文件编码,不用担心乱码了
}
},
'loggers':{
#logging.getLogger(__name__)拿到的logger配置
'':{
'handlers': ['default', 'console'], #这里把上面定义的两个handler都加上,可以实现log既打印到屏幕又写入文件
'level': 'DEBUG', #设置日志级别,要低于或等于上面分别设置的日志级别
'propagate': True, #向上(更高level的logger)传递,一般不改
},
},
} #定义打印日志的函数get_log
def get_log():
logging.config.dictConfig(LOGGING_DIC) #导入上面定义的logging的字典配置
logger = logging.getLogger(__name__) #生成一个logger实例
logger.debug('调试日志')
logger.info('运行日志')
logger.warning('警告日志')
logger.error('错误日志')
logger.critical('严重警告日志') #调用get_log函数
get_log() # 屏幕显示结果:
# [DEBUG][2018-12-01 14:34:00,348][test.py:62]调试日志
# [INFO][2018-12-01 14:34:00,348][test.py:63]运行日志
# [WARNING][2018-12-01 14:34:00,348][test.py:64]警告日志
# [ERROR][2018-12-01 14:34:00,349][test.py:65]错误日志
# [CRITICAL][2018-12-01 14:34:00,349][test.py:66]严重警告日志
#
# log_test.log文件保存结果:
# [2018-12-01 14:34:00,348][MainThread:6492][task_id:__main__][test.py:62][DEBUG][调试日志]
# [2018-12-01 14:34:00,348][MainThread:6492][task_id:__main__][test.py:63][INFO][运行日志]
# [2018-12-01 14:34:00,348][MainThread:6492][task_id:__main__][test.py:64][WARNING][警告日志]
# [2018-12-01 14:34:00,349][MainThread:6492][task_id:__main__][test.py:65][ERROR][错误日志]
# [2018-12-01 14:34:00,349][MainThread:6492][task_id:__main__][test.py:66][CRITICAL][严重警告日志]
上面打印出来的task_id都是相同的,如果想要不同应用系统打印不同的task_id,可以在调用日志函数的时候传入task_id名称
#定义打印日志的函数get_log
def get_log(taskname):
logging.config.dictConfig(LOGGING_DIC) #导入上面定义的logging的字典配置
logger = logging.getLogger(taskname) #生成一个logger实例
return logger #调用get_log函数
log_a = get_log('a系统')
log_a.warning('警告日志') log_b = get_log('b系统')
log_b.error('错误日志') log_c = get_log('c系统')
log_c.critical('严重警告日志') # 屏幕显示结果:
[WARNING][2018-12-03 13:35:19,359][test.py:120]警告日志
[ERROR][2018-12-03 13:35:19,360][test.py:123]错误日志
[CRITICAL][2018-12-03 13:35:19,361][test.py:126]严重警告日志 # log_test.log文件保存结果:
[2018-12-03 13:35:19,359][MainThread:6940][task_id:a系统][test.py:120][WARNING][警告日志]
[2018-12-03 13:35:19,360][MainThread:6940][task_id:b系统][test.py:123][ERROR][错误日志]
[2018-12-03 13:35:19,361][MainThread:6940][task_id:c系统][test.py:126][CRITICAL][严重警告日志]
day35-常见内置模块四(logging模块)的更多相关文章
- 十二 logging模块
一 日志级别 CRITICAL = 50 #FATAL = CRITICAL ERROR = 40 WARNING = 30 #WARN = WARNING INFO = 20 DEBUG = 10 ...
- python基础知识9——模块2——常见内置模块
内置模块 内置模块是Python自带的功能,在使用内置模块相应的功能时,需要[先导入]再[使用] 1.sys 用于提供对Python解释器相关的操作: sys.argv 命令行参数List,第一个元素 ...
- 第四章: 4.1 logging模块 | 正则表达式
修改json数据然后写入json文件中 f = open('1234.json','r',encoding='utf-8') data = f.read() data1 = json.loads(da ...
- logging模块详解以及常见代码
1.在django中获取客户端IP地址: if 'HTTP_X_FORWARDED_FOR' in request.META: ip = request.META['HTTP_X_FORWARDED_ ...
- python基础语法13 内置模块 subprocess,re模块,logging日志记录模块,防止导入模块时自动执行测试功能,包的理论
subprocess模块: - 可以通过python代码给操作系统终端发送命令, 并且可以返回结果. sub: 子 process: 进程 import subprocess while Tru ...
- Python 入门之 内置模块 --logging模块
Python 入门之 内置模块 --logging模块 1.logging -- 日志 (1)日志的作用: <1> 记录用户信息 <2> 记录个人流水 <3> 记录 ...
- 常用内置模块(二)——logging模块
logging模块 一.logging作用 1. 控制日志级别 2. 控制日志格式 3. 控制输出的目标为文件 二.日志级别 logging.debug( logging.info( loggin ...
- 常见模块(二) logging模块
logging模块是专门做日志系统的.分为函数版和自定义函数. (一)logging模块初级版 缺点,不能指定字符集,不能把屏幕输出和文件日志同时记录.只能选择其一. 文件记录日志 import lo ...
- Python Logging模块的简单使用
前言 日志是非常重要的,最近有接触到这个,所以系统的看一下Python这个模块的用法.本文即为Logging模块的用法简介,主要参考文章为Python官方文档,链接见参考列表. 另外,Python的H ...
随机推荐
- 『Hi,我是易建科技eKing Cloud!』
写在前面:这是我的第一篇自我介绍式文章,是对易建科技我所在云服务事业群的云平台产品和业务的总结和介绍.本文始发于 Linux宝库 公众号,这是原文链接.感谢公众号主人陈绪总,感谢公众号的编辑们!感谢易 ...
- 弹性势能,position,min用法,获取元素的宽
弹性势能: 网页div移动的mousemove的次数,跟div移动的距离没有关系,跟鼠标移动的快慢有关,浏览器自身有个计数事件,几毫秒 _this.seed*=0.95 //摩擦系数的写法 posit ...
- win7 没有权限使用网络资源
局域网下同一工作组电脑无法访问 提示"....没有权限使用网络资源...." 一.组策略 win + R 输入gpedit.msc并回车,打开本地组策略编辑器 按如下展开 计算机配 ...
- typescript静态属性,静态方法,抽象类,多态
/* 1.vscode配置自动编译 1.第一步 tsc --inti 生成tsconfig.json 改 "outDir": "./js", 2.第二步 任务 ...
- 基础回顾之List集合
1.List集合的的contains()方法底层调用的是equals()方法,当比较自定义对象时,需要重写比较对象的equals()方法 2.List集合的remove()方法底层依赖的也是equal ...
- Linux双网卡绑定
Linux双网卡绑定 作者:Eric 微信:loveoracle11g eth0和eth1绑定为bond0 [root@rac-node1 ~]# cat /etc/sysconfig/network ...
- MySQL5.7修改默认密码、随机密码
mysql5.7以后默认生成随机密码,修改root用户密码 1.修改配置参数Linux: /etc/my.cnf Windows: C:\ProgramData\MySQL\MySQL Server ...
- python类型强转&二级容器
Number 类型强转 int : ---->>> float, bool, complex, str Float : ---->> ...
- 第10章 网络安全(4)_网络层安全IPSec
5. 网络层安全IPSec 5.1 IPSec协议 (1)前面使用Outlook进行数字签名和数字加密是应用层实现的安全.安全套接字实现的安全是在应用层和传输层之间插入了一层来实现数据通信安全.而IP ...
- TFTP(Trivial File Transfer Protocol,简单文件传输协议)
网络特性 通常使用UDP 69端口(据说可改成TCP) 与FTP区别 轻量级,适用于传输小文件,当然功能也少些,比如没有列出目录功能,不进行认证