当前位置: 首页 > news >正文

fluentd tail mysql_使用fluentd实现实时收集日志文件

17270ce95af85a4a2d33846cd5831d99.png

目前线上服务使用了k8s进行部署,一个服务配置了多个副本,然后日志是挂载到宿主机器的目录的,所以当服务部署到三台机器时,这时要查看业务日志,就必须依次登录三台服务器来看日志。显然,这非常地不方便。团队想把日志收集到一个地方统一查看。于是开始尝试各种方案。

尝试

1. elasticsearch + fluentd + in_tail(input) + fluent-plugin-elasticsearch(output) + kibana

刚开始就测试使用网络上推荐的日志收集方案,elasticsearch + fluentd + kibana,部署完成后,经过使用,并不能很方便地对日志进行检索,因为日志格式非常多,不方便对日志进行格式化,所以收集过来的日志并不是结构化的。另一个原因是elasticsearch占用的CPU很高,这个不知道什么原因,可能给的资源不够或配置不当。不过更主要是团队成员希望最好是直接把日志收集到一台服务器,然后能够使用linux的工具,如grep,awk,less来查询日志,所以最终放弃此方案。

2. rsyslog + fluentd + in_tail(input) + fluent-plugin-remote_syslog(output)

然后开始尝试使用fluentd来收集日志并发送到rsyslog, rsyslog使用fluentd发送过来的tag来命令文件名,但由于syslog协议的限制,tag最大为32个字符,最终无奈放弃此方案。

3. fluentd-agent(input: in_tail, output: forward) fluentd-server(input: forward, ouput: fluent-plugin-forest)

最后采用agent和server端都使用fluentd,agent端的input使用in_tail,ouput使用forward,server端的input使用forward,ouput使用fluent-plugin-forest,找到fluent-plugin-forest这个插件不容易,因为它支持以tag命名文件名,并非常稳定,其它的插件由于不怎么更新了,bug挺多无法使用。

部署

server端

docker run -d -p 24224:24224 -p 24224:24224/udp -v /var/log/worker:/var/log/worker -v /etc/localtime:/etc/localtime --name fluent-server registry.cn-hangzhou.aliyuncs.com/shengjing/fluent-server

agent端

在每个agent新建一个/home/fluent目录,并设置权限为777

mkdir -p /home/fluent

chmod 777 /home/fluent

这里我们使用k8s的damonset来部署

kubectl create -f fluentd-daemonset.yaml

fluentd-daemonset.yaml:

apiVersion: extensions/v1beta1

kind: DaemonSet

metadata:

name: fluentd

namespace: kube-system

labels:

k8s-app: fluentd-logging

version: v1

kubernetes.io/cluster-service: "true"

spec:

template:

metadata:

labels:

k8s-app: fluentd-logging

version: v1

kubernetes.io/cluster-service: "true"

spec:

containers:

- name: fluentd

image: registry.cn-hangzhou.aliyuncs.com/shengjing/fluent-client

imagePullPolicy: Always

env:

- name: RSYSLOG_HOST

value: "10.29.112.24"

resources:

limits:

memory: 500Mi

requests:

cpu: 100m

memory: 500Mi

volumeMounts:

- name: datlog

mountPath: /dat/log

readOnly: true

- name: fluent

mountPath: /home/fluent

- name: localtime

mountPath: /etc/localtime

readOnly: true

terminationGracePeriodSeconds: 30

volumes:

- name: datlog

hostPath:

path: /dat/log

- name: fluent

hostPath:

path: /home/fluent

- name: localtime

hostPath:

path: /etc/localtime

其中192.168.93.201为fluentd server的ip

Dockerfile

server端

Dockerfile:

FROM fluent/fluentd:v0.12-debian

COPY entrypoint.sh /bin/entrypoint.sh

RUN fluent-gem install fluent-plugin-forest \

&& chmod +x /bin/entrypoint.sh

COPY fluent.conf /fluentd/etc/

entrypoint.sh:

#!/usr/bin/dumb-init /bin/sh

uid=${FLUENT_UID:-1000}

# check if a old fluent user exists and delete it

cat /etc/passwd | grep fluent

if [ $? -eq 0 ]; then

deluser fluent

fi

# (re)add the fluent user with $FLUENT_UID

useradd -u ${uid} -o -c "" -m fluent

export HOME=/home/fluent

# chown home and data folder

chown -R fluent /home/fluent

chown -R fluent /fluentd

gosu fluent "$@"

fluent.conf:

@type forward

port 24224

bind 0.0.0.0

@type forest

subtype file

time_slice_format %Y%m%d

path /var/log/worker/${tag_parts[3..-2]}

format single_value

flush_interval 2s

buffer_path /tmp/buffer/${tag_parts[3..-2]}

