猪行天下之Python基础——10.1 Python常用模块(上)(三)

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 内容简述: 1、time和datetime模块 2、logging模块 PS:如果你想搜索安装某个模块或者发布一个自己的模块可以到移步到:pypi.org/

运行结果如下


# 控制台输出:
=== Warning 级别的信息 ===
=== Error 级别的信息 ===
=== Critical 级别的信息 ===
# test.log文件:
=== Info 级别的信息 ===
=== Warning 级别的信息 ===
=== Error 级别的信息 ===
=== Critical 级别的信息 ===


③ 定制日志输出格式


纠结完输出到那里,接着就输出日志的格式了,日志一般都是比较规范的,比如日志打印的时间类型等,而不会像我们这样随意拼接一段字符串,对于日志格式的定制可以通过logging模块Formatter组件来定制。basicConfig()中的handler 自带一个formatter,通过logging.basicConfig(**kwargs)函数进行定制,该函数可接收的关键字参数如下表所示。


参数 描述
filename 指定日志输出目标文件的文件名,设置后信息就不会打印到控制台
filemode 指定日志文件的打开模式,默认为'a',设置了filename这个才会生效
format 指定日志格式字符串,即指定日志输出时所包含的字段信息以及它们的顺序
datefmt 指定日期/时间格式,该选项要在format中包含时间字段%(asctime)s时才有效
level 指定日志器的日志级别
stream 指定日志输出目标stream,不能和filename同时使用否则会引起ValueError异常
style Python 3.2新增,默认'%'指定format格式字符串的风格,可取值为'%'、'{'和'$'

format格式字符串的字段列表如下表所示:

参数 描述
%(asctime)s 日志发生的时间--人类可读时间,如:2003-07-08 16:49:45,896
%(created)f 日志发生的时间--时间戳,就是当时调用time.time()函数返回的值
%(relativeCreated)d 日志发生的时间相对于logging模块加载时间的相对毫秒数
%(msecs)d 日志发生时间的毫秒部分
%(levelname)s 该日志记录的文字形式的日志级别('DEBUG', 'INFO', 'WARNING',
'ERROR', 'CRITICAL')
%(levelno)s 该日志记录的数字形式的日志级别(10, 20, 30, 40, 50)
%(name)s 所使用的日志器名称,默认是'root',因为默认使用的是 rootLogger
%(message)s 日志记录的文本内容,通过 msg % args计算得到的
%(pathname)s 调用日志记录函数的源码文件的全路径
%(filename)s pathname的文件名部分,包含文件后缀
%(module)s filename的名称部分,不包含后缀
%(lineno)d 调用日志记录函数的源代码所在的行号
%(funcName)s 调用日志记录函数的函数名
%(process)d 进程ID
%(processName)s 进程名称,Python 3.1新增
%(thread)d 线程ID
%(thread)s 线程名称


简单的使用代码示例如下


import logging
if __name__ == '__main__':
    logger = logging.getLogger("Test")
    logging.basicConfig(level=logging.INFO,
                        format="%(asctime)s %(process)d:%(processName)s- %(levelname)s === %(message)s",
                        datefmt="%Y-%m-%d %H:%M:%S %p")
    logger.debug("Debug 级别的信息")
    logger.info("Info 级别的信息")
    logger.warning("Warning 级别的信息")
    logger.error("Error 级别的信息")
    logger.critical("Critical 级别的信息")


运行结果如下


2019-03-14 16:39:02 PM 8628:MainProcess- INFO === Info 级别的信息
2019-03-14 16:39:02 PM 8628:MainProcess- WARNING === Warning 级别的信息
2019-03-14 16:39:02 PM 8628:MainProcess- ERROR === Error 级别的信息
2019-03-14 16:39:02 PM 8628:MainProcess- CRITICAL === Critical 级别的信息


另外要注意一点basicConfig没有设置编码的属性,如果想把日志写入到文件里,而日志里又有中文的话,只能通过一开始那种设置FileHandler对象的方式!除了通过basicConfig()设置日志格式,还可以自定义一个Formatter对象,然后调用setFormatter函数进行设置。使用代码示例如下:


import logging
if __name__ == '__main__':
    logger = logging.getLogger("Test")
    logger.setLevel(logging.INFO)
    # 自定义Formatter对象
    fmt = logging.Formatter("%(asctime)s %(process)d:%(processName)s- %(levelname)s === %(message)s",
                            datefmt="%Y-%m-%d %H:%M:%S %p")
    # 输出到控制台
    s_handler = logging.StreamHandler()
    s_handler.setLevel(logging.WARNING)
    s_handler.setFormatter(fmt)
    logger.addHandler(s_handler)
    # 输出到文件
    f_handler = logging.FileHandler('test.log', encoding='UTF-8')
    f_handler.setLevel(logging.DEBUG)
    f_handler.setFormatter(fmt)
    logger.addHandler(f_handler)
    logger.debug("Debug 级别的信息")
    logger.info("Info 级别的信息")
    logger.warning("Warning 级别的信息")
    logger.error("Error 级别的信息")
    logger.critical("Critical 级别的信息")


