基本用法:
import logging

#初始化logger 对象
logger = logging.getLogger("main")
#设置logger对象基础级别,后面的handle的级别是基于此级别上的:及如果基础级别为 warning,则后面的handle最小级别就是handle了;如果基础是info,后面handle的级别是warning,则是warning
logger.setLevel(logging.WARNING) # 建立一个filehandler来把日志记录在文件里,级别为debug以上
filehandle = logging.FileHandler("test.log")
filehandle.setLevel(logging.DEBUG) # 建立一个streamhandler来把日志打在CMD窗口上,级别为info以上
consolehandle = logging.StreamHandler()
consolehandle.setLevel(logging.INFO) # 分别为两个handle设置日志格式
formatter = logging.Formatter("%(asctime)s - %(name)s - %(module)s - %(funcName)s - %(levelname)s - %(message)s")
filehandle.setFormatter(formatter)
consolehandle.setFormatter(formatter) #将两个handler添加在logger对象中
logger.addHandler(consolehandle)
logger.addHandler(filehandle) # 开始打日志
logger.debug("debug message")
logger.info("info message")
logger.warn("warn message")
logger.error("error message")
logger.critical("critical message")
注:

1. logger:提供日志接口,供应用代码使用。logger最长用的操作有两类:配置和发送日志消息。可以通过logging.getLogger(name)获取logger对象,如果不指定name则返回root对象,多次使用相同的name调用getLogger方法返回同一个logger对象。

2. handler:将日志记录(log record)发送到合适的目的地(destination),比如文件,socket等。一个logger对象可以通过addHandler方法添加0到多个handler,每个handler又可以定义不同日志级别,以实现日志分级过滤显示。

3. filter:提供一种优雅的方式决定一个日志记录是否发送到handler。

4. formatter:指定日志记录输出的具体格式。formatter的构造方法需要两个参数:消息的格式字符串和日期字符串,这两个参数都是可选的。

 
5. format:定义了最终log信息的顺序,结构和内容:
 
%(message)s', '%Y-%m-%d %H:%M:%S'
%(name)s Logger的名字
%(levelname)s 文本形式的日志级别
%(message)s 用户输出的消息
%(asctime)s 字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒
%(levelno)s 数字形式的日志级别
%(pathname)s 调用日志输出函数的模块的完整路径名,可能没有
%(filename)s 调用日志输出函数的模块的文件名
%(module)s  调用日志输出函数的模块名
%(funcName)s 调用日志输出函数的函数名
%(lineno)d 调用日志输出函数的语句所在的代码行
%(created)f 当前时间,用UNIX标准的表示时间的浮 点数表示
%(relativeCreated)d 输出日志信息时的,自Logger创建以 来的毫秒数
%(thread)d 线程ID。可能没有
%(threadName)s 线程名。可能没有
%(process)d 进程ID。可能没有
===========================================================
当一个项目比较大的时候,不同的文件中都要用到Log,可以考虑将其封装为一个类来使用:
class Logger(object):
def __init__(self,loggerName,fileLog):
basic_level = logging.DEBUG
console_level = logging.INFO
file_level = logging.INFO formatter = logging.Formatter("%(asctime)s - %(name)s - %(module)s - %(funcName)s - %(levelname)s - %(message)s") self.logger = logging.getLogger(loggerName)
self.logger.setLevel(basic_level) file_handle = logging.FileHandler(fileLog)
file_handle.setLevel(file_level)
file_handle.setFormatter(formatter) console_handle = logging.StreamHandler()
console_handle.setLevel(console_level)
console_handle.setFormatter(formatter) self.logger.addHandler(file_handle)
self.logger.addHandler(console_handle) def debug(self, message):
self.logger.debug(message) def info(self, message):
self.logger.info(message) def warn(self, message):
self.logger.warn(message) def error(self, message):
self.logger.error(message) def critical(self, message):
self.logger.critical(message) if __name__ == '__main__':
import datetime
dt = datetime.datetime.now()
logfilename = "../logs/test_%s.log" % dt.strftime('%Y%m%d')
logger = Logger("Python.utils.Log",logfilename)
logger.debug("this is a test for debug")
logger.info("this is a test for info")
logger.warn("this is a test for warn")
logger.error("this is a test for error")
在另外一个 .py 文件里,只要导入这个模块,并实例化类 Logger 就可以在整个project 范围内 输出日志了。
 
另外注意一点的是:自定义Logger类可以和 logging 混合运用,也可以在整个project 范围内用。但有一点要注意的是 当自定义Logger类和 logging 混用,在实例化logger时 ( = logging.getLogger(loggerName) ) loggerName 要有一个规范: 就是必需有层级关系,譬如 按照 project.package.module的 形式, 当在不同的 py文件 中 loggerName 中的 project 是一样时,
都可以用logger 来输出日志。譬如 在 main.py 中 = logging.getLogger("pytest.test.main") 以及另外一个文件中的 =logging.getLogger("pytest.utils.ApiTestRunner")
 

