
ELK stack的另外两个组件L: LogstashK: KibinaLogstash是一个开源的数据收集引擎最初就是收集各服务器上的日志信息能够在多种来源之间实时传输和处理数据它在各客户端安装agent来收集数据发送给Logstash服务器由Logstash服务器进行收集管理。Logstash的主要功能包括数据输入Input、数据过滤Filter和数据输出Output这三个部分共同构成了Logstash的核心处理流程。通过Logstash我们可以轻松实现日志的实时收集、解析、过滤和传输为后续的日志分析和监控提供有力支持。agent收集数据直接输出给Logstash服务器会给Logstash服务器带来很大的压力一般中间会增加一层agent先输出到一个消息队列然后由Logstash服务器定期取出。这个消息队列是一个broker角色即掮客/代理如使用redisLogstash服务器中又分为几个功能插件INPUT负责从broker中取出数据CODEC负责编码FILTER负责过滤最后由OUTPUT将整理好的数据输出给下一环节这里是Elasticsearch集群然后可以完成日志的全文搜索功能对日志分析处理等。Logstash安装下载安装包为匹配Elasticsearch5.6.16下载logstash-5.6.16.rpm。yum install logstash-5.6.16.rpmrpm -ql logstash查看安装的软件其运行程序在/usr/share/logstash/bin/目录下所以可以在环境变量中增加其路径/etc/profile.d/logstash.shexport PATH$PATH:/usr/share/logstash/bin/Logstash采集和处理的配置文件/etc/logstash/conf.d/simple.confinput { stdin {} } output { stdout { codec rubydebug } }定义Logstash的输入为标准输入即键盘输入输出为标准输出即屏幕输出时使用的编码为rubydebug。检测配置文件的语法正确与否logstash -f /etc/logstash/conf.d/simple.conf -t或者logstash -f /etc/logstash/conf.d/simple.conf --config.test_and_exit运行logstash -f /etc/logstash/conf.d/simple.conf标准输入键盘输入Hello Logstash标准输出屏幕上显示。Logstash是agent/server架构的系统。配置框架input { ... }filter { ... }output { ... }四种类型的插件 input, filter, codec, output数据类型Array[item1, item2,...] #数组Booleantrue, false #布尔型Bytes #字节/字符简单数据Codec #编码器Hashkey value #键值对Number #数值型Password #Path文件系统路径String字符串字段引用[]条件判断, !, , , , ~, !~in, not inand, or()Logstash的工作流程input | filter | output, 如无需对数据进行额外处理filter可省略Logstash的插件INPUT插件file从指定的文件中读取事件流使用FileWatchRuby Gem库监听文件的变化。.sincedb数据库中保存每个文件上次的读取位置记录了每个被监听的文件的inode, major number, minor nubmer, pos等。file插件的选项有SettingInput typeRequiredclose_oldernumberNodelimiterstringNodiscover_intervalnumberNoexcludearrayNoignore_oldernumberNomax_open_filesnumberNopatharrayYessincedb_pathstringNosincedb_write_intervalnumberNostart_positionstring, one of [beginning, end]Nostat_intervalnumberNo示例filedemo.conftail -n5 messages message1 #messages中记录太多截取最后5行形成message1--path.settings用于设置logstash.yml文件的路径是Logstash的本身的一个配置文件默认在/usr/share/logstash/config路径下。5.6.16版本安装后这个文件在/etc/logstash/目录下。udp通过udp协议从网络连接来读取Message其必备参数为port用于指明logstash监听的端口host则用指明logstash自己监听的地址SettingInput typeRequiredbuffer_sizenumberNohoststringNoportnumberYesqueue_sizenumberNoreceive_buffer_bytesnumberNoworkersnumberNosource_ip_fieldnamestringNo配置文件示例udpdemo.conf这个测试需要一个应用向这个Logstash发送udp数据使用collectd程序。collectd主机的性能监控程序能够收集主机的各种性能数据并可以通过一个network插件将收集到的数据发送出去正好可以实现Logstash的udp的input场景。collectd的安装在epel源中yum install collectd编辑collectd的配置文件/etc/collectd.confHostname node0#collectd所在的主机名LoadPlugin cpu#cpu性能监控模块LoadPlugin df#磁盘容量信息LoadPlugin interface#接口信息LoadPlugin load#负载信息LoadPlugin memory#内存信息LoadPlugin network#配置网络这个就是要使用的对外发送信息的功能模块配置network模块配置要发送的服务器信息IP和PORTPlugin networkserver 192.168.147.140 25826/server/Plugin启动collectd启动Logstashlogstash -f /etc/logstash/conf.d/udpdemo.conf --path.settings /etc/logstash可以看到Logstash已经收到了信息。redis从redis读取数据支持redis channel和lists两种方式filter插件用于在将event可以理解为原始数据通过output发出之前对其实现某些处理功能。grok用于分析并结构化文本数据是logstash中将非结构化日志数据转化为结构化的可查询数据的重要手段。支持像syslogapachenginx等的日志结构化处理。结构化的方法是使用模式以httpd的日志为例一条日志记录如下192.168.147.1 - - [02/Sep/2026:10:26:32 0800] GET / HTTP/1.1 403 4897 - Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:109.0) Gecko/20100101 Firefox/115.0模式可以使用%ip %user %group [%datetime] %method %url %version %status %size %referer %user_agent模式匹配后ip 192.168.147.1 、user 、 group 、datetime 02/Sep/2026:10:26:32 0800等Logstash提供了很多的模式匹配文件在/usr/share/logstash/vendor/bundle/jruby/1.9/gems/logstash-patterns-core-4.1.2/patterns/目录下语法格式%{SYNTAX:SEMANTIC}SYNTAX预定义模式名称SEMANTIC匹配到的文本的自定义标识符如grok_patterns文件中定义了各种匹配规则下面是其中的部分代码USERNAME [a-zA-Z0-9._-] USER %{USERNAME} EMAILLOCALPART [a-zA-Z][a-zA-Z0-9_.-:] EMAILADDRESS %{EMAILLOCALPART}%{HOSTNAME} INT (?:[-]?(?:[0-9])) BASE10NUM (?![0-9.-])(?[-]?(?:(?:[0-9](?:\.[0-9])?)|(?:\.[0-9]))) NUMBER (?:%{BASE10NUM}) # Syslog Dates: Month Day HH:MM:SS SYSLOGTIMESTAMP %{MONTH} %{MONTHDAY} %{TIME} PROG [\x21-\x5a\x5c\x5e-\x7e] SYSLOGPROG %{PROG:program}(?:\[%{POSINT:pid}\])? SYSLOGHOST %{IPORHOST} SYSLOGFACILITY %{NONNEGINT:facility}.%{NONNEGINT:priority} HTTPDATE %{MONTHDAY}/%{MONTH}/%{YEAR}:%{TIME} %{INT} # Log formats SYSLOGBASE %{SYSLOGTIMESTAMP:timestamp} (?:%{SYSLOGFACILITY} )?%{SYSLOGHOST:logsource} %{SYSLOGPROG}:grok的使用Logstash的配置文件中设置grokdemo.conf启动logstash -f /etc/logstash/conf.d/grokdemo.conf --path.settings /etc/logstash输入如下内容192.168.147.1 GET /index.html 200 0.23结构化输出自定义grok的模式grok的模式是基于正则表达式编写其元字符与其它用到正则表达式的工具awk/sed/grep/pcre差别不大。PATTERN_NAME (?the pattern here)grok插件有一个patterns_dir参数用于指定模式文件的位置默认的就是指向Logstash的patterns目录可以设置自己模式文件的目录其值是数组可以列出多个目录。测试使用grok结构化httpd的日志在默认的patterns目录下有httpd模式文件可以直接使用其中的COMBINEDAPACHELOG模式来结构化日志httpdemo.conf运行logstash -f /etc/logstash/conf.d/httpdemo.conf --path.settings /etc/lstashOUTPUT插件stdout标准输出插件输出到屏幕上前面测试中已经使用过简单配置一下即可。redis是一个内存数据库可以做缓存服务器也可以做消息队列服务使用这里就使用其消息队列功能。redis安装很简单epel源中有安装包执行yum install redis安装后修改其配置文件/etc/redis.conf其中的bind项默认是绑定在127.0.0.1主机上的修改为0.0.0.0然后就可以启动服务了systemctl start redis.service其监听的端口为6379。Logstash中redis作为输出插件配置如下redisdemo.confredis插件的输出配置项port支出redis的监听端口host指定redis的服务器IP地址data_type指定使用哪种类型来存储数据有list和channel两种list就是列表向一个列表中插入一项项数据channel是频道数据可以输出到不同的频道中使用的是生产者/消费者模型。key是列表的key数据作为列表的value项插入其中。执行测试此时数据应该保存到redis中了在redis中执行查询可以看到名字为logstash-apachelog的key其是一个list其中已经保存了数据。redis作为输入插件的测试配置文件redisinputdemo.conf执行logstash -f /etc/logstash/conf.d/redisinputdemo.conf --path.settings /etc/logstash因为redis中logstash-apachelog列表中已经存储了数据所以这里就从中取出数据并输出到屏幕上。elasticsearch将数据输出到Elasticsearch中配置文件如下hosts参数指定Elasticsearch集群中的一个或多个节点的访问地址index指定使用哪个索引。输入使用的是redis其中已经含有9条数据执行logstash -f /etc/logstash/conf.d/esdemo.conf --path.settings /etc/logstash执行后查看EScurl -XGET http://192.168.147.140:9200/_cat/indices显示已经有一个httpdlog-2026.09.02的索引了显示文档数据已经保存在ES中了。KibanaES数据的展示插件下载软件包kibana-5.6.16-x86_64.rpm安装yum install kibana-5.6.16-x86_64.rpm配置/etc/kibana/kibana.yml#server.port: 5601 #服务器的默认端口为5601server.host: 192.168.147.137 #服务器的监听地址elasticsearch.url: http://192.168.147.140:9200 #ES的地址指定集群中的一个节点地址即可配置完后启动systemctl start kibana.service浏览器访问在index pattern中输入httpdlog-*才能接着执行。Dev Tools模块在Console中可直接输入CRUD操作命令对Elasticsearch进行操作。其他的模块不会用。