1. 低配版

 # 指定显示信息格式
import logging
logging.basicConfig(
level=20, # 设置显示或写入的起始级别
format="%(asctime)s %(filename)s [line:%(lineno)d] %(levelname)s %(message)s", # 这里的格式可以自己改
# datefmt="%a,%d %b %Y %H:%M:%S" # 显示时间格式,不写就用上一行的asctime
# filename="test.log", # 日志写入的文件名
filemode="w" ) logging.debug("debug message") # 调试模式 10
logging.info("info message") # 正常运转模式 20
logging.warning("warning message") # 警告模式 30
logging.error("error message") # 错误模式 40
logging.critical("critical message") # 致命的 崩溃模式 50

低配版不能同时屏幕输出和写入

下面来看标配版

标配版

步骤如下:

1. 产生logger对象

logger = logging.getLogger()

2. 产生其他对象(屏幕对象,文件对象等)

sh = logging.StreamHandler()   # 产生屏幕对象
fh1 = logging.FileHandler("staff.log", encoding="utf-8") # 产生文件对象,第一个参数为文件名
fh2 = logging.FileHandler("boss.log", encoding="utf-8") # 产生文件对象

3. 设置显示的格式

formater = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")  # 执行设置显示格式
formater1 = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s") # 这里的name是业务名,默认为root
formater12 = logging.Formatter("%(asctime)s - %(message)s")

4. 给对象绑定格式

sh.setFormatter(formater)     # sh绑定formater
fh1.setFormatter(formater1) # fh1绑定formater1
fh2.setFormatter(formater2) # fh2绑定formater2

5. 给logger对象绑定其他对象

logger.addHandler(sh)
logger.addHandler(fh1)
logger.addHandler(fh2)

6. 设置显示级别

注意,其他对象的级别要高于logger的级别

logger.setLevel(10)
sh.setLevel(20) # 设置屏幕对象sh显示级别20及以上
fh1.setLevel(30)
fh2.setLevel(50)
logging.debug("debug message")
logging.info("info message")
logging.warning("warning message")
logging.error("error message")
logging.critical("critical message")

高配版

高配版才是工作中经常用到的,通过创建logging配置文件

logging配置文件

 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'
# 结束 # 设置log文件的目录和文件名
# 开始
log_file_dir = os.path.dirname(os.path.abspath(__file__)) # log文件的目录
log_file_name = "test.log" # log文件名
# 结束 # 如果不存在定义的日志目录就创建一个
if not os.path.isdir(log_file_dir):
os.mkdir(log_file_dir) # log文件的全路径
log_file_path = os.path.join(log_file_dir, log_file_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'
},
# 打印到文件的日志,收集info及以上的日志
'default': {
'level': 'DEBUG',
'class': 'logging.handlers.RotatingFileHandler', # 保存到文件
'formatter': 'standard',
'filename': log_file_path, # 日志文件
'maxBytes': 1024*1024*5, # 日志大小 5M
'backupCount': 5,
'encoding': 'utf-8', # 日志文件的编码,再也不用担心中文log乱码了
},
},
'loggers': {
# logging.getLogger(__name__)拿到的logger配置
'': {
'handlers': ['default', 'console'], # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
'level': 'DEBUG',
'propagate': True, # 向上(更高level的logger)传递
},
},
}

配置文件

 def load_my_logging_cfg():
logging.config.dictConfig(LOGGING_DIC) # 导入上面定义的logging配置
logger = logging.getLogger(__name__) # 生成一个实例
logger.info("It works!") # 记录该文件的运行状态 if __name__ == '__main__':
load_my_logging_cfg()

定义函数

# 好处:所有与logging配置相关的配置都写到字典中,更加清晰,方便管理

# 我们需要解决的问题
"""
1. 从字典加载配置 logging.config.dictConfig(settings.LOGGING_DIC)
2. logger对象都是配置到字典的logger键对应的子字典中,
而我们要获取不同的logger对象就是logger=logging.getLogger("loggers字字典的key名")
但问题是,我们想要不同的logger对象共用一段配置,那么肯定不能在logger字字典中定义n个key
我们的解决办法是定义一个空的key,再取logger对象时,logging.getLogger(__name__),
不同的文件的__name__不同,这保证了打印日志时标识信息不同,但是拿着改名字去loggers里找key时却找不到,
于是默认使用key=""的配置 """

好处及原因

以后要用到直接将配置文件拿来简单改下就可以了