Python logging 学习的更多相关文章

  1. python logging 学习笔记

    logging.basicConfig函数各参数: filename: 指定日志文件名 filemode: 和file函数意义相同,指定日志文件的打开模式,'w'或'a' format: 指定输出的格 ...

  2. Python logging 模块学习

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

  3. Python模块学习:logging 日志记录

    原文出处: DarkBull    许多应用程序中都会有日志模块,用于记录系统在运行过程中的一些关键信息,以便于对系统的运行状况进行跟踪.在.NET平台中,有非常著名的第三方开源日志组件log4net ...

  4. python logging模块使用流程

    #!/usr/local/bin/python # -*- coding:utf-8 -*- import logging logging.debug('debug message') logging ...

  5. (转)python logging模块

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

  6. python logging模块使用教程

    简单使用 #!/usr/local/bin/python # -*- coding:utf-8 -*- import logging logging.debug('debug message') lo ...

  7. 【目录】Python模块学习系列

    目录:Python模块学习笔记 1.Python模块学习 - Paramiko  - 主机管理 2.Python模块学习 - Fileinput - 读取文件 3.Python模块学习 - Confi ...

  8. 【原】Learning Spark (Python版) 学习笔记(三)----工作原理、调优与Spark SQL

    周末的任务是更新Learning Spark系列第三篇,以为自己写不完了,但为了改正拖延症,还是得完成给自己定的任务啊 = =.这三章主要讲Spark的运行过程(本地+集群),性能调优以及Spark ...

  9. 60分钟Python快速学习(给发哥一个交代)

    60分钟Python快速学习 之前和同事谈到Python,每次下班后跑步都是在听他说,例如Python属于“胶水语言啦”,属于“解释型语言啦!”,是“面向对象的语言啦!”,另外没有数据类型,逻辑全靠空 ...

随机推荐

  1. hihocoder1860 最大异或和

    思路: 把N个前缀异或和插入一棵trie树中,然后对每个前缀异或和x计算能使x ^ y最大的前缀异或和y.利用了异或运算的a ^ b ^ a = b的性质. 参考了https://cloud.tenc ...

  2. C#实现MD5WITHRSA签名

    这是很久以前的写的一篇博客了,今天把他重新找出来整理一下发布到博客园 当时对接银联的时候搞了很久都没搞出来,后来一个偶然的机会发现类似的一个代码参考了一下终于弄好了 这段代码主要是实现了C#服务端对接 ...

  3. Android View 背景选择器编写技巧

    在项目中选择器的使用是非常多的,以下是本人在项目中的一些常用的背景选择器的写法 带边框下划线背景选择器效果图: 上面布局中放了10个CheckBox,然后设置了CheckBox的背景图片位,背景选择器 ...

  4. 导入maven的java web项目运行报错找不到Spring监听器

    本地成功运行的一个maven项目,在另一台机器复制下来并导入,运行时报错: java.lang.ClassNotFoundException: org.springframework.web.cont ...

  5. Jenkins结合ant传递参数

    需求: 使用Jenkins的「参数化构建过程」,由用户手动输入参数.通过ant脚本接收这个参数,并输出(当然,中间也可以进行复杂的处理,这里为了说明问题,仅做简单的输出). 1.基础环境 Jenkin ...

  6. 【Web应用-FTP】FTP 容量显示说明

    现象描述 Azure 门户显示的文件系统存储容量跟网站本身的磁盘空间不符. 问题分析 Azure Web 应用的文件系统存储用量和网站本身有关,具体容量如下所示: 但目前门户预览中关于 FTP 的容量 ...

  7. 洛谷 P1464 Function

    题目描述 对于一个递归函数w(a,b,c) 如果a<=0 or b<=0 or c<=0就返回值1. 如果a>20 or b>20 or c>20就返回w(20,2 ...

  8. SAP产品的Field Extensibility

    SAP开发人员的工作职责,除了实现软件的功能性需求外,还会花费相当的精力实现一些非功能性需求,来满足所谓的SAP Product Standard(产品标准).这些产品标准,包含在SAP项目实施中大显 ...

  9. UVA 1664 Conquer a New Region (Kruskal,贪心)

    题意:在一颗树上要求一个到其他结点容量和最大的点,i,j之前的容量定义为i到j的路径上的最小边容量. 一开始想过由小到大的去分割边,但是很难实现,其实换个顺序就很容易做了,类似kruskal的一个贪心 ...

  10. Luogu P5349 幂

    大力数学题,发现自己好久没写多项式水平急速下降,求逆都要写挂233 首先看到关于多项式的等比数列求和,我们容易想到先求出每一项的系数然后最后累加起来即可,即设\(f_i=\sum_{n=0}^{\in ...