昨天的任务是需要记录各操作的性能数据,所以需要用这种格式来输出日志:{"adb_start_time": 1480040663, "tag_name": "CLIMB_TOWER_8", "adb_end_time": 1480040767, "case_status": 0}
开始时间、操作名称、结束时间、运行结果("0": "成功","1": "失败","2": "异常")。于是简单的学习了一下日志输出:

一. 使用Python标准库——logging

1. 日志级别

日志一共分为5个级别:DEBUG<INFO<WARNING<ERROR<CRITICAL,分别对应logging的五个方法:debug、info、warning、error、critical。默认的是WARNING,当在WARNING或以上级别时,才会被跟踪。有两种方式记录跟踪:1)输出到控制台;2)记录到文件中,如日志文件

2. 日志组件

日志组件包括:logger、handler、filters、formatters

1. logger:主要扮演了三个角色:1)暴露给应用五个方法(debug..)以便应用在运行时写log;2)logger对象 按照log信息的严重程度或根据filter对象来决定如何处理log信息(默认的过滤功能);3)还负责把log信息传送给相关的loghandlers

2. handler:负责分配合适的log信息(基于log信息的严重程度)到handler指定的目的地。logger对象可以用addhandler()方法添加零个或多个handler对象。

例如:一个应用既可以将所有的log信息发送到一个log文件,所有的ERROR信息发送到stdout,所有的CRITICAL信息通过邮件发送,这里需要三个不同的Handler,每个Handler负责把特定的信息发送到特定的地方。

3. filter:过滤,确定哪些日志输出

4. formatter:设置显示格式

先看一个最简单的例子

# 1. 创建logger
logger = logging.getLogger(“sbw”) # 2. 设置输入到日志文件
logging.basicConfig(filename="../mylog.log",
level=flevel,
format="%(asctime)s %(levelname)s %(funcName)s %(message)s") # 3. 终端Handler——输出到控制台
consoleHandler = logging.StreamHandler()
consoleHandler.setLevel(clevel) # 定义Handle的格式
formatter = logging.Formatter("%(asctime)s %(levelname)s %(funcName)s %(message)s") # 给Handle添加formatter
consoleHandler.setFormatter(formatter) # 给logger添加handler
self.logger.addHandler(consoleHandler)

对于日志记录,还可以使用logging.FileHandler:

import logging 

# 1、创建一个logger
logger = logging.getLogger('mylogger')
logger.setLevel(logging.DEBUG) # 2、创建一个handler,用于写入日志文件
fh = logging.FileHandler('test.log')
fh.setLevel(logging.DEBUG) # 3、定义handler的输出格式(formatter)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') # 4、给handler添加formatter
fh.setFormatter(formatter) # 5、给logger添加handler
logger.addHandler(fh)

典型的记录流程:

  1. 创建logger
  2. 创建handler
  3. 定义formatter
  4. 给handler添加formatter
  5. 给logger添加handler

3. logger

日志记录的工作主要是由Logger对象来完成的

3.1 创建logger——logging.getLogger([name])

在调用getLogger时需要提供Logger名称(如果多次使用相同的名称来调用getLogger,返回的是同一个对象的引用)。Logger实例之间有层次关系,名字中使用点号来进行等级管理,例如:

p = logging.getLogger("root")
c1 = logging.getLogger("root.c1")
c2 = logging.getLogger("root.c2")

例子中,p是父logger, c1,c2分别是p的子logger。c1, c2将继承p的设置。如果省略了name参数, getLogger将返回日志对象层次关系中的根Logger。如果logger有父类,日志流会同时发送给logger和logger的父类的handler。

最好的方式,用:logging.getLogger("__name__"):

3.2 Logger方法

  1. logger.setLevel():设置日志的级别。对于低于该级别的日志消息将被忽略。
  2. logger.addHandler():添加handler;logger.remoteHandler():删除handler
  3. logger.addFilter():添加filter;logger.remoteHandler():删除filter
  4. logger.debug()、logger.info()、logger.warning()、logger.error()、logger.critical():记录日志
  5. logger.log(level, msg):logger.log(Logging.WARN, 'msg')==logging.warn('msg')

