logging

可用的日志级别:

  • debug 10
  • info 20
  • warning 30
  • error 40
  • critical 50

logging默认参数:

  • 默认日志级别是warning。
  • 默认情况日志输出到终端。
  • 默认日志名是root,即默认root产生日志。

简单使用:

import logging
logging.info('info level')

logging的全局配置方式:basicconfig

修改logging模块的默认日志格式。
filename - 指定日志的存储位置。
filemode - 指定文件打开模式。默认'a'
format - 定义日志的格式。
datafmt - 指定日期格式。
level - 定义日志级别,写级别对应的数字。

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

示例:

import logging
logging.basicConfig(
filename='test.log'
format='%(asctime)s - %(name)s - - %(levelname)s -%(module)s: %(message)s',
level=30,
datefmt='%Y-%m-%D %X'
)
logging.error('error level')

缺点:

  • 不能同时输出到文件和终端。
  • 不能多种输出环境的级别、格式的自定义。

logging模块的四种对象

Formatter

定义不同的日志格式对象,然后绑定给不同的Handler。以此来控制不同Handler的日志格式。

Handler

负责接收日志并控制打印到不同地方。一个Handler对象可以绑定一种日志格式。
FileHandler - 打印到文件。
StreamHandler - 打印到终端。

Logger

负责产生日志的对象,getLogger()方法实例化后的对象。对应日志的masage字段。

Filter

负责过滤日志的对象。目测没啥用

logging应用

import logging
#logger对象,负责产生日志信息
logger = logger.getLogger('root') #filter对象,没用 #Handler对象:接受log传来的日志内容,控制打印到终端or文件。
Handler1 = logging.FileHandler('tset1.log')
Handler2 = logging.StreamHandler() #formatter对象
formatter1 = logging.Formatter('%(asctime)s - %(name)s - - %(levelname)s -%(module)s: %(message)s',
datafmt='%Y-%m-%d %H:%M:%S',)
formatter2 = logging.Formatter('%(asctime)s %(name)s %(message)s',) #把日志格式绑定到不同输出对象。
Handler1.setFormatter(formatter1)
Handler2.setFormatter(formatter2) #设置日志输出级别
Handler1.setLevel(10) #设置日志产生的级别
logger.setLevel(10) #把日志信息绑定到Handler来输出。
logger.addHandler(Handler1) #测试。
logger.info('info level')

logger与Handler定义级别时的关键

logger是第一级别过滤,然后日志才会到Handler,需给logger和Handler同时设置level,但要注意:

在所有logger传的日志都要输出时,必须有如下的要求:

内容级别 >= logger对象的日志级别必须 >= Handler对象的日志级别。

logger的继承——只需知道有这么个玩意

import logging
formatter=logging.Formatter('%(asctime)s - %(name)s -%(module)s: %(message)s',) inherit=logging.StreamHandler()
inherit.setFormatter(formatter) logger1=logging.getLogger('root')
logger2=logging.getLogger('root.child1') logger1.addHandler(inherit)
logger2.addHandler(inherit) logger1.setLevel(10)
logger2.setLevel(10) logger1.debug('log1 debug')
logger2.debug('log2 debug')

★生产环境中的应用方法

配置

"logging配置"
import os,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' #定义日志输出格式
logfile_dir = os.path.dirname(os.path.abspath(__file__))
logfile_name = 'production.log' if not os.path.isdir(logfile_dir)
os.mkdir(logfile_dir) #log文件全路径
logfile_path = os.path.join(logfile_dir,logfile_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'
},
#打印到文件
'default': {
'level': 'DEBUG',
'class': 'logging.handlers.RotatingFileHandler',
'formatter': 'standard',
'filename': logfile_path,
'maxBytes': 1024*1024*6,
'encoding': 'utf-8',
},
},
'loggers': {
#logging.getLogger(__name__)时拿到的配置
'': {
#把上面定义的两个Handler加到这里,log即写入文件又打到终端。
'handlers': ['default','console'],
'level': 'DEBUG',
#向上(更高level的logging)传递
'propagate': True,
},
},
}
def load_my_logging_cfg():
logging.config.dictConfig(LOGGING_DIC)
#生成个log实例,__name__即把当前模块名传进去,找不到日志相关配置,使用''这个默认的。
logger = logging.getLogger(__name__)

使用:

"MyLogging Test"

import time
import logging
import my_logging # 导入自定义的logging配置 logger = logging.getLogger(__name__) # 生成logger实例 def demo():
logger.debug("start range... time:{}".format(time.time()))
logger.info("中文测试开始。。。")
for i in range(10):
logger.debug("i:{}".format(i))
time.sleep(0.2)
else:
logger.debug("over range... time:{}".format(time.time()))
logger.info("中文测试结束。。。") if __name__ == "__main__":
my_logging.load_my_logging_cfg() # 在你程序文件的入口加载自定义logging配置
demo()

