python logging使用_python logging使用指南

为什么要使用logging?

比起print,logging更适合使用在项目中。logging可以方便的定制日志的格式,并且提供了日志分级,可以通过设置日志级别来决定哪些级别的日志可以输出。logging还提供了直接输出到文件的功能,logging可以满足大多数框架的日志需求。

基础

大模块分类:

Logger: 公开程序代码直接使用的接口

Handlers: 将日志发送到适当的目的地。

Filters: 提供了更细粒度的工具来确定输出哪些日志记录。

Formatters: 格式化程序在最终输出中指定日志记录的布局。

什么时候适合用logging呢?

执行的任务

最佳日志工具

需要控制台输出的程序

print()

报告程序运行期间的信息,或者错误信息(用于状态监控或错误调查)

loging.info(), (logging.erro()用于细致的调查)

发出特定运行时警告

warning.warn(): 如果报错时,客户端是可以改的。用这个。

logging.warning():如果客户端什么也不做,但还是需要记录信息。

记录异常日志,而不抛出异常(长时运行服务器的异常处理器)

loging.error(), logging.exception(), logging.critical()

日志级别:

Debug: 详细日志,,一般用于调查问题。

INFO: 确认用例按照预期的要求运行。

WARNING: 预示意外事件发生,或者将会在近期发生(如磁盘空间不足)。软件仍然正常工作中。

Error: 由于一个严重的问题,软件无法执行某些功能。

CRITICAL: 一个严重的问题,导致整个软件可能不无法正常运行。

默认级别是WARNING

logging基础使用

最简单的例子

logging.warning("test warning")

logging.info("test info")

输入日志到文件

logging.basicConfig(filename="testtest.log", level=logging.DEBUG)

logging.debug("test debug info to a file")

logging.info("test info to a file")

logging.warning("test warning to a file")

通过命令行配置日志等级

loglevel = "DEBUG"

numeric_level = getattr(logging, loglevel.upper(), None)

if not isinstance(numeric_level, int):

raise ValueError('Invalid log level: %s' % loglevel)

logging.basicConfig(level=numeric_level)

注意事项:

basicConfig总是在第一次调用日志输出之前调用。之后调用日志输出就不再配置了。就算之后直接调用basicConfig也没有用。

这也可以带来另一个福利,只要在一个地方配置好logging后,就算是在其他模块中调用logging,也会输出到相同的地方。

使用logging输出变量

logging.warning('%s before you %s', 'Look', 'leap!')

配置输出日志的格式:

logging.basicConfig(format='%(asctime)s %(levelname)s %(message)s', datefmt='%m/%d/%Y %I:%M:%S %p')

asctime: 表示日期

datefmt:表示时间格式

levelname: log level的名称

message: 调用logging.warning时输出信息

logging支持的属性格式:

时间格式化支持,和time.strfime一样。

logging进阶

使用logger name来区分logger

在记录日志时,一个很好的约定是在每个日志记录模块使用一个模块级的日志记录程序

logger = logging.getLogger(__name__)

logger name可以支持层级模式,一看san.pdf就知道它是san的子模块。

默认的logger name是root

basicConfig:的默认format是:severity:logger name:message

handler的应用

handler主要是为了把不同的

使用示例:

-------------------------

logger = logging.getLogger()

logging.basicConfig(format='%(asctime)s %(levelname)s %(message)s', level=logging.DEBUG)

formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')

fh = logging.FileHandler("../log/test1.log")

fh.setLevel(logging.WARN)

fh.setFormatter(formatter)

logger.addHandler(fh)

debug_fh = logging.FileHandler("debug.log")

debug_fh.setLevel(logging.INFO)

debug_fh.setFormatter(formatter)

logger.addHandler(debug_fh)

logger.debug("test debug")

logger.info("test info")

logger.warning("test warn")

--------------------------

Filter的应用

filter,相当于logrecord会经过的地方,可以对所有的日志信息进行更精细化的定制。加了ip后,就可以通过format中的%(ip)-15s来把相应的值输出出来了。

--------------------

import logging

from random import choice

class MyFilter(logging.Filter):

IPS = ["10.12.13.233", "22.22.22.22"]

def filter(self, record):

record.ip = choice(MyFilter.IPS)

return True

if __name__ == '__main__':

filter = MyFilter()

logger = logging.getLogger()

logging.basicConfig(format="%(asctime)-15s %(ip)-15s %(message)s", level= logging.DEBUG)

logger.addFilter(MyFilter())

logger.setLevel(logging.DEBUG)

logger.warning("this is the warning info")

logger.critical("???")

--------------------

异常日志的捕获

python三的e,不能直接打印出异常日志了。

需要使用

traceback.print_exec()来打印异常日志

traceback.format_exc(): 返回的是字符串,用这个可以把异常信息输出到文件中。

print_exec(file=open("tb.txt", "w+")) 还可以接受file参数直接写入到一个文件中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值