5.9 logging模块

常用参数

logging.basicConfig()函数中可通过具体参数来更改logging模块默认行为,可用参数有:

filename:用指定的文件名创建FiledHandler,这样日志会被存储在指定的文件中。
filemode:文件打开方式,在指定了filename时使用这个参数,默认值为“a”还可指定为“w”。
format:指定handler使用的日志显示格式。
datefmt:指定日期时间格式。
level:设置rootlogger(后边会讲解具体概念)的日志级别
stream:用指定的stream创建StreamHandler。可以指定输出到sys.stderr,sys.stdout或者文件(f=open(‘test.log’,’w’)),默认为sys.stderr。若同时列出了filename和stream两个参数,则stream参数会被忽略。 format参数中可能用到的格式化串:
%(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用户输出的消息

5.9.1 低配版

import logging
#直接写入文件
logging.basicConfig(level=logging.DEBUG,format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
datefmt='%a, %d %b %Y %H:%M:%S',
filename='test.log',
filemode='a'
) logging.debug('debug message')
logging.info('info message')
logging.warning('warning message')
logging.error('error message')
logging.critical('critical message') #输出到屏幕
logging.basicConfig(level=logging.DEBUG,format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
datefmt='%a, %d %b %Y %H:%M:%S',
)
logging.debug('debug message')
logging.info('info message')
logging.warning('warning message')
logging.error('error message')
logging.critical('critical message')

5.9.2 标配版

import logging

#定义一个logging对象
logger = logging.getLogger() #定义一个文件对象
fh = logging.FileHandler('test.log',encoding='utf-8') #创建一个屏幕对象
sh = logging.StreamHandler() #配置显示格式
formatter1 = logging.Formatter('%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s')
formatter2 = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
fh.setFormatter(formatter1)
sh.setFormatter(formatter2) #引入
logger.addHandler(fh)
logger.addHandler(sh) #设置显示的最低级别
logger.setLevel(10) #默认是30
fh.setLevel(10)
sh.setLevel(30) #默认是30 logging.debug('调试模式')
logging.info('正常模式')
logging.warning('警告模式')
logging.error('告警模式')
logging.critical('严重错误模式')

5.9.3 旗舰版

import logging.config
import os # 定义三种日志输出格式 开始,所有的模板可以自定义,[]也是自加的
# 常规多项目模板,可用于记录文件日志
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_dir = os.path.dirname(os.path.abspath(__file__))
logfile_par_path = os.path.dirname(__file__) logfile_name = 'login.log' # log文件名
logfile_path_staff = f"{logfile_par_path}\\log1\\staff.log"
logfile_path_boss = f"{logfile_par_path}\\log2\\boss.log" #如果不存在定义的日志目录就创建一个
if not os.path.isdir(f"{logfile_par_path}\\log2"):
os.mkdir(f"{logfile_par_path}\\log2")
if not os.path.isdir(f"{logfile_par_path}\\log1"):
os.mkdir(f"{logfile_par_path}\\log1") #log日志的全路径,与上步配合生成log日志的全路径
# logfile_path = os.path.join() #log配置字典
# LOGGING_DIC第一层的所有的键不能改变
LOGGING_DIC={
'version':1,
'disable_existing_loggers':False,
'formatters':{ #把三个模板搬过来
'standard':{'format':standard_format},
'simple':{'format':simple_format},
'id_simple':{'format':id_simple_format}
},
'filters':{},
'handlers':{
#打印到终端的日志
'console':{
'level':'DEBUG',
'class':'logging.StreamHandler', #打印到屏幕
'formatter':'simple'
},
#打印到文件1
'default1':{
'level':'DEBUG',
'class':'logging.handlers.RotatingFileHandler', #保存文件
'formatter':'standard',
'filename':logfile_path_staff , #日志路径
'maxBytes':1024*3, #日志大小 3K
'backupCount':3, #最对缓存的文件数
'encoding':'utf-8',
},
# 打印到文件2
'default2': {
'level': 'DEBUG',
'class': 'logging.handlers.RotatingFileHandler', # 保存文件
'formatter': 'id_simple',
'filename': logfile_path_boss, # 日志路径
'maxBytes': 1024 * 3, # 日志大小 3K
'backupCount': 3, # 最对缓存的文件数
'encoding': 'utf-8',
},
},
'loggers':{
#拿到logging.getLogger(__name__)拿到的logger配置
'':{
'handlers':['default1','default2','console'],#把上面定义的三个handler都加上,即log数据既写入文件又打印到屏幕
'level':'DEBUG',
'propagate':True # 向上(更高level的logger)传递
}
}
} def md_logger():
logging.config.dictConfig(LOGGING_DIC) #导入上面定义的logging配置
logger = logging.getLogger() #生成一个log实例
# logger.debug('It Works!') #记录该文件运行状态
return logging
dic = {'username':'盖伦'} def login(): #模拟登录。进行日志测试
md_logger().info(f"{dic['username']}登陆成功") login()

python学习之模块-模块(四)的更多相关文章

  1. python学习之argparse模块

    python学习之argparse模块 一.简介: argparse是python用于解析命令行参数和选项的标准模块,用于代替已经过时的optparse模块.argparse模块的作用是用于解析命令行 ...

  2. Python学习 Part4:模块

    Python学习 Part4:模块 1. 模块是将定义保存在一个文件中的方法,然后在脚本中或解释器的交互实例中使用.模块中的定义可以被导入到其他模块或者main模块. 模块就是一个包含Python定义 ...

  3. Python学习day19-常用模块之re模块

    figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...

  4. Python学习day18-常用模块之NumPy

    figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...

  5. python学习笔记--Django入门四 管理站点--二

    接上一节  python学习笔记--Django入门四 管理站点 设置字段可选 编辑Book模块在email字段上加上blank=True,指定email字段为可选,代码如下: class Autho ...

  6. Python学习笔记(十四)

    Python学习笔记(十四): Json and Pickle模块 shelve模块 1. Json and Pickle模块 之前我们学习过用eval内置方法可以将一个字符串转成python对象,不 ...

  7. Python学习笔记(十四):模块高级

    以Mark Lutz著的<Python学习手册>为教程,每天花1个小时左右时间学习,争取两周完成. --- 写在前面的话 2013-7-23 21:30 学习笔记 1,包导入是把计算机上的 ...

  8. python学习笔记系列----(四)模块

    这一章主要是叙述了python模块的概念以及包的概念,还有它们的使用:收获也是大大的. 提起python文件,经常会听到3个名词,python脚本,python模块,python包.脚本的概念是从py ...

  9. Python学习 :常用模块(四)----- 配置文档

    常用模块(四) 八.configparser 模块 官方介绍:A configuration file consists of sections, lead by a "[section]& ...

  10. Python学习笔记-常用模块

    1.python模块 如果你退出 Python 解释器并重新进入,你做的任何定义(变量和方法)都会丢失.因此,如果你想要编写一些更大的程序,为准备解释器输入使用一个文本编辑器会更好,并以那个文件替代作 ...

随机推荐

  1. SpringBoot项目多模块打包与部署【pom文件问题】

    [bean的pom] [user的pom] 特别注意,user模块因为有返回jsp页面和web相关,所以需要加入web依赖. chapter23 com.yuqiyu 1.0.0 4.0.0 com. ...

  2. 将Excel数据读入DataGridView

    OpenFileDialog openFileDialog = new OpenFileDialog(); openFileDialog.Filter = "Microsoft Excel ...

  3. Robot Framework中ride.py打不开的解决方法

    1.首先查看wxPython版本是否跟python的版本一致,一般都使用wxPython2.8-win64-unicode-2.8.12.1-py27.exe或者wxPython2.8-win32-u ...

  4. ELEMENT-UI 封装el-table 局部刷新row

    //关于封装的el-table行数据更新后如何局部更新row row.status=status; this.$set(this.$refs.elTable.$data.tableData,index ...

  5. poj 3625 (最小生成树算法)

    Building Roads Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12203   Accepted: 3448 D ...

  6. CF1155 E.Guess the Root

    题目链接:Click here 题目大意:现在有一个至多11项的多项式\(F(x)\),你可以询问至多50个\(x\),黑盒子会告诉你\(F(x)\)的值,你现在要找到一个\(x\)使得\(F(x)= ...

  7. DVWA--CRSF

    首先我们对CRSF进行一个介绍 CSRF,全称Cross-site request forgery,翻译过来就是跨站请求伪造,是指利用受害者尚未失效的身份认证信息(cookie.会话等),诱骗其点击恶 ...

  8. Java实现QQ微信轰炸机1.2(斗图乞丐版)

    之前有小可爱评论可以实现斗图的功能,原理上是行的通的,所以我就稍微改了一下,能够实现单个图片循环轰炸,如果大家感兴趣也可以自己探究实现多张图片循环轰炸,不废话了,直接上源码package QQWcha ...

  9. What is the !! (not not) operator in JavaScript?

    What is the !! (not not) operator in JavaScript? 解答1 Coerces强制 oObject to boolean. If it was falsey ...

  10. redis high available solution/ redis 高可用方案

    http://developers.linecorp.com/blog/?p=1420 http://engineering.docusign.com/articles/redis-sentinel- ...