Python日志处理器,可以将消息发送到Graylog扩展日志格式(GELF)。
项目描述
描述
Python日志处理器,可以将日志消息发送到Graylog扩展日志格式(GELF)。
graypy支持将GELF日志发送到Graylog2和Graylog3服务器。
安装
使用pip
安装基本的graypy Python日志处理器
pip install graypy
使用GELFRabbitHandler的要求进行安装
pip install graypy[amqp]
使用easy_install
安装基本的graypy Python日志处理器
easy_install graypy
使用GELFRabbitHandler的要求进行安装
easy_install graypy[amqp]
使用方法
graypy通过Python logging.Handler类的子类将GELF日志发送到Graylog服务器。
以下是graypy定义的以下可运行GELF日志处理器的列表
GELFUDPHandler - UDP日志转发
GELFTCPHandler - TCP日志转发
GELFTLSHandler - 带TLS支持的TCP日志转发
GELFHTTPHandler - HTTP日志转发
GELFRabbitHandler - RabbitMQ日志转发
UDP日志
使用 GELFUDPHandler 可以轻松地将UDP日志转发到本地托管的Graylog服务器
import logging
import graypy
my_logger = logging.getLogger('test_logger')
my_logger.setLevel(logging.DEBUG)
handler = graypy.GELFUDPHandler('localhost', 12201)
my_logger.addHandler(handler)
my_logger.debug('Hello Graylog.')
UDP GELF Chunkers
GELF UDP Chunking 由 GELFUDPHandler 支持,并在其构造函数中的 gelf_chunker 参数中定义。默认情况下使用 GELFWarningChunker,因此,GELF消息如果数据块溢出(即包含超过128个数据块),将发出 GELFChunkOverflowWarning 并 被丢弃。
其他 gelf_chunker 选项也可用
BaseGELFChunker 会静默地丢弃数据块溢出的 GELF 消息
GELFTruncatingChunker 会发出 GELFChunkOverflowWarning 并简化、截断数据块溢出的 GELF 消息,以尝试发送一些内容到 Graylog。如果此过程无法防止另一个数据块溢出,则发出 GELFTruncationFailureWarning。
RabbitMQ 日志
或者,使用 GELFRabbitHandler 将消息发送到 RabbitMQ,并配置您的 Graylog 服务器通过 AMQP 消费消息。这可以防止由于丢弃的 UDP 数据包而丢失日志消息(GELFUDPHandler 使用 UDP 将消息发送到 Graylog)。您需要配置 RabbitMQ 使用 gelf_log 队列,并将其绑定到 logging.gelf 交换,以便消息被正确路由到可以被 Graylog 消费的消息队列(队列和交换机名称可以按您的喜好自定义)。
import logging
import graypy
my_logger = logging.getLogger('test_logger')
my_logger.setLevel(logging.DEBUG)
handler = graypy.GELFRabbitHandler('amqp://guest:guest@localhost/', exchange='logging.gelf')
my_logger.addHandler(handler)
my_logger.debug('Hello Graylog.')
Django 日志
通过在您的 settings.py 中添加新的处理器,可以轻松地将 graypy 集成到 Django 的日志设置中。
LOGGING = {
'version': 1,
# other dictConfig keys here...
'handlers': {
'graypy': {
'level': 'WARNING',
'class': 'graypy.GELFUDPHandler',
'host': 'localhost',
'port': 12201,
},
},
'loggers': {
'django.request': {
'handlers': ['graypy'],
'level': 'ERROR',
'propagate': True,
},
},
}
跟踪日志
默认情况下,捕获的异常跟踪信息会作为 full_message 字段添加到 GELF 日志中
import logging
import graypy
my_logger = logging.getLogger('test_logger')
my_logger.setLevel(logging.DEBUG)
handler = graypy.GELFUDPHandler('localhost', 12201)
my_logger.addHandler(handler)
try:
puff_the_magic_dragon()
except NameError:
my_logger.debug('No dragons here.', exc_info=1)
默认日志字段
如果可用,默认情况下会自动将一些调试日志字段添加到 GELF 日志中
function
pid
process_name
thread_name
您可以通过在处理器的构造函数中指定 debugging_fields=False 来禁用自动添加这些调试日志字段
handler = graypy.GELFUDPHandler('localhost', 12201, debugging_fields=False)
添加自定义日志字段
graypy 还支持在发送到 Graylog 的 GELF 日志中包含自定义字段。这可以通过使用 Python 的 LoggerAdapter 和 Filter 类来实现。
使用 LoggerAdapter
LoggerAdapter 使得向 GELF 日志消息中添加静态信息变得容易
import logging
import graypy
my_logger = logging.getLogger('test_logger')
my_logger.setLevel(logging.DEBUG)
handler = graypy.GELFUDPHandler('localhost', 12201)
my_logger.addHandler(handler)
my_adapter = logging.LoggerAdapter(logging.getLogger('test_logger'),
{'username': 'John'})
my_adapter.debug('Hello Graylog from John.')
使用 Filter
Filter 提供了更大的灵活性,并允许向 GELF 日志中添加动态信息
import logging
import graypy
class UsernameFilter(logging.Filter):
def __init__(self):
# In an actual use case would dynamically get this
# (e.g. from memcache)
self.username = 'John'
def filter(self, record):
record.username = self.username
return True
my_logger = logging.getLogger('test_logger')
my_logger.setLevel(logging.DEBUG)
handler = graypy.GELFUDPHandler('localhost', 12201)
my_logger.addHandler(handler)
my_logger.addFilter(UsernameFilter())
my_logger.debug('Hello Graylog from John.')
贡献者
Sever Banesiu
Daniel Miller
Tushar Makkar
Nathan Klapstein
项目详情
下载文件
下载适用于您平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。