3.3 Logger属性

  • Logger.handlers 该logger已添加的Handlers
  • Logger.filters 该logger已添加的Filters
  • 获取Logger实例:getLogger() 来获取logger。

4. Handler

一个logger可以设置0个或以上的Handler。logger执行记录日志的方法后,会把日志交给Handler来处理。

4.1 Handler方法

  1. Handler.setLevel() 设置logger的日志严重程度
  2. Handler.addFilter,Handler.remoteFilter()添加或删除Filter
  3. setFormatter() 设置日志输出的格式

4.2 Handler类

1. logging.StreamHandler()

输出日志到一个文件对象,可以是open打开的文件,也可以是系统终端,例如sys.stdout或sys.stderr。

# 1. 将日志输出到一个文件
file = open('./test.log', 'w')
fileHandler = logging.StreamHandler(file) # 2. 输出到控制台(默认是:sys.stderr)
consoleHandler = logging.StreamHandler()
# 或者:
consoleHandler2=logging.StreamHandler(sys.stdout)

2. logging.FileHandler(filename[, mode])

向一个文件中输出日志内容。如果文件根路径不存在,会报错。如果文件根路径存在,但是文件不存在,会自动创建文件。

  • filename是日志文件路径。
  • mode是写文件的方法,例如’a','w',参考open里面的mode

3. logging.handlers.RotatingFileHandler

类似FileHandler,不同的是这个可以管理文件的大小,如果日志文件大于某个值,就会把旧的日志重命名,并创建新的日志文件。如果有三个日志文件chat.log,chat.log.1,chat.log.2 ,时间大小:chat.log>chat.log.1>chat.log.2

RotatingFileHandler( filename[, mode[, maxBytes[, backupCount]]])
# 其中:
# filename和mode两个参数和FileHandler一样。
# maxBytes 最大文件大小,单位字节,0代表无限大。
# backupCount 保留的备份个数。

例如:

# 日志回滚
import logging
from logging.handlers import RotatingFileHandler RtHandler = RotatingFileHandler("../mylog.log", maxBytes=20 * 1024 * 1024, backupCount=5)
RtHandler.setLevel(logging.DEBUG)
formatter = logging.Formatter("%(asctime)s %(levelname)s %(funcName)s %(message)s")
RtHandler.setFormatter(formatter)
self.logger.addHandler(RtHandler)

4. logging.handlers.TimedRotatingFileHandler

这个Handler和RotatingFileHandler类似,不同的是这个Handler通过时间来切分日志文件:

TimedRotatingFileHandler( filename [,when [,interval [,backupCount]]])

其中filename参数和backupCount参数和RotatingFileHandler具有相同的意义

  • interval是时间间隔。
  • when参数是一个字符串。表示时间间隔的单位,不区分大小写。它有以下取值:
    S 秒
    M 分
    H 小时
    D 天
    W 每星期(interval==0时代表星期一)
    midnight 每天凌晨

5. 其他

5. logging.handlers.SocketHandler

6. logging.handlers.DatagramHandler
以上两个Handler类似,都是将日志信息发送到网络。不同的是前者使用TCP协议,后者使用UDP协议。它们的构造函数是:

  • Handler(host, port)

其中host是主机名,port是端口名

7. logging.handlers.SysLogHandler

8. logging.handlers.NTEventLogHandler

9. logging.handlers.SMTPHandler

10. logging.handlers.MemoryHandler

11. logging.handlers.HTTPHandler

5. Formatter

设置格式

二、使用配置:

