[python]-日志记录之logging
文章目录
- 记录器
- 日志级别
- 函数
- 格式化器
- LogRecord
- 默认配置
- 日志配置
一般简单输出使用print,但是要有大量输出,且做控制时,就需要做日志打印了。python中的logging模块可方便地进行日志打印。使用时:
import logging
记录器
通过logging.getLogger(name)
获取日志记录器对象,多次使用相同的名称会返回同一个Logger对象。若不指定名字(或直接使用logging)则返回root(根)Logger。以下记录方式是等价的:
# 直接使用root Logger
logging.warning('warn')
#获取Logger后使用
root = logging.getLogger()
root.warning('warn')
Logger是层次结构的,使用 ‘.’ 点号分割,如’a’、‘a.b’或’a.b.c.d’,'a’是’a.b’的父parent,'a.b’是’a’的子child。以下两者是等价的:
# 按层次获取Logger
loggerA = logging.getLogger('abc').getChild('def.ghi')
# 直接获取Logger
loggerA = logging.getLogger('abc.def.ghi')
日志级别
默认生成的root logger的level是logging.WARNING
,低于该级别的就不输出了。可自定义级别,若自定义级别的数值与预定义的相同,则会覆盖掉预定义的。
级别 | 数值 |
---|---|
CRITICAL
|
50 |
ERROR
|
40 |
WARNING
|
30 |
INFO
|
20 |
DEBUG
|
10 |
NOTSET
|
0 |
函数
logging提供了针对不同级别的日志 输出函数:
debug
(msg, *args, **kwargs)info
(msg, *args, **kwargs)warning
(msg, *args, **kwargs)error
(msg, *args, **kwargs)critical
(msg, *args, **kwargs)log
(level, msg, *args, **kwargs)exception
(msg, *args, **kwargs):记录到ERROR级别
args 参数用于字符串格式化操,针对msg中的%
格式符。
kwargs 中会检查四个关键字参数: exc_info ,stack_info ,stacklevel 和 extra:
- exc_info 的求值结果不为 false ,则它将异常信息添加到日志消息中。如果提供了一个异常元组(按照
sys.exc_info()
返回的格式)或一个异常实例,则它将被使用;否则,调用sys.exc_info()
以获取异常信息。 - stack_info,默认为
False
。如果为 True,则将堆栈信息(异常展开的栈信息)添加到日志消息中,包括实际的日志调用。 - stacklevel ,默认为
1
。如果大于 1 ,则在为日志记录事件创建的LogRecord
中计算行号和函数名时,将跳过相应数量的堆栈帧。 - extra ,传递一个字典,该字典用于填充为日志记录事件创建的、带有用户自定义属性的
LogRecord
中的字典(字典的键不应与日志系统使用的键冲突) 。
如在日志中输出用户字典中的IP地址与用户信息:
FORMAT = '%(asctime)s %(clientip)-15s %(user)-8s %(message)s'
logging.basicConfig(format=FORMAT)
logger = logging.getLogger('tcpserver')info = {'clientip': '192.168.0.1', 'user': 'bob'}
logger.warning('Protocol problem: %s', 'connection reset', extra=info)
# 输出如下:
2021-11-20 22:20:02,165 192.168.1.2 bob Protocol problem: connection reset
格式化器
Formatter负责将LogRecord转换为易于识别的字符串
logging.Formatter(fmt=None, datefmt=None, style='%', validate=True, *, defaults=None)
LogRecord
LogRecord中属性用于将来自记录的数据合并到格式字符串中。
属性名称 | 格式 | 描述 |
---|---|---|
args | 在原始日志记录调用中传入的格式字符串对应的参数。 | |
asctime |
%(asctime)s
|
日志创建时间, 默认格式 ‘2021-07-08 16:49:45,896’ (逗号后为毫秒)。 |
msecs |
%(msecs)03d
|
日志创建时间的毫秒部分。 |
created |
%(created)f
|
日志创建时间,(即 time.time() 的返回值)。
|
exc_info |
异常元组(例如 sys.exc_info )或者如未发生异常则为 None 。
|
|
filename |
%(filename)s
|
pathname 的文件名部分。
|
funcName |
%(funcName)s
|
函数名包括调用日志记录. |
levelname |
%(levelname)s
|
日志级别:消息文本记录 |
levelno |
%(levelno)s
|
日志级别:数值 |
lineno |
%(lineno)d
|
源行号。 |
message |
%(message)s
|
记入日志的消息 |
module |
%(module)s
|
模块 (filename 的名称部分)。
|
msecs |
%(msecs)d
|
时间的毫秒部分。 |
msg | 在原始日志记录调用中传入的格式字符串。 | |
name |
%(name)s
|
用于记录调用的日志记录器名称。 |
pathname |
%(pathname)s
|
源文件的完整路径名。 |
process |
%(process)d
|
进程ID(如果可用) |
processName |
%(processName)s
|
进程名(如果可用) |
relativeCreated |
%(relativeCreated)d
|
相对于 logging 模块被加载时间的差值(毫秒数)。 |
stack_info | 当前线程的堆栈帧信息。 | |
thread |
%(thread)d
|
线程ID(如果可用) |
threadName |
%(threadName)s
|
线程名(如果可用) |
默认配置
logging.basicConfig(**kwargs)
设定记录系统的基础配置。其关键参数:
格式 | 描述 |
---|---|
filename | 日志文件名 |
filemode |
日志文件打开模式, 默认为 'a' 。
|
format |
输出格式,默认为冒号分隔的 levelname , name 和 message (WARNING:root:output-message )。
|
datefmt |
日期/时间格式(time.strftime() 所接受的格式)。
|
style |
*format *的格式字符串风格:'%' :printf 风格(默认),%(message)s '{' : str.format() 风格,{message} '$' :string.Template 风格
|
level | 记录级别 |
stream | 设定日志记录流;此参数与 filename 不兼容 (两者不能同时存在) |
handlers | 设定日志记录处理器,此参数与 filename 或 stream 不兼容 |
force | true时,移除并关闭附加到根记录器的所有现有处理器。 |
encoding | 输出文件的编码格式 |
errors | 输出文件在编码出错时的处理方式 |
日志配置
设定日志输出格式
def init_logging(logFile=None):# Define a Handler and set a format which output to filelogging.basicConfig(level=logging.DEBUG, # 定义输出的log级别,format='%(asctime)s.%(msecs)03d [%(levelname)s]: %(message)s', # 定义输出log的格式# datefmt='%Y-%m-%d %H:%M:%S', # 时间datefmt='%H:%M:%S', # 时间filename=logFile, # log文件名,None时只输出到consolefilemode='w') # 写入模式“w”或“a”if __name__ == '__main__':init_logging()# 字符串format方式logging.info("{} - times, output: {}".format(1, 'test-info'))# printf格式logging.info("%i - times, output: %s", 1, 'test-info')
同时输出到屏幕与日志文件(需要通过logger实现):
logger = logging.getLogger("base")def init_logging(logFile=None, logLevel=logging.DEBUG):for handler in logger.handlers[:]: # get rid of existing old handlerslogger.removeHandler(handler)logger.setLevel(logLevel)formatter = logging.Formatter('%(asctime)s.%(msecs)03d [%(levelname)s] %(filename)s:%(lineno)d : %(message)s', datefmt='%Y-%m-%d %H:%M:%S')# 使用StreamHandler输出到屏幕out = logging.StreamHandler()out.setLevel(logLevel)out.setFormatter(formatter)logger.addHandler(out)# 使用FileHandler输出到文件if logFile:fh = logging.FileHandler(logFile)fh.setLevel(logLevel)fh.setFormatter(formatter)logger.addHandler(fh)if __name__ == '__main__':init_logging("D:\\temp\\test.log")logger.info("{} - times, output: {}".format(2, 'test-info'))logger.info("%i - times, output: %s", 2, 'test-info')
[python]-日志记录之logging相关推荐
- Python 日志记录工具logging
文章目录 1. 日志的作用 2. 日志的级别 3. 几个重要的概念 3.1 Logger 记录器 3.2 Handler 处理器 3.3 Formatter 格式化器 3.4 Filter 过滤器 4 ...
- python日志记录_Python日志记录
python日志记录 To start, logging is a way of tracking events in a program when it runs and is in executi ...
- python中的logging记录日志_[ Python入门教程 ] Python中日志记录模块logging使用实例...
python中的logging模块用于记录日志.用户可以根据程序实现需要自定义日志输出位置.日志级别以及日志格式. 将日志内容输出到屏幕 一个最简单的logging模块使用样例,直接打印显示日志内容到 ...
- python日志处理(logging模块)
文章非原创,搬运自@云游道士博客: https://www.cnblogs.com/yyds/p/6901864.html 另外,这篇文章可以作为参考: https://www.jianshu.com ...
- Python日志记录只写入文件,不显示在控制台上,Pythonlogging,到
关于logging模块的详细使用,可以参考博客 python logging 替代print 输出内容到控制台和重定向到文件logging中有几个模块:Logger,Handler,Formatter ...
- python stdout stderr 一起输出,Python日志记录在stdout和stderr之间拆分
Is it possible to have python logging messages which are INFO or DEBUG to go to stdout and WARNING o ...
- python连接linux获取日志_Python 日志记录模块logging的使用
shell当中记录log,满眼花花的重定向符合,看着很不爽有没有!我喜欢Python,就是喜欢这种买个手电筒,备用电池都准备好了的感觉.logging模块很简单,导入模块,定义日志格式.代码中就可以通 ...
- Python日志记录:在配置文件中指定日志格式化程序的转换器属性
言归正传!问题引发 我想在我的日志文件中将所有时间戳记为UTC时间戳记.通过代码指定时,将执行以下操作: import logging import time myHandler = logging. ...
- python日志文件保存在哪里,Python日志记录-检查日志文件的位置?
What is the methodology for knowing where Python log statements are stored? i.e. if i do: import log ...
最新文章
- Eclipse中配置Tomcat
- 杭电 1711 Number Sequence 1686 2203
- 微信小程序里页面滚动到底部
- 【SpringBoot Testing】测试类/测试用例格式
- c语言30人成绩平均分,用C语言编程平均分数
- 工作总结13:vue官网封装组件
- 20155229 2016-2007-2 《Java程序设计》第一周学习总结
- 深入理解虚拟机之虚拟机类加载机制
- ibm中文语音识别输入系统
- RTMPDump源代码分析 0: 主要函数调用分析
- (原創) 網站CSS重新調整,全面支援IE6與FireFox 2.0!! (Web) (CSS)
- 小程序:微信小程序开发
- 内部矩阵维度必须一致simulink_为何选择矩阵式KVM切换器及其原理
- 2019年8月2 星期五 今日计划
- 医学病理图片(SVS格式)的格式转换与显示——python实现
- Android 中奖滚动效果
- 详解Unity中的粒子系统Particle System (八)
- 进入BeOS的花花世界 系列二
- uniapp支付宝小程扫描二维码获取参数
- javascript中使用枚举定义一个对象进行数据转换
热门文章
- Android 快速开发框架汇总
- 反重力:科幻中的“常客
- docker安装RabbitMQ及安装延迟插件
- codesys 简单案例_CODESYS-2.3-EXAMPLE 基于CODESYS 2.3的工程应用案例程序 - 下载 - 搜珍网...
- 小狐狸钱包(metamask)和币安链钱包的联网问题
- 员工电脑监控的作用,公司电脑能监控哪些?
- 77. 查看线程的运行状态
- 浏览器的内存泄漏(memory leak)问题
- DolphinScheduler任务调度
- 【安卓】Kotlin编程语言基础(安卓开发基础)