在Mac OS X上通过ELK堆栈进行构建并使用JAVA将日志输出到Elasticsearch(log4j2)
各位,好久不见了。
构建ELK堆栈
事先准备
为了安装ELK,您需要安装Homebrew和JAVA JDK。如果您尚未安装,请先安装。
家庭酿制
在我的工作路径下
$ mkdir homebrew && curl -L https://github.com/Homebrew/brew/tarball/master | tar xz --strip 1 -C homebrew
Java软件开发工具包
请参考Oracle的Java SE下载页面。
为了保险起见,我选择了JDK 8版本。
梅花鹿
ELK是什么?
ELK Stack是指Elasticsearch公司的三个产品的综合,它们是Elasticsearch(分析)、Logstash(收集)和Kibana(可视化)。
(在实际运行时,使用LEK的流程执行。)
弹性搜索
Elasticsearch 是 Elastic 公司开发的开源全文搜索引擎,可以快速从大量的文档中提取包含目标词汇的文档。
Elasticsearch 不是关系数据库,所以不能使用 SQL 语句。而是使用 RESTful 接口进行操作。
这次我们将使用Elasticsearch 6.2.4。
安装
$ brew install elasticsearch
设定主机
首先,找到elasticsearch.yml文件。
$ brew info elasticssearch
我认为会出现此类信息。
...(Blah Blah Blah)...
Data: /usr/local/var/lib/elasticsearch/elasticsearch_JP23417/
Logs: /usr/local/var/log/elasticsearch/elasticsearch_JP23417.log
Plugins: /usr/local/var/elasticsearch/plugins/
Config: /usr/local/etc/elasticsearch/
...(Blah Blah Blah)...
elasticsearch.yml文件位于config路径下。请打开该文件,并将network.host的值更改为实际使用的IP地址。由于我们在本地环境中构建,因此已将该设置取消注释。
network.host: localhost
确认运动
使用 `brew services elasticsearch start` 命令来启动 Elasticsearch。
Elasticsearch 默认在端口号 9200 上运行,访问 http://localhost:9200,您将看到如下信息显示。
{
"name" : "ry1EXQC",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "ZMYVLV-eR-G5hBrQ6QmSGA",
"version" : {
"number" : "6.2.4",
"build_hash" : "ccec39f",
"build_date" : "2018-04-12T20:37:28.497551Z",
"build_snapshot" : false,
"lucene_version" : "7.2.1",
"minimum_wire_compatibility_version" : "5.6.0",
"minimum_index_compatibility_version" : "5.0.0"
},
"tagline" : "You Know, for Search"
}
日志鱼
Logstash是一个开源的服务器端数据处理管道。它可以同时从大量的来源中导入数据并进行转换,然后发送到您喜欢的存储库(Stash)。当然,我们推荐的是Elasticsearch作为存储库。
本次将使用Logstash 6.2.4版本。
安装和启动
$ brew install logstash
$ brew services start logstash
实际上,Logstash会根据配置文件进行操作。您需要为每个场景配置不同的配置文件。这样,Kibana应该能够正常运行,详细信息稍后会进行解释。
Kibana坐落
Kibana是一个能够方便地将Elasticsearch数据可视化的工具。
本次使用的是Kibana 6.2.4版本。
安装
$ brew install kibana
设置Port和Elasticsearch。
首先,找到 kibana.yml 文件。
$ brew info kibana
我认为会出现这样的信息。
...(Blah Blah Blah)...
Config: /usr/local/etc/kibana/
...(Blah Blah Blah)...
kibana.yml在配置文件夹的指定路径下。
请打开它并将server.port和elasticsearch.url更改为实际使用的值。这里我们按照默认设置进行了这些配置。
...(Blah Blah Blah)...
server.port: 5601
...(Blah Blah Blah)...
elasticsearch.url: "http://localhost:9200”
...(Blah Blah Blah)...
确认

使用JAVA进行日志输出(log4j2)。
我們將使用TCP來創建一個將日誌發送到Elasticsearch的工具。
创建一个Maven项目

