日志系统的搭建(collectd + logstash + influxdb)
来源:互联网 发布:赵公明 知乎 编辑:程序博客网 时间:2024/04/28 15:21
背景
要提供一套新的服务,正好借这个机会把所有日志都整合起来:squid,collectd等等。同时存入influxdb中,用influxdb的原因是:
- 需要的查询大多是随机查询,而它提供sql-like的查询语言,并且有一个简单的UI
- go写的。。。。(老大喜欢)
- elasticsearch没有一个好的dashboard
概述
- squid:缓存数据的代理服务器。通过缓存和复用频繁访问的页面来减小带宽和提升响应速度。
- collectd:定时收集系统性能的统计信息并提供了一个存储机制的守护进程。主要用它来收集cpu,内存,带宽的数据。
- logstash:管理事件(event)和日志(log)的工具。可以通过插件的形式收集各种日志,并通过filter和output的插件来处理和输出到合适的后端。官方是对Elasticsearch默认进行无节操的支持的。。文档里面简直不忍直视。。
- influxdb:分布式的,time series的db
- elasticsearch:它自己说是一个全文检索和分析的引擎。
- 另外对redis这种内存数据库也有了一些了解,以前只是会用,并没有深入去了解。因为对它的持久化比较感兴趣,了解过后发现主要是两点:不persist,只replicate;还有合理的数据淘汰机制。
logstash的influxdb output plugin
用的是这个:plugin
自己在测试的时候,用这样的一个conf:
input { stdin { }}filter { grok { match => ["message", '%{NUMBER:time} %{HTTPDATE} %{NUMBER:duration} %{IP:ip} .... "%{DATA:user_agent}"'] } ruby { code => 'event["start_time"] = event["time"].to_f - event["duration"].to_f' }}output { influxdb { db => "test01" host => "localhost" port => "8086" user => "*****" password => "*****" series => "kobe" allow_time_override => true coerce_values => { "time" => "float" "start_time" => "float" "duration" => "integer" "transfer_size" => "integer" } data_points => { "time" => "%{time}" "start_time" => "%{start_time}" "duration" => "%{duration}" "ip" => "%{ip}" ... "user_agent" => "%{user_agent}" } } stdout { codec => rubydebug }}
一开始没有注意到coerce_values,所以总是time不能是string的错,又不细心。。
还有一个问题是时间格式,Unix time指从1970年1月1日0点0分0秒UTC起到现在经过了多少秒,写到influxdb里的time必须是这种格式的。在ruby里可以require ‘date’后,用DateTime.strptime(str, regx).to_time.to_f 来获取,其中str是可读的日期类型,如:”05/Feb/2015:06:26:54 +0800”, regx来做匹配,如上面这个就用”%d/%b/%Y:%H:%M:%S %z”。
可以在filter里的grok后面来用一个ruby的filter做转换就好了。不过后来决定还是把squid传过来的日志里加一项好了,不然在filter里写require还是有点奇怪的。。
collectd -> logstash -> influxdb
这种文档毫无节操的东西。。。搞起来真是头大,不过总算是做出来了。
功能:通过collectd收集cpu,memory,带宽的信息,通过logstash,存入influxdb里。下面分成两块:collectd->logstash 和 logstash->influxdb
collectd的配置以及logstash中collectd插件的配置
先看collectd的配置(/etc/collectd/collectd.conf):
Hostname "localhost"Interval 10Timeout 4ReportStats true LogLevel infoLoadPlugin interfaceLoadPlugin loadLoadPlugin cpuLoadPlugin memoryLoadPlugin network#LoadPlugin "logfile"<Plugin interface> Interface "eth0" IgnoreSelected false</Plugin>#<Plugin "logfile"># LogLevel "info"# File "/var/log/collectd.log"# Timestamp true#</Plugin><Plugin network> Server "127.0.0.1" "5999" # if no port number is mentioned, it will take the default port number (25826)</Plugin>
TODO 用默认的25826端口logstash会报listener died的错,查了一下只发现在用syslog的514端口有这个问题,大概是说1024下的端口需要root权限来打开?没有深究,以后有时间在来看
这个基本上没什么问题,唯一需要注意的是,它会把每!项!数!据!split!开!就是说比如memory就有这么多项:
{ "@version" => "1", "@timestamp" => "2015-03-03T04:13:39.501Z", "host" => "localhost", "plugin" => "memory", "collectd_type" => "memory", "type_instance" => "used", "value" => 3034607616.0}{ "@version" => "1", "@timestamp" => "2015-03-03T04:13:39.501Z", "host" => "localhost", "plugin" => "memory", "collectd_type" => "memory", "type_instance" => "buffered", "value" => 200491008.0}{ "@version" => "1", "@timestamp" => "2015-03-03T04:13:39.501Z", "host" => "localhost", "plugin" => "memory", "collectd_type" => "memory", "type_instance" => "cached", "value" => 667705344.0}{ "@version" => "1", "@timestamp" => "2015-03-03T04:13:39.501Z", "host" => "localhost", "plugin" => "memory", "collectd_type" => "memory", "type_instance" => "free", "value" => 241139712.0}
官方的解释就是。。。为了向后兼容。
logstash中的input是这样配置的:
input { collectd { host => "localhost" port => 5999 codec => json add_field => { "type" => "collectd" } }}
logstash -> influxdb
依然是influxdb的plugin,多了一些控制语句来把不同的监控数据写到不同的series里,logstash中output的配置:
if [type] == "collectd" { if [plugin] == "cpu" { influxdb { db => "test01" host => "localhost" port => "8086" user => "*****" password => "*****" series => "cpu" coerce_values => { "value" => "float" } data_points => { "plugin_instance" => "%{plugin_instance}" "collectd_type" => "%{collectd_type}" "type_instance" => "%{type_instance}" "value" => "%{value}" } } } else if [plugin] == "memory" { influxdb { db => "test01" host => "localhost" port => "8086" user => "*****" password => "*****" series => "memory" coerce_values => { "value" => "float" } data_points => { "collectd_type" => "%{collectd_type}" "type_instance" => "%{type_instance}" "value" => "%{value}" } } } else if [plugin] == "interface" { influxdb { db => "test01" host => "localhost" port => "8086" user => "*****" password => "*****" series => "interface" coerce_values => { "tx" => "float" "rx" => "float" } data_points => { "plugin_instance" => "%{plugin_instance}" "collectd_type" => "%{collectd_type}" "rx" => "%{rx}" "tx" => "%{tx}" } } }
写成这样我也快疯了。。不知道有没有更好的写法。
- 日志系统的搭建(collectd + logstash + influxdb)
- Influxdb+collectd+grafana搭建现代化监控系统
- centos7 搭建 collectd + influxdb + statsd + grafana
- influxdb + collectd
- Collectd & InfluxDb & Grafana 之一: 常用系统统计
- Grafana、collectd 和 InfluxDB 构建监控系统
- 58.应用性能监控APM之collectd+InfluxDB+Grafana系统搭建
- logstash搭建日志追踪系统
- collectd, influxdb, grafana协同作战,不一样的监控
- Grafana+InfluxDB+Collectd搭建企业级监控方案一
- Grafana+InfluxDB+Collectd搭建企业级监控方案二
- 在云服务器上搭建Collectd+InfluxDB+Grafana监控主机
- 使用 Grafana+collectd+InfluxDB 打造现代监控系统
- 使用 Grafana、collectd 和 InfluxDB 打造现代监控系统
- 使用 Grafana、collectd 和 InfluxDB 打造现代监控系统
- 使用 Grafana、collectd 和 InfluxDB 打造现代监控系统
- collectd和logstash及snmp 的整合
- 监控 Grafana + collectd + InfluxDB
- Unity3D 官方基础教程 Creating Scenes
- Debian/Ubuntu上网卡关闭是保存iptables规则,启动时加载iptables规则:
- UVALive - 4851 Restaurant 扫描
- cocos2d中的序列和Spawns
- Head First PHP&MySQL学习笔记(六)
- 日志系统的搭建(collectd + logstash + influxdb)
- JAVA 设计模式之单例模式
- C++程序设计必知:友元
- Vim使用技巧
- Cocos2d-x扣血飘字特效用完你就消失--之游戏开发
- hostapd源代码分析(一):网络接口和BSS的初始化
- POJ2386 Lake Counting 图DFS
- 高效使用你的Xcode
- cocos2dx 3.2 触摸机制