运行结果如下


# 控制台输出:
2019-03-14 16:41:09 PM 11312:MainProcess- WARNING === Warning 级别的信息
2019-03-14 16:41:09 PM 11312:MainProcess- ERROR === Error 级别的信息
2019-03-14 16:41:09 PM 11312:MainProcess- CRITICAL === Critical 级别的信息
# test.log文件:
2019-03-14 16:41:09 PM 11312:MainProcess- INFO === Info 级别的信息
2019-03-14 16:41:09 PM 11312:MainProcess- WARNING === Warning 级别的信息
2019-03-14 16:41:09 PM 11312:MainProcess- ERROR === Error 级别的信息
2019-03-14 16:41:09 PM 11312:MainProcess- CRITICAL === Critical 级别的信息


logging除了HandlerFormatter两个组件外还有,FilterLoggerAdapter组件,不过用得不多,有兴趣的同学可以自行到官方文档进行查阅:

docs.python.org/3/library/l…


相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
打赏
0
0
0
0
7
分享
相关文章
如何在Python中管理模块和包的依赖关系?
在实际开发中,通常会结合多种方法来管理模块和包的依赖关系,以确保项目的顺利进行和可维护性。同时,要及时更新和解决依赖冲突等问题,以保证代码的稳定性和可靠性
167 62
[oeasy]python070_如何导入模块_导入模块的作用_hello_dunder_双下划线
本文介绍了如何在Python中导入模块及其作用,重点讲解了`__hello__`模块的导入与使用。通过`import`命令可以将外部模块引入当前环境,增强代码功能。例如,导入`__hello__`模块后可输出“Hello world!”。此外,还演示了如何使用`help()`和`dir()`函数查询模块信息,并展示了导入多个模块的方法。最后,通过一个实例,介绍了如何利用`jieba`、`WordCloud`和`matplotlib`模块生成词云图。总结来说,模块是封装好的功能部件,能够简化编程任务并提高效率。未来将探讨如何创建自定义模块。
29 8
[oeasy]python071_我可以自己做一个模块吗_自定义模块_引入模块_import_diy
本文介绍了 Python 中模块的导入与自定义模块的创建。首先,我们回忆了模块的概念,即封装好功能的部件,并通过导入 `__hello__` 模块实现了输出 "hello world!" 的功能。接着,尝试创建并编辑自己的模块 `my_file.py`,引入 `time` 模块以获取当前时间,并在其中添加自定义输出。
20 4
|
3月前
|
Python Internet 模块
Python Internet 模块。
139 74
马特赛特旋转算法:Python的随机模块背后的力量
马特赛特旋转算法是Python `random`模块的核心,由松本真和西村拓士于1997年提出。它基于线性反馈移位寄存器,具有超长周期和高维均匀性,适用于模拟、密码学等领域。Python中通过设置种子值初始化状态数组,经状态更新和输出提取生成随机数,代码简单高效。
150 63
如何在Python中解决模块和包的依赖冲突?
解决模块和包的依赖冲突需要综合运用多种方法,并且需要团队成员的共同努力和协作。通过合理的管理和解决冲突,可以提高项目的稳定性和可扩展性
|
4月前
|
Python的模块和包
总之,模块和包是 Python 编程中非常重要的概念,掌握它们可以帮助我们更好地组织和管理代码,提高开发效率和代码质量
140 61
手动解决Python模块和包依赖冲突的具体步骤是什么?
需要注意的是,手动解决依赖冲突可能需要一定的时间和经验,并且需要谨慎操作,避免引入新的问题。在实际操作中,还可以结合使用其他方法,如虚拟环境等,来更好地管理和解决依赖冲突😉。
如何在Python中自动解决模块和包的依赖冲突?
完全自动解决所有依赖冲突可能并不总是可行,特别是在复杂的项目中。有时候仍然需要人工干预和判断。自动解决的方法主要是提供辅助和便捷,但不能完全替代人工的分析和决策😉。
|
2月前
|
[oeasy]python057_如何删除print函数_dunder_builtins_系统内建模块
本文介绍了如何删除Python中的`print`函数,并探讨了系统内建模块`__builtins__`的作用。主要内容包括: 1. **回忆上次内容**:上次提到使用下划线避免命名冲突。 2. **双下划线变量**:解释了双下划线(如`__name__`、`__doc__`、`__builtins__`)是系统定义的标识符,具有特殊含义。
37 3

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等