酷徒LOGO
0 0 评论
  • 显示原文与译文双语对照的内容
文章标签:log  Fluent  Fluentd  str  Struct  结构  日志记录器  
A structured logger for Fluent

  • 源代码名称:fluent-logger-python
  • 源代码网址:http://www.github.com/fluent/fluent-logger-python
  • fluent-logger-python源代码文档
  • fluent-logger-python源代码下载
  • Git URL:
    git://www.github.com/fluent/fluent-logger-python.git
  • Git Clone代码到本地:
    git clone http://www.github.com/fluent/fluent-logger-python
  • Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/fluent/fluent-logger-python
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
    
  • Fluentd

    许多 web/移动应用程序生成大量的事件日志( c。 登录,注销,购买,跟踪等)。 分析这些事件日志对于改进服务非常有价值。 然而,挑战在于轻松而可靠地收集这些日志。

    Fluentd 通过以下方法解决该问题: 安装方便。占用空间小。插件。可靠的缓冲。日志转发等。

    fluent-logger-python 是一个 python 库,用于记录 python 应用程序中的事件。

    要求

    • python 2.6或者更大,包括 3。x
    • msgpack-python

    安装

    这里库作为'fluent记录器'python 包分发。 请执行以下命令来安装它。

    $ pip install fluent-logger

    配置

    必须使用tcp源配置启动Fluentd守护进程:

    <source>
     type forward
     port 24224
    </source>

    要快速测试安装程序,请添加一个记录到stdout的匹配器:

    <match app.**>
     type stdout
    </match>

    用法

    FluentSender接口

    sender.FluentSender 是Fluentd的结构化事件记录器。

    默认情况下,记录器假定fluentd守护进程在本地启动。 你还可以通过传递选项来指定远程记录器。

    from fluent import sender# for local fluentlogger = sender.FluentSender('app')# for remote fluentlogger = sender.FluentSender('app', host='host', port=24224)

    对于发送事件,使用事件调用发出方法。 下面的示例将事件发送到 fluentd,带有标记'应用程序。跟随'和属性'来自'和'到'。

    # Use current timelogger.emit('follow', {'from': 'userA', 'to': 'userB'})# Specify optional timecur_time =int(time.time())
    logger.emit_with_time('follow', cur_time, {'from': 'userA', 'to':'userB'})

    若要发送具有纳秒精度时间戳( 0.14和更高版本)的事件,请在FluentSender上指定 nanosecond_precision。

    # Use nanosecondlogger = sender.FluentSender('app', nanosecond_precision=True)
    logger.emit('follow', {'from': 'userA', 'to': 'userB'})
    logger.emit_with_time('follow', time.time(), {'from': 'userA', 'to': 'userB'})

    可以通过发出的返回值来检测错误。 如果发出错误,发出返回 false 并使用last_error方法获取一个错误对象。

    ifnot logger.emit('follow', {'from': 'userA', 'to': 'userB'}):
     print(logger.last_error)
     logger.clear_last_error() # clear stored error after handled errors

    如果要关闭客户端,请调用 close() 方法。

    logger.close()

    基于的事件接口

    这个API是 sender.FluentSender的包装器。

    首先,你需要调用 sender.setup() 来创建全局 sender.FluentSender 记录器实例。 这个调用只需要在应用程序的开始处调用一次,例如。

    基于事件的API初始化代码如下:

    from fluent import sender# for local fluentsender.setup('app')# for remote fluentsender.setup('app', host='host', port=24224)

    然后,请创建这样的事件。 这将把事件发送到 fluentd,带有标签'应用程序。跟随'和属性'来自'和'到'。

    from fluent import event# send event to fluentd, with 'app.follow' tagevent.Event('follow', {
     'from': 'userA',
     'to': 'userB'})

    event.Event 有一个不能返回成功/失败结果的限制。

    基于事件的接口的其他方法。

    sender.get_global_sender # get instance of global sendersender.close # Call FluentSender#close

    用于缓冲区溢出的处理程序

    你可以在连接失败时插入自己的自定义过程来处理缓冲区溢出。 这将减少数据的丢失,而不是简单地丢弃数据。

    import msgpackfrom io import BytesIOdefoverflow_handler(pendings):
     unpacker = msgpack.Unpacker(BytesIO(pendings))
     for unpacked in unpacker:
     print(unpacked)
    logger = sender.FluentSender('app', host='host', port=24224, buffer_overflow_handler=overflow_handler)

    你应该处理处理程序中的任何异常。 fluent记录器忽略来自 buffer_overflow_handler的异常。

    这里处理程序在 close() 期间存在挂起事件时也被调用。

    python-logging.Handler 接口

    这个客户端库还具有 python 日志记录模块的FluentHandler 类。

    import loggingfrom fluent import handler
    custom_format = {
     'host': '%(hostname)s',
     'where': '%(module)s.%(funcName)s',
     'type': '%(levelname)s',
     'stack_trace': '%(exc_text)s'}
    logging.basicConfig(level=logging.INFO)
    l = logging.getLogger('fluent.test')
    h = handler.FluentHandler('app.follow', host='host', port=24224, buffer_overflow_handler=overflow_handler)
    formatter = handler.FluentRecordFormatter(custom_format)
    h.setFormatter(formatter)
    l.addHandler(h)
    l.info({
     'from': 'userA',
     'to': 'userB'})
    l.info('{"from":"userC","to":"userD"}')
    l.info("This log entry will be logged with the additional key: 'message'.")

    你还可以通过 logging.config.dictConfig 自定义格式化程序

    import logging.configimport yamlwithopen('logging.yaml') as fd:
     conf = yaml.load(fd)
    logging.config.dictConfig(conf['logging'])

    你可以在连接失败时插入自己的自定义过程来处理缓冲区溢出。 这将减少数据的丢失,而不是简单地丢弃数据。

    import msgpackfrom io import BytesIOdefoverflow_handler(pendings):
     unpacker = msgpack.Unpacker(BytesIO(pendings))
     for unpacked in unpacker:
     print(unpacked)

    示例配置 logging.yaml 将是:

    logging:
     version: 1 formatters:
     brief:
     format: '%(message)s' default:
     format: '%(asctime)s%(levelname)-8s%(name)-15s%(message)s' datefmt: '%Y-%m-%d %H:%M:%S' fluent_fmt:
     '()': fluent.handler.FluentRecordFormatter
     format:
     level: '%(levelname)s' hostname: '%(hostname)s' where: '%(module)s.%(funcName)s' handlers:
     console:
     class : logging.StreamHandler
     level: DEBUG formatter: default
     stream: ext://sys.stdout
     fluent:
     class: fluent.handler.FluentHandler
     host: localhost
     port: 24224 tag: test.logging
     buffer_overflow_handler: overflow_handler
     formatter: fluent_fmt
     level: DEBUG none:
     class: logging.NullHandler
     loggers:
     amqp:
     handlers: [none]
     propagate: False conf:
     handlers: [none]
     propagate: False'': # root logger handlers: [console, fluent]
     level: DEBUG propagate: False

    测试

    测试可以使用 nose进行测试。

    版本

    需要车轮包。

    $ pip install wheel

    然后,键入以下命令:

    $ python setup.py clean sdist bdist_wheel upload

    贡献者

    补丁由提供这些人员。

    许可证

    Apache许可,版本 2.0



    文章标签:str  log  Struct  结构  Fluent  日志记录器  Fluentd  

    Copyright © 2011 HelpLib All rights reserved.    知识分享协议 京ICP备17041772号-2  |  如果智培  |  酷兔英语  |  帮酷