python logging模块

python logging提供了标准的日志接口,python logging日志分为5个等级:

debug(), info(), warning(), error() and critical()

简单用法

  1. import logging
  2. logging.warning("warning.........")
  3. logging.critical("server is down")

print:

  1. WARNING:root:warning.........
  2. CRITICAL:root:server is down

5个日志级别所代表的意思:

Level 说明
DEBUG Detailed information, typically of interest only when diagnosing problems.
INFO Confirmation that things are working as expected.
WARNING An indication that something unexpected happened, or indicative of some problem in the near future (e.g. ‘disk space low’). The software is still working as expected.
ERROR Due to a more serious problem, the software has not been able to perform some function.
CRITICAL A serious error, indicating that the program itself may be unable to continue running.

把日志写到文件里

  1. import logging
  2. logging.basicConfig(filename="log_test.log", level=logging.INFO) #此处定义了日志级别,INFO以及高于INFO的日志会被记录
  3. logging.debug("debug..............")
  4. logging.info("info..............")
  5. logging.warning("warning...........")

结果:

我们把日志级别调整一下:

  1. import logging
  2. logging.basicConfig(filename="log_test.log", level=logging.DEBUG) #level 改为 debug
  3. logging.debug("debug..............")
  4. logging.info("info..............")
  5. logging.warning("warning...........")

结果:

debug 级别的日志已经记录了。另外,日志的写入方式是追加,不会覆盖之前的日志。


自定义日志格式

日志格式参数:

