一个简单的、功能性的、自以为是的python记录器
simplog的Python项目详细描述
简单日志
一个简单的、功能强大的、固执己见的python记录器
动机
我通常只需要在我的服务中实现简单的日志记录。在大多数情况下,我不需要什么特别花哨的东西, 但我确实需要坚持一致的格式,以帮助日志分析器完成他们的工作。
要求
目前,这需要运行Python3(针对3.6开发,但应在最新版本下编译)
用法
有三个主要步骤:
- 生成登录函数:
log = logger.make_logger(print)
- 为日志功能提供一些输入:
log("The program is exploding", level='error', why='Value Error')
- 观察结果:
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()
更改默认标签
如果您不喜欢msg
和level
,可以在制作日志时轻松地切换这些
如果要为时间添加标签,也可以这样做
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
待办事项
- 适当分配
- 测试和优化性能
- 支持自定义字符转义?
- 对mypy的附加支持