帮助您过度沟通的日志工具

logquacious的Python项目详细描述


对数

https://img.shields.io/pypi/v/logquacious.svghttps://travis-ci.com/tonysyu/logquacious.svg?branch=masterDocumentation Statushttps://codecov.io/gh/tonysyu/logquacious/branch/master/graph/badge.svg

logquacious是一组简单的日志工具,可以帮助您进行过度通信。 (如果不是听起来那么糟糕,logorrhea应该是个好名字。)

好的应用程序日志记录很容易被忽略,除非您必须调试错误 在生产中。logquacious的目标是使日志记录尽可能简单。你可以 在官方网站ReadTheDocs documentation上查找更多信息。

快速启动

要开始,请首先确保已安装LogQuacious:

$ pip install logquacious

您还需要为应用程序设置日志记录。为了这个 例如,我们将使用非常简单的配置:

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

请注意,此简单配置仅用于演示目的。 有关 用于实际日志记录配置的选项。

logquacious的主接口是LogManager,它可以用于 正常记录:

importlogquaciouslog=logquacious.LogManager(__name__)
log.debug('Nothing to see here.')

由于前面定义了简化的日志记录格式,因此将输出:

DEBUG: Nothing to see here.

这不是一个很有趣的例子。除了基本的日志记录, LogManager有一个用作上下文管理器的context属性:

>>>withlog.context.debug('greetings'):...print('Hello!')DEBUG:EntergreetingsHello!DEBUG:Exitgreetings

同样的属性也可以用作装饰符:

@log.context.infodefdivide(numerator,denominator):ifdenominator==0:log.warning('Attempted division by zero. Returning None')returnNonereturnnumerator/denominator>>>divide(1,0)INFO:Call`divide()`WARNING:Attempteddivisionbyzero.ReturningNoneINFO:Returnfrom`divide`

更好的是,您还可以记录输入参数:

@log.context.info(show_args=True,show_kwargs=True)defgreet(name,char='-'):msg='Hello, {name}'.format(name=name)print(msg)print(char*len(msg))>>>greet('Tony',char='~')INFO:Call`greet('Tony', char='~')`Hello,Tony~~~~~~~~~~~INFO:Returnfrom`greet`

还有一个特殊的上下文管理器,用于抑制错误和日志记录:

withlog.and_suppress(ValueError,msg="It's ok, mistakes happen"):raiseValueError('Test error')
[ERROR] It's ok, mistakes happen
Traceback (most recent call last):
  File "/Users/tyu/code/logquacious/logquacious/log_manager.py", line 103, in and_suppress
    yield
  File "scripts/example.py", line 26, in <module>
    raise ValueError('Test error')
ValueError: Test error

注意上面的回溯是记录的,而不是流到stderr。

配置

LogManager.context使用的消息模板可以配置为 通过将context_templates参数传递给LogManager

log=logquacious.LogManager(__name__,context_templates={'context.start':'=============== Enter {label} ===============','context.finish':'=============== Exit {label} ===============',})withlog.context.debug('greetings'):print('Hello!')
[DEBUG] =============== Enter greetings ===============
Hello!
[DEBUG] =============== Exit greetings ===============

context_templates键的一般格式是:

[CONTEXT_TYPE.]('start'|'finish')[.LOG_LEVEL_NAME]

其中方括号表示可选字段。

CONTEXT_TYPE可以是以下任何一种:

  • function:作为装饰器调用时使用的模板。
  • context:作为上下文管理器调用时使用的模板。

LOG_LEVEL_NAME可以是以下任何日志级别:

  • DEBUG
  • INFO
  • WARNING
  • ERROR
  • CRITICAL

例如,考虑function.start.DEBUG的级联图,其中 看起来像:

     function.start.DEBUG
          /       \
start.DEBUG       function.start
          \       /
            start

使用广度优先搜索执行级联。如果 function.start.DEBUG未定义,请检查start.DEBUG然后检查 function.start在检查start之前。

默认配置为:

DEFAULT_TEMPLATES={'start':'Enter {label}','finish':'Exit {label}','function.start':'Call `{label}({arguments})`','function.finish':'Return from `{label}`',}

注意,自定义配置会更新这些默认值。例如,如果你 如果您想跳过在所有上下文管理器上退出的日志记录,则希望 装饰者,您将把'function.finish'都设置为None 或者空字符串。

如上所示,可以将两个模板变量传递给模板 字符串:labelarguments。当作为上下文管理器调用时,label 是上下文管理器的第一个参数,arguments始终为空。 当作为decorator调用时,label是函数的__name__argumentsa表示输入参数的字符串,如果show_argsor show_kwargs参数是True

学分

这个包是用Cookiecutteraudreyr/cookiecutter-pypackage项目模板。

历史记录

0.5.0(2019-05-05)

  • 来自python 3.8和configure的backportstacklevel关键字参数 stacklevel,以便日志工具报告上下文(例如文件名 和行号),其中调用logquacious实用程序。

0.4.0(2018-10-05)

  • 修复配置覆盖行为以扩展而不是替换默认模板

0.3.0(2018-10-05)

  • log.and_suppresslog.and_reraise上下文添加装饰器支持 经理
  • 禁止记录空/空日志消息模板

0.2.0(2018-10-03)

更改了默认模板。在0.1.0中,模板是:

DEFAULT_TEMPLATES={'start':'Start {label}','finish':'Finish {label}',}

这些默认值已更改为:

DEFAULT_TEMPLATES={'start':'Enter {label}','finish':'Exit {label}','function.start':'Call `{label}({arguments})`','function.finish':'Return from `{label}`',}

0.1.0(2018-10-03)

  • pypi上的第一个版本。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java JavaFX TableView更新单元格,不更新对象值   在扫描器中使用分隔符的java   java OkHttp 4.9.2,连接无法重用,导致端口耗尽   eclipse中的c JNI:运行Java代码   java是否在出厂的所有硬件设备中都有/mnt/sdcard/Android/data文件夹(或等效文件夹)?   Java,在eclipse中访问资源文件夹中的图像   java为什么Bluemix dashDB操作抛出SqlSyntaxErrorException,SQLCODE=1667?   JavaHtmlUnitWebClient。getPage不处理javascript   Google API认证的java问题   java如何将JSON数组反序列化为Apache beam PCollection<javaObject>   ServerSocket停止接收命令,java/安卓   来自Java类的安卓 Toast消息   java如何自动重新加载应用程序引擎开发服务器?   java是否可以尝试/捕获一些东西来检查是否抛出了异常?   java如何做到这一点当我按下load game时,它不仅会加载信息,还会将您带到游戏中?   Java选项Xmx代表什么?   Java映射,它在插入时打印值   设置“ulimit c unlimited”后,java无法生成系统核心转储