平衡事件日志记录架构和库

balog的Python项目详细描述


BALOG
==

[![构建状态](https://travis-ci.org/balanced/balog.svg?branch=master)(https://travis ci.org/balanced/balog)


对模式进行不必要的更改)


设计原理
=另一组是应用程序
本身的日志。在大多数情况下,应用程序应该只对
应用程序日志本身感兴趣。日志工具应该只关心如何处理整个事件,而不是使用应用程序日志的内容。此外,由于应用程序的模式可以变化,因此我们不希望每次更改应用程序日志时都更改
整个模式。考虑到这些问题,
我想到的一个想法是,Internet OSI模型实际上正在处理同一个问题。就像tcp/ip协议不需要知道
应用层的内容一样。类似地,日志记录工具不必知道应用程序日志的内容
。考虑到这个想法,我为我们的日志系统定义了两个层。

-facility layer
-application layer

facility layer是关于事件的,当它生成时,由谁发出这个
事件,它的路由标签是什么等等。application layer是关于
application数据,如处理争议、创建借方等。

d={
'cls_type':'metrics',
'values':[
{'name':'total','value':123},
{'name':'succeeded','value':456},
{'name':'failed','value':789},
],
})
`````

在上面的例子中,假设这里的"justita.scripts.process_results"是
"justita.scripts.process_results",那么通道名是"justita.scripts.process_results.done"。如果要覆盖通道名称,还可以将"channel"参数传递给BALOG日志记录方法。

consumer logs
----


要使用事件,可以使用类似这样的"consumer配置"从BALOG中

``python
。consumer导入consumer配置

@consumer_配置(
topic='myproj-events-{env}',
cls_type='metrics',
version='<;1.0',

def process_metrics(settings,event):
pass
`````

this`consumer镡config` decorator主要用于声明该消费者想要的内容,在上面的示例中,因为想要su订阅队列"myproj events develop"或"myproj events prod",因此我们将主题设置为"myproj events-{env}",对于{env}占位符,我们稍后将讨论这个问题。然后我们只对"metrics"类型的事件感兴趣,所以我们将"cls"类型设置为"metrics"。我们也不想处理不兼容的事件,因此将"version"设置为"<;1.0"。

对于这些已配置的使用者,要处理事件,需要先使用"consumerhub"。基本上是消费者的集合。它提供扫描方法,使收集消费者变得非常容易。例如,您可以在这里编写

``python
import yourpackage
from balog.consumers import consumerhub

hub=consumerhub()
hub.scan(yourpackage)
````

然后可以创建事件处理引擎。目前我们只有amazon sqs事件处理引擎,但是应该很容易实现根据需要安装任何其他类型的发动机。在我们创建引擎之前,需要先定义一个"consumerroperator"。它基本上是一个知道如何操作这些消费者的对象。这样你就可以用你想要的方式调用这些消费者函数。下面是一个示例:


`` python
类使用者属性(对象):


def初始(self,settings):
self.settings=settings

env=self.settings['api.sqs.queue-env']
返回consumer.topic.format(env=env)

def process_event(self,consumer,event):
return consumer.func(self.settings,event)
```

正如我们在"consumer配置"中看到的主题名称是上面的"myproj events-{env}",这里我将解释为什么它看起来像这样。因为我们可能需要在不同的环境(如集成或生产环境)中订阅不同的事件队列,所以不能只在其中保留一个静态值。为了使其尽可能灵活,我让使用者操作员决定如何获取主题名称。因此,在我们的示例中,您可以看到它从设置中获取"api.sqs.queue_env",并替换"env"占位符。通过这样做,我们可以确定以后订阅哪个队列。与延迟主题名类似,我还希望能够以您喜欢的方式调用consumer函数,consumer operator的"process_event"方法就是为了这个目的。因为在consumer handler函数中,我们可能需要一些除了事件之外的额外信息,在我们的示例中,我们还需要读取设置。因此,在我们的示例中,我们向consumer函数传递一个额外的参数"settings"。

r/>导入您的包




def process_event(self,consumer,event):
return consumer.func(self.settings,event)




def process_events(settings):
"处理sqs中的日志事件

"
hub=consumerhub()
hub.scan(yourpack)
consumer op=consumerropertor(设置)
引擎=sqs engine(
集线器=集线器,
区域=设置['api.sqs.region',
aws_access_key_id=settings['api.sqs.aws_access_key_id',
aws_secret_access_key=settings['api.sqs.aws_secret_access_key'],
使用者操作员=使用者操作,

引擎.run()
```

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

推荐PyPI第三方库


热门话题
java如何通过jamod读取控制器的输入状态?   java Back bean方法在使用两个h的单一表单时未调用:selectonemenus和command button   mockitojava中的单元测试Mock继承方法   java在不传递到构造函数的情况下,将一个类的实例使用到另一个类中的最佳方法是什么   java Spring MVC:如何通过API在Dozer的toplevel字段中允许空值?   java hibernate到MSSQL服务器的连接被拒绝:连接   java动态调用现有变量   在java中扩展多个类的泛型   java使用JNA Ptrace获取linux中外部进程的信息?   eclipse获取Java项目中所有构建错误的最快方法是什么?   java将动态数组拆分为多个数组   java安卓:将json保存到sqlite   java获取最近时间Android   java如何为多对多关联编写HQL查询?   java Docker compose for mysql和spring应用程序拒绝访问   java查找数组(如果它是另一个数组的子集)   java如何在另一个具有相同数据类型参数的泛型类(或接口)中使用泛型类(或接口),而无需强制转换   Apache POI java。lang.NoClassDefFoundError:org/apache/commons/compress/utils/InputStreamStatistics   java使用Jackson将JSON反序列化为异构元素列表   使用MapReduce实现java规范化