- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章python 日志模块logging的使用场景及示例由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
日志是对于软件执行所发生的事件的一种追踪记录方式。日常使用过程中对代码执行的错误和问题会进行查看日志来分析定位问题所在。平常编写代码以及调试也经常用到。通常的新手的做法是直接print打印,但是打印的结果只在控制台显示。今天我们学习一种高级的日志打印和记录模块logging.
logging提供了一系列的函数,它们是debug(), info(), warning(), error(), 和critical().
他们的使用场景请看下表 。
。
你想要执行的任务 | 此任务的最好的工具 |
---|---|
对于命令行或程序的应用,结果显示在控制台。 | print() |
在对程序的普通操作发生时提交事件报告(比如:状态监控和错误调查) | logging.info() 函数(当有诊断目的需要详细输出信息时使用 logging.debug() 函数) |
提出一个警告信息基于一个特殊的运行时事件 | warnings.warn()位于代码库中,该事件是可以避免的,需要修改客户端应用以消除告警logging.warning() 不需要修改客户端应用,但是该事件还是需要引起关注 |
对一个特殊的运行时事件报告错误 | 引发异常 |
报告错误而不引发异常(如在长时间运行中的服务端进程的错误处理) | logging.error(), logging.exception() 或 logging.critical()分别适用于特定的错误及应用领域 |
。
日志功能分别对各种事件和严重性都进行分级.
。
名称 | 何时使用 | 等级 |
---|---|---|
DEBUG | 细节信息,仅当诊断问题时适用。 | 10 |
INFO | 确认程序按预期运行 | 20 |
WARNING | 表明有已经或即将发生的意外(例如:磁盘空间不足)。程序仍按预期进行 | 30 |
ERROR | 由于严重的问题,程序的某些功能已经不能正常执行 | 40 |
CRITICAL | 严重的错误,表明程序已不能继续执行 | 50 |
。
因为是python自带的所以无需安装,默认的级别是WARNING,所以下面只显示一条warning信息.
import logginglogging.warning('this is warning')logging.info('this is info')
我们将默认的级别改成最低级别,则会打印同级别以及高级别的日志信息 。
import logging logging.basicConfig(level=logging.DEBUG)logging.debug('this is debug')logging.info('this is info')logging.warning('this is warning')logging.error('this is error')
只是打印到控制台对于少量信息倒是可控,但是信息量大的时候就不方便查找了。那么我们需要将其保存到文件中.
import logging logging.basicConfig(level=logging.DEBUG,filename='log.log',format='%(asctime)s - %(lineno)s - %(levelname)s - %(message)s')logger = logging.getLogger(__name__)logger.debug('this is debug')logger.info('this is info')logger.warning('this is warning')logger.error('this is error')
上面我们在保存的时候,同时还添加了其他描述信息,比如执行时间,执行代码行数,日志级别,打印消息。当然方法远不止这些,具体请看下表 。
。
属性名称 | 格式 | 描述 |
---|---|---|
ARGS | 你不需要自己设置格式。 | 参数元组被合并到msg中以产生消息,或者其值被用于合并的词典(当只有一个参数时,它是一个字典)。 |
asctime | %(asctime)类 | 创建时的可读时间。默认情况下,这是'2003-07-08 16:49:45,896'的格式(逗号之后的数字是毫秒部分)。 |
created | %(created)的F | 创建的时间(由time.time()返回)。 |
exc_info | 你不需要自己设置格式。 | 异常元组(àla sys.exc_info)或,如果没有发生异常,则为无。 |
filename | %(filename)类 | 路径名的文件名部分。 |
funcName | %(funcName)类 | 包含日志记录调用的函数的名称。 |
levelname | %(levelname)■ | 文本消息级别('DEBUG','INFO','WARNING','ERROR','CRITICAL')。 |
levelno | %(levelno)s | 消息的数字记录级别(DEBUG,INFO,WARNING,ERROR,CRITICAL)。 |
lineno | %(lineno)d | 发出日志记录调用的源行号。 |
module | %(module)类 | 模块(文件名称部分)。 |
msecs | %(msecs)d | 创建时的毫秒部分。 |
message | %(message)类 | 记录的消息,计算为msg%args。这是在调用Formatter.format()时设置的。 |
msg | 你不需要自己设置格式。 | 在原始日志记录调用中传递的格式字符串。与args合并生成消息或任意对象(请参阅使用任意对象作为消息)。 |
name | %(name)类 | 用于记录呼叫的记录器的名称。 |
pathname | %(filename)类 | 发出日志记录调用的源文件的完整路径名。 |
process | %(process)d | 进程ID。 |
processName | %(processName)类 | 进程名称。 |
relativeCreated | %(relativeCreated)d | 相对于加载日志记录模块的时间,LogRecord创建时的时间(以毫秒为单位)。 |
thread | %(thread)d | 线程ID。 |
threadName | %(threadName)类 | 线程名称。 |
。
首先了解以下进阶的方法的说明:
StreamHandler 类位于核心 logging 包,它可将日志记录输出发送到数据流例如 sys.stdout, sys.stderr 或任何文件类对象(或者更精确地说,任何支持 write() 和 flush() 方法的对象 。
FileHandler 类位于核心 logging 包,它可将日志记录输出到磁盘文件中。 它从 StreamHandler 继承了输出功能.
我们需要通过调用 Logger 类(以下称为 loggers , 记录器)的实例来执行日志记录.
Logger 对象有三个常见的方法:
下面示例采用添加日志记录器对象输出和上面一样在控制台打印 。
import logging logger = logging.getLogger(__name__)logger.setLevel(level=logging.INFO)handler = logging.StreamHandler()formatter = logging.Formatter('%(asctime)s - %(lineno)s - %(levelname)s - %(message)s')handler.setFormatter(formatter)logger.addHandler(handler) logger.info('This is a log info')logger.debug('Debugging')logger.warning('Warning exists')logger.info('Finish')
当然也同样能保存到文件,为了演示修改了文件名称为put.log 。
import logging logger = logging.getLogger(__name__)logger.setLevel(level=logging.INFO)handler = logging.FileHandler('put.log')formatter = logging.Formatter('%(asctime)s - %(lineno)s - %(levelname)s - %(message)s')handler.setFormatter(formatter)logger.addHandler(handler) logger.info('This is a log info')logger.debug('Debugging')logger.warning('Warning exists')logger.info('Finish')
import logginglogger = logging.getLogger(__name__)logger.setLevel(level=logging.INFO)handler1 = logging.FileHandler('output.log')handler2 = logging.StreamHandler()formatter = logging.Formatter('%(asctime)s - %(lineno)s - %(levelname)s - %(message)s')handler1.setFormatter(formatter)handler2.setFormatter(formatter)logger.addHandler(handler1)logger.addHandler(handler2)logger.info('This is a log info')logger.debug('Debugging')logger.warning('Warning exists')logger.info('Finish')
以上就是python 日志模块logging的使用场景及示例的详细内容,更多关于python 日志模块logging的使用的资料请关注我其它相关文章! 。
原文链接:https://www.cnblogs.com/huny/p/14227165.html 。
最后此篇关于python 日志模块logging的使用场景及示例的文章就讲到这里了,如果你想了解更多关于python 日志模块logging的使用场景及示例的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
不同的 LogCat 方法是: Log.v(); // Verbose Log.d(); // Debug Log.i(); // Info Log.w(); // Warning Log.e();
在android群里,经常会有人问我,android log是怎么用的,今天我就把从网上以及sdk里东拼西凑过来,让大家先一睹为快,希望对大家入门android log有一定的帮助. android
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 4 年前。 社区 12
我正在尝试使用 sonarlint 检查代码质量.上面的问题概要,我不明白为什么它要说要大写。但是 this discussion与上述建议相反。哪一个应该被认为是正确的? 最佳答案 这没有正确答案,
随着 n 变大,log*(log n) 和 log(log* n) 这两个函数会更快吗? 这里,log* 函数是迭代对数,定义如下: 我怀疑它们是相同的,只是写法不同,但它们之间有什么区别吗? 最佳答
作为家庭作业,我被要求在 O(log(n)) 中编写一个算法,我可以计算出我编写的算法的复杂度为 O(log(n) + log(n/2) + log(n/4) + log(n/8) + ... + l
我正在使用 Tomee。日志文件夹包含这样的文件 localhost_access_log.2016-12-02.txt localhost.2016-12-02.log catalina.2016-
Android Log.v、Log.d、Log.i、Log.e 等的 ios 等效项是什么?同样在 android 上,我使用 Android 设备监视器和 logcat 来访问我的手机日志,我需要在
我认为下面的代码是 O(log log n) 因为它里面有 i*i 但我对 log n 感到困惑> 和 log (log n)。 for (i=2; i*i<=number; i++) { if
我正在修改 kvm 模块,并在内核代码中添加了 printk 语句。运行虚拟机后,printk 为我提供了错误地址和有关 guest 操作系统的其他信息。 我需要从这个信息中生成统计信息。当我使用 d
我有一个部署为 Windows Azure Web 角色的 WCF 服务。 我正在使用 Enterprise Library 进行异常处理,并且在我的本地 Development Fabric 中,似
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 9 年前。 Improv
在 Go 的生产中使用 log.SetFlags(log.LstdFlags | log.Lshortfile) 是好的做法(至少是一般做法)吗?我想知道在生产中这样做是否存在性能或安全问题。因为它不
我想知道什么更快: double value = Math.log(a) - Math.log(b); 或 double value = Math.log(a/b); 我计算值的方式是否会对性能产生影
我有数百个子例程使用 log.Println() 写入日志文件 我正在使用 log.Println 写入 error.log 文件。 func main() { e, err := os.Open
我将 Nuxt 与 SSR 一起使用,并希望有类似于 apaches 的 access.log 和 error.log 的东西 我特别感兴趣的是每次调用的响应时间。 我在 nuxt 文档中找不到任何内
我知道以前有人问过这个问题,但我相信这是一个不同的问题。 Nginx 在 www-data 下运行: $ ps -eo "%U %G %a" | grep nginx root root
我在我的日志文件中发现了一个非常奇怪的条目 Jan 29 01:35:30 vs-proj-handy sshd[5316]: Received disconnect from 130.207.203
对于我正在开发的应用程序,我希望在开发过程中和发布时简化故障排除。我希望能够检索到对 Log 的调用,以了解在 USB 调试中没有连接手机的情况下运行应用程序时的调用,以便可以检索并发送给我。例如,当
我试图捕获 panic 并记录错误: func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloRep
我是一名优秀的程序员,十分优秀!