%(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 用户输出的消息

上段代码看一下:

  1. import logging
  2. logging.basicConfig(filename="log_test.log",
  3. level=logging.DEBUG,
  4. format="%(asctime)s - %(levelname)s - %(module)s - %(lineno)d %(message)s",
  5. datefmt="%Y-%m-%d %I:%M:%S:%p"
  6. )
  7. def fun1():
  8. logging.error("error......")
  9. fun1()
  10. logging.debug("debug..............")
  11. logging.info("info..............")
  12. logging.warning("warning...........")

结果:


高级用法

  1. 1.生成logger对象
  2. logger = logging.getLogger("web")
  3. logger.setLevel(logging.INFO) #设置日志级别。默认日志级别为 warning
  4. # 2.生成handler对象
  5. console_handler = logging.StreamHandler() # 用于打印的handler
  6. console_handler.setLevel(logging.WARNING) #也可以专门针对 handler设置日志级别
  7. file_handler = logging.FileHandler("web.log") # 用于输出到文件的 handler
  8. file_handler.setLevel(logging.ERROR)
  9. # 2.1 把handler 对象 绑定到 logger
  10. logger.addHandler(console_handler)
  11. logger.addHandler(file_handler)
  12. # 3.生成formatter 对象
  13. console_formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
  14. file_formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(lineno)s - %(message)s")
  15. # 3.1 把formatter 对象 绑定到 handler
  16. console_handler.setFormatter(console_formatter)
  17. file_handler.setFormatter(file_formatter)
  18. logger.info("info----")
  19. logger.warning("warning-------------")
  20. logger.error("error-------")

全局设置的日志级别 和 handler等设置的日志级别,是逐级过滤的。

比如:

  • 全局设置的级别是 info ,handler 设置的级别是 debug , 到最后,debug级别的日志会被过滤掉
  • 全局设置的界别是 info,handler设置的级别是 error ,到最后,error已经高于error 级别的日志会被输出

过滤日志:

  1. # *_*coding:utf-8 *_*
  2. import logging
  3. class IngonreBackupLogFilter(logging.Filter):
  4. """查找带 db backup 的日志"""
  5. def filter(self, record):#固定写法
  6. return "db backup" in record.getMessage()
  7. # 1.生成logger对象
  8. logger = logging.getLogger("web")
  9. logger.setLevel(logging.DEBUG) #设置日志级别。默认日志级别为 warning
  10. # 1.1 把filter对象添加到logger中
  11. logger.addFilter(IngonreBackupLogFilter())
  12. # 2.生成handler对象
  13. console_handler = logging.StreamHandler() # 用于打印的handler
  14. file_handler = logging.FileHandler("web.log") # 用于输出到文件的 handler
  15. # 2.1 把handler 对象 绑定到 logger
  16. logger.addHandler(console_handler)
  17. logger.addHandler(file_handler)
  18. # 3.生成formatter 对象
  19. console_formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
  20. file_formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(lineno)s - %(message)s")
  21. # 3.1 把formatter 对象 绑定到 handler
  22. console_handler.setFormatter(console_formatter)
  23. file_handler.setFormatter(file_formatter)
  24. logger.info("info----")
  25. logger.warning("warning-------------")
  26. logger.error("error-------")
  27. logger.error("error db backup ----")
  28. # 打印:
  29. # 2018-07-08 20:10:40,023 - web - ERROR - error db backup ----

文件自动截断:

  1. import logging
  2. from logging import handlers
  3. logger = logging.getLogger(__name__)
  4. log_file = "timelog.log"
  5. # file_handler = handlers.RotatingFileHandler(filename=log_file, maxBytes=10, backupCount=3)
  6. file_handler = handlers.TimedRotatingFileHandler(filename=log_file,when="S",interval=5,backupCount=3)
  7. formatter = logging.Formatter('%(asctime)s - %(module)s - %(lineno)d - %(message)s')
  8. file_handler.setFormatter(formatter)
  9. logger.addHandler(file_handler)
  10. logger.warning("test1")
  11. logger.warning("test2")
  12. logger.warning("test3")
  13. logger.warning("test4")

结果:会按时间生成不同的日志文件:

file_handler = handlers.TimedRotatingFileHandler(filename=log_file,when="S",interval=5,backupCount=3)

You can use the when to specify the type of interval. The list of possible values is below. Note that they are not case sensitive.

(你可以使用when来指定interval的类型。可能的值列表如下。注意它们不是区分大小写的。 )

(这个英语还是有很有必要花时间去搞一下的)

Value Type of interval
'S' Seconds
'M' Minutes
'H' Hours
'D' Days
'W' Week day (0=Monday)
'midnight' Roll over at midnight 午夜roll over

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

  1. python logging模块可能会令人困惑的地方

    python logging模块主要是python提供的通用日志系统,使用的方法其实挺简单的,这块就不多介绍.下面主要会讲到在使用python logging模块的时候,涉及到多个python文件的调 ...

  2. python logging模块使用

    近来再弄一个小项目,已经到收尾阶段了.希望加入写log机制来增加程序出错后的判断分析.尝试使用了python logging模块. #-*- coding:utf-8 -*- import loggi ...

  3. 读懂掌握 Python logging 模块源码 (附带一些 example)

    搜了一下自己的 Blog 一直缺乏一篇 Python logging 模块的深度使用的文章.其实这个模块非常常用,也有非常多的滥用.所以看看源码来详细记录一篇属于 logging 模块的文章. 整个 ...

  4. (转)python logging模块

    python logging模块 原文:http://www.cnblogs.com/dahu-daqing/p/7040764.html 1 logging模块简介 logging模块是Python ...

  5. Python logging 模块学习

    logging example Level When it's used Numeric value DEBUG Detailed information, typically of interest ...

  6. Python logging模块无法正常输出日志

    废话少说,先上代码 File:logger.conf [formatters] keys=default [formatter_default] format=%(asctime)s - %(name ...

  7. 0x03 Python logging模块之Formatter格式

    目录 logging模块之Formatter格式 Formater对象 日志输出格式化字符串 LogRecoder对象 时间格式化字符串 logging模块之Formatter格式 在记录日志是,日志 ...

  8. 0x01 Python logging模块

    目录 Python logging 模块 前言 logging模块提供的特性 logging模块的设计过程 logger的继承 logger在逻辑上的继承结构 logging.basicConfig( ...

  9. Python Logging模块的简单使用

    前言 日志是非常重要的,最近有接触到这个,所以系统的看一下Python这个模块的用法.本文即为Logging模块的用法简介,主要参考文章为Python官方文档,链接见参考列表. 另外,Python的H ...

随机推荐

  1. 把linux图形启动界面修改成命令行界面

    由于图形界面比较耗资源,需要把启动界面修改成命令行界面,怎么修改呢? 1.vim /etc/inittab 2.把id:5:initdefault:改成 id:3:initdefault: 3.重启即 ...

  2. 理解Windows注册表

    理解Windows注册表 注意 完之前先备份reg 前言 在Windows 3.x之前, Windows都是使用.ini文件来保存配置信息的, 但是.ini文件的大小最大只能为64KB, 为了突破这个 ...

  3. (三)TestNG

    1.testNG的部分注解 test测试方法都是执行顺序:并不是从上往下执行的,而是根据方法名ASCII码进行执行的,小的先执行 比如a比b先执行,1比2先执行,不管代码放的顺序是怎么样. impor ...

  4. node使用https,webSocket开启wss

    1. 前言 看WEBRTC教程时使用到WebSocket来传输信令,node端使用了ws库来实现,但在浏览器端http无法获取本地媒体,必须使用https,使用https后webSocket 不能使用 ...

  5. 跨页面传值2之cookie多值使用

    单值cookie结构 CookieKeyName——CookieValue CookieKeyName2——CookieValue2 ............... 通过CookieKeyName进行 ...

  6. Nginx+PM2+Node.js最简单的配置

    一个最简单的反向代理配置方式 server { listen ; server_name www.luckybing.top; location / { proxy_pass http://127.0 ...

  7. python学习(五)--打印错误信息

    from urllib import request #打印错误信息 except Exceptionlist = [ "http://www.baidu11.com/", &qu ...

  8. Linux防火墙命令

    linux 查看防火墙状态   1.查看防火墙状态 systemctl status firewalld firewall-cmd --state #查看默认防火墙状态(关闭后显示notrunning ...

  9. Android - Rxjava 使用和原理

    用RxJava写的一个Android的小Demo 我所理解的RxJava——上手其实很简单 http://www.jianshu.com/p/5e93c9101dc5

  10. PAT 1066 Root of AVL Tree

    #include <cstdio> #include <cstdlib> class Node { public: Node* L; Node* R; int height; ...