python模块之logging模块的更多相关文章

  1. Python日志输出——logging模块

    Python日志输出——logging模块 标签: loggingpythonimportmodulelog4j 2012-03-06 00:18 31605人阅读 评论(8) 收藏 举报 分类: P ...

  2. Python自建logging模块

    本章将介绍Python内建模块:日志模块,更多内容请从参考:Python学习指南 简单使用 最开始,我们用最短的代码体验一下logging的基本功能. import logging logger = ...

  3. Python实战之logging模块使用详解

    用Python写代码的时候,在想看的地方写个print xx 就能在控制台上显示打印信息,这样子就能知道它是什么了,但是当我需要看大量的地方或者在一个文件中查看的时候,这时候print就不大方便了,所 ...

  4. Python中的logging模块就这么用

    Python中的logging模块就这么用 1.日志日志一共分成5个等级,从低到高分别是:DEBUG INFO WARNING ERROR CRITICALDEBUG:详细的信息,通常只出现在诊断问题 ...

  5. python中日志logging模块的性能及多进程详解

    python中日志logging模块的性能及多进程详解 使用Python来写后台任务时,时常需要使用输出日志来记录程序运行的状态,并在发生错误时将错误的详细信息保存下来,以别调试和分析.Python的 ...

  6. 常用模块:os模块,logging模块等

    一    os模块 那么作为一个常用模块,os模块是与操作系统交互的一个模块. 那么os模块中我们常用的一般有以下几种: os.listdir('dirname') 以列表的形式列出指定目录下的所有文 ...

  7. os模块,sys模块,json和pickle模块,logging模块

    目录 OS模块 sys模块 json和pickle模块 序列化和反序列化 json模块 pickle logging模块 OS模块 能与操作系统交互,控制文件 / 文件夹 # 创建文件夹 import ...

  8. 模块讲解---os模块,sys模块,json和pickle模块,logging模块

    目录 模块的用法 os模块 常用的功能 sys模块 常用的功能 json和pickle模块 4. logging模块 模块的用法 通过 import 或者from......import...... ...

  9. Python中的logging模块

    http://python.jobbole.com/86887/ 最近修改了项目里的logging相关功能,用到了python标准库里的logging模块,在此做一些记录.主要是从官方文档和stack ...

  10. python日志记录-logging模块

    1.logging模块日志级别 使用logging模块简单示例: >>>import logging >>>logging.debug("this's a ...

随机推荐

  1. 【JVM】查看JVM加载的类及类加载器的方法

    查看JVM加载了哪些类 java -verbose[:class|gc|jni] 在输出设备上显示虚拟机运行信息. java -verbose:class 在程序运行的时候有多少类被加载!你可以用ve ...

  2. 学习1__STM32--FatFS之逻辑盘符与物理盘符

    FatFS源代码中的函数逻辑关系 第一 调用函数 f_mount() result = f_mount(&fs, FS_VOLUME_NAND, ); /* Mount a logical d ...

  3. js排序算法总结

    快速排序 大致分三步: 1.找基准(一般是以中间项为基准) 2.遍历数组,小于基准的放在left,大于基准的放在right 3.递归 快速排序的平均时间复杂度是O(nlogn),最差情况是O(n²). ...

  4. [HEOI2014]平衡(整数划分数)

    下课了,露露.花花和萱萱在课桌上用正三棱柱教具和尺子摆起了一个“跷跷板”. 这个“跷跷板”的结构是这样的:底部是一个侧面平行于地平面的正三棱柱教具,上面 摆着一个尺子,尺子上摆着若干个相同的橡皮.尺子 ...

  5. Keepalived+Nginx搭建主从高可用并带nginx检测

    应用环境:部分时候,WEB访问量一般,或者测试使用,利用Keepalived给Nginx做高可用即可满足要求. 测试环境:   搭建步骤: 1. 安装软件 在Nginx-A和Nginx-B上: ~]# ...

  6. VSCode创建自定义代码段

    上一篇:PyCharm创建自定义代码段(JetBrains系列通用) 设置方法 很简单,快速过一下,F1,然后输入snippets 然后选择对应语言 Python案例 内容和使用: { // pref ...

  7. SpringBoot学习笔记(6) SpringBoot数据缓存Cache [Guava和Redis实现]

    https://blog.csdn.net/a67474506/article/details/52608855 Spring定义了org.springframework.cache.CacheMan ...

  8. BZOJ2288 生日礼物

    本题是数据备份的进阶版. 首先去掉所有0,把连续的正数/负数连起来. 计算所有正数段的个数与总和. 然后考虑数据备份,有一点区别: 如果我们在数列中选出一个负数,相当于把它左右连起来. 选出一个正数, ...

  9. Python线程状态和全局解释器锁

    在刚接触Python的时候时常听到GIL这个词,并且发现这个词经常和Python无法高效的实现多线程划上等号.本着不光要知其然,还要知其所以然的研究态度,博主搜集了各方面的资料,花了一周内几个小时的闲 ...

  10. bat 复制文件夹,文件名递增 等操作

    句尾无';' @echo off : 回显,使命令不在dos中一行一行输出 pause : 暂停,以便看到输出结果 变量 %% 与 % % : https://zhidao.baidu.com/que ...