平衡事件日志记录架构和库
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()
```
==
[![构建状态](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
返回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()
```