append true

num_threads 1

agent端

Dockerfile:

FROM fluent/fluentd:v0.12-debian

COPY entrypoint.sh /bin/entrypoint.sh

RUN chmod +x /bin/entrypoint.sh

COPY fluent.conf /fluentd/etc/

entrypoint.sh:

#!/usr/bin/dumb-init /bin/sh

uid=${FLUENT_UID:-1000}

# check if a old fluent user exists and delete it

cat /etc/passwd | grep fluent

if [ $? -eq 0 ]; then

deluser fluent

fi

# (re)add the fluent user with $FLUENT_UID

useradd -u ${uid} -o -c "" -m fluent

export HOME=/home/fluent

# chown home and data folder

chown -R fluent /home/fluent

chown -R fluent /fluentd

# replace FLUENTD_SERVER_HOST

sed -i "s/FLUENTD_SERVER_HOST/$FLUENTD_SERVER_HOST/" /fluentd/etc/fluent.conf

gosu fluent "$@"

fluent.conf:

@type tail

path /dat/log/**/*.log

tag log.*

format none

refresh_interval 5

read_from_head true

limit_recently_modified 86400

pos_file /home/fluent/dat-log.pos

@type forward

name myserver1

host FLUENTD_SERVER_HOST

port 24224

weight 60

buffer_type file

buffer_path /tmp/buffer_file

flush_interval 2s

buffer_chunk_limit 8m

buffer_queue_limit 1000

num_threads 4

参考

https://github.com/tagomoris/fluent-plugin-forest

http://docs.fluentd.org/v0.12/articles/in_tail

http://docs.fluentd.org/v0.12/articles/out_forward

http://docs.fluentd.org/v0.12/articles/in_forward

http://docs.fluentd.org/v0.12/articles/out_file

相关文章:

  • jsp预加载转圈_页面预加载loading动画
  • myeclipse mysql 驱动_Myeclipse 中添加mysql的jdbc驱动
  • mysql install db的作用_mysql通过mysql_install_db初始化数据目录时使用--user选项的作用是什么?...
  • mysql 5.6 my.cnf配置_my.cnf 5.6/5.7/8.0通用配置
  • oracle非常量不能用于privot_oracle pivot 和 unpivot 函数的使用
  • python代码60行_60行Python代码,实现多线程PDF转Word
  • python加载文件夹模块bus error_python通过import导入带“-”文件名称的模块
  • python 调试工具 知乎_超强一代JupyterLab 3.0发布,兼具可视化调试、中文显示、简单交互界面等功能...
  • python的迭代器是什么_python什么是迭代器
  • vs mysql 开发_vs mysql api
  • vue状态管理存取数据_Vue 状态管理 · Vue.js教程
  • centos mysql salve_Centos7 Mysql主从双机热备的实战记录
  • mysql社区版审计插件_技术分享 | MySQL 使用 MariaDB 审计插件
  • python isinstance 函数_python isinstance函数
  • python数据框拼接_在Python中如何合并两个数据框
  • Apache的基本使用
  • Bytom交易说明(账户管理模式)
  • ES学习笔记(12)--Symbol
  • input实现文字超出省略号功能
  • Java IO学习笔记一
  • JavaScript 基础知识 - 入门篇(一)
  • Java程序员幽默爆笑锦集
  • k8s 面向应用开发者的基础命令
  • KMP算法及优化
  • Mithril.js 入门介绍
  • Objective-C 中关联引用的概念
  • Otto开发初探——微服务依赖管理新利器
  • Zsh 开发指南(第十四篇 文件读写)
  • 后端_ThinkPHP5
  • 机器学习学习笔记一
  • 精彩代码 vue.js
  • 入口文件开始,分析Vue源码实现
  • 使用Swoole加速Laravel(正式环境中)
  • 赢得Docker挑战最佳实践
  • 走向全栈之MongoDB的使用
  • 【云吞铺子】性能抖动剖析(二)
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • ​Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
  • ​如何在iOS手机上查看应用日志
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • #git 撤消对文件的更改
  • #免费 苹果M系芯片Macbook电脑MacOS使用Bash脚本写入(读写)NTFS硬盘教程
  • #微信小程序:微信小程序常见的配置传旨
  • (1)(1.19) TeraRanger One/EVO测距仪
  • (iPhone/iPad开发)在UIWebView中自定义菜单栏
  • (读书笔记)Javascript高级程序设计---ECMAScript基础
  • (二)JAVA使用POI操作excel
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (转)memcache、redis缓存
  • (转)一些感悟
  • .gitignore文件—git忽略文件
  • .net 7 上传文件踩坑
  • .net 发送邮件
  • .NET导入Excel数据
  • .NET关于 跳过SSL中遇到的问题