Python 日志输出的更多相关文章

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

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

  2. Python 日志输出中添加上下文信息

    Python日志输出中添加上下文信息 除了传递给日志记录函数的参数(如msg)外,有时候我们还想在日志输出中包含一些额外的上下文信息.比如,在一个网络应用中,可能希望在日志中记录客户端的特定信息,如: ...

  3. python日志输出

    import logging logger = logging.getLogger() #生成一个日志对象,()内为日志对象的名字,可以不带,名字不给定就是root,一般给定名字,否则会把其他的日志输 ...

  4. 修改Python文件日志输出位置

    Python logging模块介绍:http://blog.chinaunix.net/uid-26000296-id-4372063.html [root@fuel ~]# vi /var/lib ...

  5. Python之向日志输出中添加上下文信息

    除了传递给日志记录函数的参数(如msg)外,有时候我们还想在日志输出中包含一些额外的上下文信息.比如,在一个网络应用中,可能希望在日志中记录客户端的特定信息,如:远程客户端的IP地址和用户名.这里我们 ...

  6. 【转】Python之向日志输出中添加上下文信息

    [转]Python之向日志输出中添加上下文信息 除了传递给日志记录函数的参数(如msg)外,有时候我们还想在日志输出中包含一些额外的上下文信息.比如,在一个网络应用中,可能希望在日志中记录客户端的特定 ...

  7. 浅析python日志重复输出问题

    浅析python日志重复输出问题 问题起源: ​ 在学习了python的函数式编程后,又接触到了logging这样一个强大的日志模块.为了减少重复代码,应该不少同学和我一样便迫不及待的写了一个自己的日 ...

  8. python的日志模块:logging;django的日志系统;django日志输出时间修改

    Django的log,主要是复用Python标准库中的logging模块,在settings.py中进行配置 源代码 1.__init__.py包含以下类: StreamHandler Formatt ...

  9. python日志模块logging

    python日志模块logging   1. 基础用法 python提供了一个标准的日志接口,就是logging模块.日志级别有DEBUG.INFO.WARNING.ERROR.CRITICAL五种( ...

随机推荐

  1. 将windows共享文件夹挂载在linux机器的/mnt/windows/ 目录下进行访问

    将windows共享文件夹挂载在linux机器的/mnt/windows/ 目录下进行访问.windows机器ip:192.168.1.101,用户名:XXXX密码:XXXXlinux机器ip:ip2 ...

  2. 探讨ES6的import export default 和CommonJS的require module.exports

    今天来扒一扒在node和ES6中的module,主要是为了区分node和ES6中的不同意义,避免概念上的混淆,同时也分享一下,自己在这个坑里获得的心得. 在ES6之前 模块的概念是在ES6发布之前就出 ...

  3. 个人遗漏知识的回顾-HTML

    常用的一些快捷键: Windows + e 我的电脑Ctrl + Tab 网页间不同页面切换F2 重命名Ctrl+Shift+S 另存为 前端的一些常识:前端意义:将效果图生成网页网页组成:文字.图片 ...

  4. Android 退出整个应用程序

    我们在写android应用程序时,经常会遇到想退出当前Acitivity,或者直接退出应用程序.我之前的一般操作是按返回键,或者直接按home键直接返回,其实这两种操作都没有关闭当前应用程序,没有释放 ...

  5. iphone设置fiddler代理测试

    iPhone上配置fiddler为代理方法: 打开IPhone, 找到你的网络连接,打开HTTP代理,输入Fiddler所在机器的IP地址(比如:192.168.1.104) 以及Fiddler的端口 ...

  6. PRINCE2是什么?

    PRINCE是PRoject IN Controlled Environment(受控环境下的项目管理)的简称. PRINCE2描述了如何以一种逻辑性的.有组织的方法,按照明确的步骤对项目进行管理. ...

  7. JBoss jmx-console中的秘密

    JBoss jmx-console中的秘密 https://wenku.baidu.com/view/fe196f047cd184254b35351d.html

  8. Jquery Ajax向服务端传递数组参数值

    在使用MVC时,向服务器端发送POST请求时有时需要传递数组作为参数值 下面使用例子说明,首先看一下Action [HttpPost] public ActionResult Test(List< ...

  9. 搜索菜单栏侧滑效果控件SearchView

    搜索菜单栏侧滑效果控件SearchView 本人视频教程系类   iOS中CALayer的使用 效果1: 效果2: 项目中用到的图片 bgImg@2x.png: 源码: SearchView.h + ...

  10. Python入门-模块1(模块导入与time模块)

    ---恢复内容开始--- 模块 一.模块分类: 模块分为三种: 1.内置模块:Python自带的标准模块(可使用help('modules’)查看Python自带模块列表) 2.第三方开源模块:可以通 ...