最近公司想要统一管理各个项目的日志,也为以后日志可视化查询做一个铺垫。经过筛选,选择了fluentd来做日志的收集转发工作,预想利用EFK来做日志收集、查询、可视化的方案。 啥?你问我为啥不用Logstash,可参考文章Fluentd vs. Logstash: A Comparison of Log Collectors ,两者差异并不大,Fluentd所占内存较小、社区更活跃。
官网简介: Fluentd是一个用于统一日志层的开源数据收集器。Fluentd允许您统一数据收集和使用,以便更好地使用和理解数据。Fluentd是云端原生计算基金会(CNCF)的成员项目之一,遵循 Apache 2 License协议
这我们应用中,Fluentd负责从游戏服务器收集日志信息,将数据流交给后续数据存盘、查询工具。换句话说,Fluentd不负责生产数据、不负责存储数据,只是数据的搬运工。
注:fluentd-benchmark 对简单数据2014-02-20 17:20:55 +0900 [info]: plugin:out_flowcounter_simple count:500 indicator:num unit:second测压结果是157148次/s
Fluentd解决数据流流向混乱的问题,通过在两者之间提供统一的日志记录层,从后端系统中分离数据源。
人气情况:
fluentd安装、启动可参考Fluent doc
<source>
@type tcp
tag tcp.events # required
<parse>
@type regexp
expression /^(?<field1>\d+):(?<field2>\w+)$/
</parse>
port 5170 # optional. 5170 by default
bind 0.0.0.0 # optional. 0.0.0.0 by default
delimiter \n # optional. \n (newline) by default
</source>
Example input:
$ echo '123456:awesome' | netcat 0.0.0.0 5170
Parsed result like below:
{"field1":"123456","field2":"awesome}
## built-in TCP input
## @see http://docs.fluentd.org/articles/in_forward
<source>
@type forward
@id input_forward
<security>
self_hostname input.local
shared_key liang_handsome
</security>
</source>
<filter example.*.*>
@type grep
regexp1 levelStr (INFO|WARN|ERROR)
</filter>
# Match events tagged with "myapp.access" and
# store them to /var/log/fluent/access.%Y-%m-%d
# Of course, you can control how you partition your data
# with the time_slice_format option.
<match example.*.*>
@type file
path E:\software\fluentd\td-agent\log\output_file
</match>
fluentd更多配置请参考官网:https://docs.fluentd.org/v1.0/articles/config-file
import {configure, getLogger, shutdown} from 'log4js'
const fluentAppender = configure({
appenders: {
"fluent": {
"type": "log4js-fluent-appender",
"tag_prefix": "example.your_keys",
"options": {
"levelTag": true,
"host": "localhost",
"port": 24224,
"timeout": 3.0,
"reconnectInterval": 600000,
"security": {
"clientHostname": "client",
"sharedKey": "liang_handsome"
}
}
}
},
categories: {
default: {
appenders: ['fluent'],
level: 'info'
}
}
});
如上配置,fluent-logger根据host、port连接fluentd,sharedKey作为连接认证
logger.info({log_type: "create-room", uuid: 1112, room_id: 234, config: {cards: 16, chairs: 3}});
fluentd输出为:2018-10-18T10:50:38+08:00 example.your_keys.INFO {"timestamp":1539831038583.0,"category":"default","levelInt":20000,"levelStr":"INFO","context":{},"data":"log { log_type: 'create-room', uuid: 1112, room_id: 234 }"}
以上测试表明fluentd-logger在与fluentd丢失连接时,相关log暂先会缓存起来,并在重连时将缓存的log发送至fluentd。这个机制相当优秀,大大增加了安全性,不过要注意缓存是占用内存的,如果长时间连接不上fluentd,有内存耗尽的风险。
可参考文档:基于Elasticsearch+Fluentd+Kibana的日志收集分析系统搭建与应用
fluentd收集数据,可输出到hadoop中,利用数据做数据挖掘,可以实现很多有价值的目标。比如:
Fluent
fluentd-benchmark
Fluent doc
基于Elasticsearch+Fluentd+Kibana的日志收集分析系统搭建与应用
Fluentd vs. Logstash: A Comparison of Log Collectors
个人主页:http://liangiter.top
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删