python--6、logging模块的更多相关文章

  1. Python之logging模块

    一.引言 之前在写一些小程序的时候想把日志内容打到文件中,所以就自己写了一个logger.py的程序,如下: #!/usr/bin/python # -*- coding=utf-8 -*- impo ...

  2. python的logging模块

    python提供了一个日志处理的模块,那就是logging 导入logging模块使用以下命令: import logging logging模块的用法: 1.简单的将日志打印到屏幕上 import ...

  3. python的logging模块之读取yaml配置文件。

    python的logging模块是用来记录应用程序的日志的.关于logging模块的介绍,我这里不赘述,请参见其他资料.这里主要讲讲如何来读取yaml配置文件进行定制化的日志输出. python要读取 ...

  4. python中logging模块的用法

    很多程序都有记录日志的需求,并且日志中包含的信息即有正常的程序访问日志,还可能有错误.警告等信息输出,python的logging模块提供了标准的日志接口,你可以通过它存储各种格式的日志,loggin ...

  5. python基础--logging模块

    很多程序都有记录日志的需求,并且日志中包含的信息即有正常的程序访问日志,还可能有错误.警告等信息输出,python的logging模块提供了标准的日志接口,你可以通过它存储各种格式的日志,loggin ...

  6. Python中logging模块的基本用法

    在 PyCon 2018 上,Mario Corchero 介绍了在开发过程中如何更方便轻松地记录日志的流程. 整个演讲的内容包括: 为什么日志记录非常重要 日志记录的流程是怎样的 怎样来进行日志记录 ...

  7. python之logging模块简单用法

    前言: python引入logging模块,用来记录自己想要的信息.print也可以输入日志,但是logging相对print来说更好控制输出在哪个地方.怎么输出以及控制消息级别来过滤掉那些不需要的信 ...

  8. Python的logging模块详解

          Python的logging模块详解 作者:尹正杰  版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.日志级别 日志级别指的是产生的日志的事件的严重程度. 设置一个级别后,严重程度 ...

  9. Python的logging模块基本用法

    Python 的 logging 模块的简单用法 在服务器部署时,往往都是在后台运行.当程序发生特定的错误时,我希望能够在日志中查询.因此这里熟悉以下 logging 模块的用法. logging 模 ...

  10. python(logging 模块)

    1.logging 模块的日志级别 DEBUG:最详细的日志信息,典型应用场景是 问题诊断 INFO:信息详细程度仅次于DEBUG,通常只记录关键节点信息,用于确认一切都是按照我们预期的那样进行工作 ...

随机推荐

  1. css3部分注意事项

    CSS 选择符有哪些?哪些属性可以继承?优先级算法如何计算? CSS3新增伪类有那些? 1.选择器 id选择器( # myid) 类选择器(.myclassname) 标签选择器(div, h1, p ...

  2. 9.boost权重控制

    主要知识点: 学会在should中使用boost进行权重控制     假如现在有一个需求:要把should中某些字段优先显示, 1.不加boost权重控制 GET /forum/article/_se ...

  3. Vue动态组件&异步组件

    在动态组件上使用keep-alive 我们之前曾经在一个多标签的界面中使用is特性来切换不同的组件: Vue.js的动态组件模板 <component v-bind:is="curre ...

  4. Git 基础教程 之 标签

    所谓标签:就是一个让人容易记住的有意义的名字,与某个commit绑在一起. 创建标签:①切回需要打标签的分支上                  ② git tag <name>  默认标 ...

  5. Java_集合总结

    集合分类 Collection 接口是集合的父类 1.Set 集合 使用内部的排列机制(无序),存入集合的顺序和取出集合的顺序不一致,没有索引,存入集合的元素没有重复 HashSet集合 Linked ...

  6. mysql 源码 王恒 [mysql数据结构+mysql 执行计划]

    http://blog.chinaunix.net/uid/26896862/cid-156733-list-1.html http://www.it168.com/redian/wangheng/

  7. vim快速操作

    简明 VIM 练级攻略 vim的学习曲线相当的大(参看各种文本编辑器的学习曲线),所以,如果你一开始看到的是一大堆VIM的命令分类,你一定会对这个编辑器失去兴趣的.下面的文章翻译自<Learn ...

  8. Cookie &amp;&amp; Session &amp;&amp; Token

    Cookies Cookie的由来: HTTP 本身是一个无状态的 request/response 协议. server接收一个来自client的request, 处理完以后返回一个response ...

  9. Android 65K问题之Multidex原理分析及NoClassDefFoundError的解决方法

    Android 65K问题相信困惑了不少人,尽管AS的出来能够通过分dex高速解决65K问题,可是同一时候也easy由于某些代码没有打包到MainDex里引起NoClassDefFoundError. ...

  10. 深入分析JavaWeb Item47 -- Struts2拦截器与文件上传下载

    一.struts2中的拦截器(框架功能核心) 1.过滤器VS拦截器 过滤器VS拦截器功能是一回事. 过滤器是Servlet规范中的技术,能够对请求和响应进行过滤. 拦截器是Struts2框架中的技术. ...