python logging定制logstash的json日志格式

最近一直在折腾日志的收集,现在算是收尾了。  写一篇算python优化logstash的方案。 


其实大家都知道logstash调用grok来解析日志的话,是要消耗cpu的成本的,毕竟是需要正则的匹配的。 

根据logstash调优的方案,咱们可以预先生成json的格式。 我这边基本是python的程序,怎么搞尼 ? 

有两种方法,第一种方法是生成json后,直接打入logstash的端口。 还有一种是生成json写入文件,让logstash做tail操作的时候,把一行的日志数据直接载入json就可以了。

python下的日志调试用得时logging,改成json也是很好改得。  另外不少老外已经考虑到这样的需求,已经做了python logstash的模块。 

import logging
import logstash
import sys

host = 'localhost'

test_logger = logging.getLogger('python-logstash-logger')
test_logger.setLevel(logging.INFO)
test_logger.addHandler(logstash.LogstashHandler(host, 5959, version=1))
# test_logger.addHandler(logstash.TCPLogstashHandler(host, 5959, version=1))

test_logger.error('python-logstash: test logstash error message.')
test_logger.info('python-logstash: test logstash info message.')
test_logger.warning('python-logstash: test logstash warning message.')

# add extra field to logstash message
extra = {
    'test_string': 'python version: ' + repr(sys.version_info),
    'test_boolean': True,
    'test_dict': {'a': 1, 'b': 'c'},
    'test_float': 1.23,
    'test_integer': 123,
    'test_list': [1, 2, '3'],
}
test_logger.info('python-logstash: test extra fields', extra=extra)

python-logstash自带了amqp的方案  

import logging
import logstash

# AMQP parameters
host = 'localhost'
username = 'guest'
password= 'guest'
exchange = 'logstash.py'

# get a logger and set logging level
test_logger = logging.getLogger('python-logstash-logger')
test_logger.setLevel(logging.INFO)

# add the handler
test_logger.addHandler(logstash.AMQPLogstashHandler(version=1,
                                                    host=host,
                                                    durable=True,
                                                    username=username,
                                                    password=password,
                                                    exchange=exchange))

# log
test_logger.error('python-logstash: test logstash error message.')
test_logger.info('python-logstash: test logstash info message.')
test_logger.warning('python-logstash: test logstash warning message.')

try:
    1/0
except:
    test_logger.exception('python-logstash: test logstash exception with stack trace')

不管怎么说,最后生成的格式是这样就可以了。 

{
    "@source"=>"unknown",
    "@type"=>"nginx",
    "@tags"=>[],
    "@fields"=>{
        "remote_addr"=>"192.168.0.1",
        "remote_user"=>"-",
        "body_bytes_sent"=>"13988",
        "request_time"=>"0.122",
        "status"=>"200",
        "request"=>"GET /some/url HTTP/1.1",
        "request_method"=>"GET",
        "http_referrer"=>"http://www.example.org/some/url",
        "http_user_agent"=>"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.79 Safari/537.1"
    },
    "@timestamp"=>"2012-08-23T10:49:14+02:00"
}

我这里简单提一下,这个模块用的不是很满意,我在python下把日志打成了json字符串,我原本以为会像grok那样,在Es里面,我的这条日志是个字段的结构,而不是这个日志都在message里面….  我想大家应该明白了我的意思,这样很是不容易在kibana的搜索…

在kibana搜索,我经常上  source:xxx AND level:INFO     结果正像上面描述的那样,整条日志,都在@message里面。



大家觉得文章对你有些作用! 如果想赏钱,可以用微信扫描下面的二维码,感谢!
另外再次标注博客原地址  xiaorui.cc

1 Response

  1. 2016年10月9日 / 下午6:31

    亲 看下这个http://kibana.logstash.es/content/logstash/plugins/filter/json.html可以直接存的,使用logstash的json模块 就可以不再message中了

发表评论

邮箱地址不会被公开。 必填项已用*标注