Maven库的布置
所以说就是指pom.xml文件的内容对吧。
请在dependencies标签中添加以下内容。
<dependencies>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.8.2</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.8.2</version>
</dependency>
</dependencies>
Log4j2的配置
换句话说,这是指log4j2.xml文件的内容。Log4j2将根据这个文件确定日志的发送目的地。
本次发送当然是通过Logstash发送到Elasticsearch,但考虑到方便调试,我们也决定同时在Console上输出日志。
<configuration status="OFF">
<appenders>
<Socket name="Logstash" host="localhost" port="9601" protocol="TCP">
<PatternLayout pattern="%d|%t|%p|%c|%L|%m%n" />
</Socket>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d|%t|%p|%c|%L|%m%n" />
</Console>
</appenders>
<loggers>
<root level="all">
<AppenderRef ref="Logstash"/>
<appender-ref ref="Console"/>
</root>
</loggers>
</configuration>
如果您想个性化,请参考此页面。
主要的类
这是输出日志的行为。
package log4j2.local;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.ThreadContext;
public class Main {
private static Logger logger = LogManager.getLogger("test");
public static void main(String[] args) {
logger.error("エラーメッセージです");
}
}
当执行这个操作时,控制台会显示出这样的日志。(由于尚未连接Logstash,所以当然也不会保存到Elasticsearch中。)
2018-09-12 12:55:13,962|main|ERROR|test|13|エラーメッセージです
将Logstash部署
Logstash配置方案
在喜欢的路径下没问题,我们来创建一个logstash-tcp.conf文件。(仅仅是因为它是TCP通信,所以取了这个名字。)
Logstash默认情况下可以使用9600至9700之间的所有端口,所以这次我们将使用9601号端口。(请务必与log4j2.xml中的标签使用相同的端口。)
input {
tcp {
host => "localhost"
port => "9601"
mode => "server"
type => "eslocallogger"
}
}
filter {
mutate{
split => ["message","|"]
add_field => {
"Datetime" => "%{[message][0]}"
}
add_field => {
"Classname" => "%{[message][1]}"
}
add_field => {
"Level" => "%{[message][2]}"
}
add_field => {
"Logger" => "%{[message][3]}"
}
add_field => {
"Message" => "%{[message][5]}"
}
}
}
output {
stdout {
codec => rubydebug
}
elasticsearch {
hosts => "localhost:9200"
}
}
在这里,我们使用过滤器来分隔模式,但是即使不使用过滤器,默认的列也会自动解析。
(在这里,我们用 | 来分隔进入 Logstash 的错误消息。)
将Logstash与配置文件连接并重新启动。
$ brew services stop logstash
$ logstash -f ./logstash-tcp.conf --experimental-java-execution
如果有–experimental-java-execution选项,它将在JAVA引擎上运行。请参阅《了解新的Logstash Java执行引擎》以获取更多详细信息。我记得这样做会显著提高吞吐量。
我们来试一试
控制台
2018-09-12 18:05:39,737|main|ERROR|test|13|エラーメッセージです
Logstash控制台
[2018-09-12T18:05:40,464][DEBUG][logstash.pipeline ] Pushing flush onto pipeline {:pipeline_id=>"main", :thread=>"#<Thread:0x5caa3237 sleep>"}
{
"Level" => "ERROR",
"@timestamp" => 2018-09-12T09:05:39.847Z,
"Logger" => "test",
"port" => 60614,
"message" => [
[0] "2018-09-12 18:05:39,737",
[1] "main",
[2] "ERROR",
[3] "test",
[4] "13",
[5] "エラーメッセージです"
],
"type" => "eslocallogger",
"Message" => "エラーメッセージです",
"Datetime" => "2018-09-12 18:05:39,737",
"host" => "localhost",
"@version" => "1",
"Classname" => "main"
}
基本说起来,Kibana。

请参考来源。
在Mac OS X上安装ELK Stack
ElasticSearch+Logstash+Kibana+log4j2 的官方6.1.1版本安装配置简介
使用LogStash的Filter功能
使用Elastic Stack