一个简单的、功能性的、自以为是的python记录器

simplog的Python项目详细描述


简单日志

一个简单的、功能强大的、固执己见的python记录器

动机

我通常只需要在我的服务中实现简单的日志记录。在大多数情况下,我不需要什么特别花哨的东西, 但我确实需要坚持一致的格式,以帮助日志分析器完成他们的工作。

要求

目前,这需要运行Python3(针对3.6开发,但应在最新版本下编译)

用法

有三个主要步骤:

  1. 生成登录函数: log = logger.make_logger(print)
  2. 为日志功能提供一些输入: log("The program is exploding", level='error', why='Value Error')
  3. 观察结果: 2018-12-02T22:44:17.269137 level=error why="Value Error" msg="The program is exploding"

注意,只需要级别和消息。此外,level的默认值为info。所有其他值 要记录的可以作为关键字参数提供(见上文),关键字参数将以key=value格式记录。电流 系统时间也总是提供,以帮助安排事件。 此外,有些配置可能会使它们在某些情况下有用。

基本

一般来说,我只需要一张打印出来的标准版。您可以通过以下方法完成此任务:

fromloggerimportmake_logger,refine_loggerfromuuidimportuuid4# Generate a logger functionmain_logger=make_logger()main_logger("This is happening on the mainline")# prints to standard out: 'dt level=info msg="This is happening on the mainline"'ctx_logger=refine_logger(main_logger,context=uuid4())ctx_logger("A configured logger")# prints to standard out: 'dt level=info context="ff088e2c-b127-4d8a-ba1d-347de59d302e" msg="A configured logger"'

高级

如果您需要更健壮的产品,那么就有一些配置机会。

预过滤日志值

如果您希望确保始终为记录器提供一致的值,可以通过 refine_logger方法。这将返回一个新的记录器,该记录器在调用时始终具有提供的数组。请注意 在幕后,这只是对functool的partial

的调用。
log=make_logger()rlog=refine_logger(log,confidence_level="100%")rlog("Things are going well")# Outputs: 2018-12-02T23:23:43.524875 level=info confidence_level=100% msg="Things are going well"# These values is overwritable as well:rlog("Things aren't looking so great",confidence_level="25%")# Outputs: 2018-12-02T23:24:07.786726 level=info confidence_level=25% msg="Things aren't looking so great"

输出到其他地方

此项目旨在登录到控制台,但将接受任何接受字符串作为输入的函数。

# Completely untested, but in theory this would workimportosdefmake_filewriter_function(output_path):writer=open(output_path,'a',0)# Writing in unhuffered modedefwrite_fn(s):writer.write(s)defclose_fn():os.close(writer)returnwrite_fn,close_fnwrite_fn,close_fn=make_filewriter_function('/var/log/my-script-log.log')log=logger.make_logger(write_fn)# ...close_fn()

更改默认标签

如果您不喜欢msglevel,可以在制作日志时轻松地切换这些 如果要为时间添加标签,也可以这样做

custom_log=logger.make_logger(print,message_label='message',level_label='logLevel',time_label='app_time')custom_log("Look at that!")# outputs: app_time=2018-12-02T23:06:59.566174 logLevel=info message="Look at that!"

强制报价

默认情况下,任何没有空格的值都将不带引号,而任何有空格的字符串都将带双引号 (即"Expect values like this") 如果始终确保值被引用,则可以通过在make-logger构造函数中提供force_quote=True来实现。

序列化非标准值

如果有要记录的类,则需要提供自己的序列化程序。一旦你有了它,你就可以传递serialize函数 使用to_string_func参数。

开发

这个项目使用pipenv来帮助开发。用法见https://pipenv.readthedocs.io/en/latest/

运行测试

这个项目使用pytest来运行单元测试。它们可以通过以下途径运行:

pipenv shell
cd simplog
python -m pytest

待办事项

  1. 适当分配
  2. 测试和优化性能
  3. 支持自定义字符转义?
  4. 对mypy的附加支持

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

推荐PyPI第三方库


热门话题
java需要64位jdk 1.5 for windows   eclipse运算符+对于参数类型java是未定义的。双,爪哇。双人   未下载文件扩展名为的java文件   java不支持带有POST的媒体类型   从动态创建的多个EditText读取文本时发生java错误   java无法为同一xpath单击多个按钮   如何在Java中动态格式化字符串   java Android Clear Middle活动   多线程Java内存模型volatile和x86   git在Java中通过Jgit忽略文件或文件夹   java“决策无法区分输入的备选方案1、2…”   子类的javajpa继承   java需要弄清楚如何操作mutator来弄清楚一个类,教授说,我对如何操作感到困惑   java如何使用JDBC将数据从文件复制到PostgreSQL?