Kibana5使用指南
ELK由Elasticsearch、Logstash和Kibana三部分组件组成,这里新增了一个FileBeat,它是一个轻量级的日志收集处理工具(Agent),Filebeat占用资源少,适合于在各个服务器上搜集日志后传输给Logstash,官方也推荐此工具
Filebeat隶属于Beats。目前Beats包含四种工具:
- Packetbeat(搜集网络流量数据)
- Topbeat(搜集系统、进程和文件系统级别的 CPU 和内存使用情况等数据)
- Filebeat(搜集文件数据)
- Winlogbeat(搜集 Windows 事件日志数据)
测试环境ELK架构讲解
官方ELK架构图:
目前测试环境的拓扑图:
Elasticsearch基本原理
官方文档
Filebeat:
https://www.elastic.co/cn/products/beats/filebeat
https://www.elastic.co/guide/en/beats/filebeat/5.6/index.html
Logstash:
https://www.elastic.co/cn/products/logstash
https://www.elastic.co/guide/en/logstash/5.6/index.html
Elasticsearch:
https://www.elastic.co/cn/products/elasticsearch
https://www.elastic.co/guide/en/elasticsearch/reference/5.6/index.html
elasticsearch中文社区:
https://elasticsearch.cn/
Kibana使用指南
Kibana有另一个名字 elasticsearch dashboard,设计参考了 Splunk
Kibana主要功能 Discover,Visualize,Dashboard,Timelion,DevTools,Management
Elasticsearch查询语法
1
2
3
4
5
6
7{
"query": {
"term": {
"_id": "AV9orWWLv96dGKcHDVyi"
}
}
}
querystring 语法
上例中?q=后面的就是querystring语法,会在kibana中经常使用
全文检索:直接写搜索的单词。如:?q=aaaa单字段的全文检索:在搜索单词之前加上字段名和冒号。如:?q=user:jack单字段的精确检索:在搜索单词前加上双引号。如:?q=user:"jack"多个检索条件的组合:可以使用NOT、AND、OR来组合检索,必须是大写的。如:?q=user:("jack" OR "bob") AND NOT mesg:aaaa字段是否存在:_exists_:user表示要求user字段存在,_missing_:user表示user字段不存在。如:?q=_exists_:beat.name通配符:用?表示单字母,*表示任意个字母。如:?q=DevE?N,?q=DevE?N*正则:比通配符更复杂一点点。如:?q=/dub{2}o/
注:Elasticsearch正则性能不好,尽量不要使用太复杂或不使用。参考Elasticsearch正则表达式语法近似搜索:用~表示搜索单词可能有一字母写的不对。如:?q=dubao~范围搜索:对数值和时间。如:?q=@timestamp:>150928968615,?q=@timestamp:["now-1m" TO "now"]
1 | curl -XGET http://localhost:9200/192.168.1.21-account_errorlog-2017.10.29/_search?pretty=true?q='com.alibaba.dubbo.monitor.MonitorService' |
1 | curl -XGET http://localhost:9200/192.168.1.21-account_errorlog-2017.10.29/_search?pretty=true?q=beat.hostname='DevEVN-21' |
Elasticsearch其他查询语法
Elasticsearch全文搜索
日志分析
1 | #nginx日志格式 |
1 | 2017-10-24_15:42:00.408 [DubboMonitorSendTimer-thread-3] ERROR [com.alibaba.dubbo.common.logger.slf4j.Slf4jLogger] [DUBBO] Unexpected error occur at send statistic, cause: |
multiline
1
2
3
4
5
6
7
8
9
10input {
beats {
port => 5044
codec => multiline {
pattern => "^%{YEAR}[/-]%{MONTHNUM}[/-]%{MONTHDAY}[/_]%{TIME} "
negate => true
what => previous
}
}
}Log4J
需要配置 Java 应用的Log4J设置,启动一个内置的SocketAppender。修改应用的 log4j.xml 配置文件,添加如下配置段1
2
3
4
5
6<appender name="LOGSTASH" class="org.apache.log4j.net.SocketAppender">
<param name="RemoteHost" value="logstash_hostname" />
<param name="ReconnectionDelay" value="60000" />
<param name="LocationInfo" value="true" />
<param name="Threshold" value="DEBUG" />
</appender>
然后把这个新定义的 appender 对象加入到 root logger 里,可以跟其他已有 logger 共存1
2
3
4
5<root>
<level value="INFO"/>
<appender-ref ref="OTHERPLACE"/>
<appender-ref ref="LOGSTASH"/>
</root>
log4j.properties 配置文件1
2
3
4
5
6
7
8log4j.rootLogger=DEBUG, logstash
###SocketAppender###
log4j.appender.logstash=org.apache.log4j.net.SocketAppender
log4j.appender.logstash.Port=4560
log4j.appender.logstash.RemoteHost=logstash_hostname
log4j.appender.logstash.ReconnectionDelay=60000
log4j.appender.logstash.LocationInfo=true
Log4J 会持续尝试连接你配置的 logstash_hostname 这个地址,建立连接后,即开始发送日志数据
Logstash,Java 应用端的配置完成以后,开始设置 Logstash 的接收端,配置如下所示,其中 4560 端口是 Log4J SocketAppender 的默认对端端口1
2
3
4
5
6input {
log4j {
type => "log4j-json"
port => 4560
}
}
- JSON Event layout
如果无法采用 socketappender ,必须使用文件方式的,其实 Log4J 有一个 layout 特性,用来控制日志输出的格式。和 Nginx 日志自己拼接 JSON 输出类似,也可以通过 layout 功能,记录成 JSON 格式。
参考:https://github.com/logstash/log4j-jsonevent-layout
logstash官方提供的扩展包,可以通过mvnrepository.com搜索下载
http://central.maven.org/maven2/net/logstash/log4j/jsonevent-layout/1.7/jsonevent-layout-1.7.jar
或者直接编辑自己项目的pom.xml添加依赖1
2
3
4
5<dependency>
<groupId>net.logstash.log4j</groupId>
<artifactId>jsonevent-layout</artifactId>
<version>1.7</version>
</dependency>
然后修改项目的log4j.properties文件1
2
3
4
5
6log4j.rootCategory=WARN,RollingLog
log4j.appender.RollingLog=org.apache.log4j.DailyRollingFileAppender
log4j.appender.RollingLog.Threshold=TRACE
log4j.appender.RollingLog.File=api.log
log4j.appender.RollingLog.DatePattern=.yyyy-MM-dd
log4j.appender.RollingLog.layout=net.logstash.log4j.JSONEventLayoutV1
如果是log4j.xml文件1
2
3
4<appender name="Console" class="org.apace.log4j.ConsoleAppender">
<param name="Threshould" value="TRACE" />
<layout class="net.logstash.log4j.JSONEventLayoutV1" />
</appender>
生成的文件就是Logstash标准的JSON格式,logstash使用下面配置读取1
2
3
4
5
6input {
file {
codec => json
path => ["/path/to/log4j.log"]
}
}
生成的Logstash事件如下1
2
3
4
5
6
7
8
9
10
11
12
13
14{
"mdc": {},
"line_number": "29",
"class":"org.eclipse,jetty.examples.logging.EchoFormServlet",
"@version":1,
"source_host":"jvstratusmbp.local",
"thread_name":"qtp513694835-14",
"message":"Got request from 0:0:0:0:0:0:0:1%0 using Mozilla\/5.0 (Macintosh;Inter Mac OS X 10_9_1) AppleWebit\/537.36 (KHTML, like Gecko) Chrome \/32.0.1700.77 Safari\/537.36",
"@timestamp":"2014-01-27T19:52:35.738z",
"level":"INFO",
"file":"EchoFormServlet.java",
"method":"doPost",
"logger_name":"org.eclipse.jetty.example.logging.EchoFormServlet"
}
如果使用的不是Log4J而是logback项目来记录JAVA日志,Logstash官方也有类似的扩展包,修改pom.xml1
2
3
4
5<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>4.4</version>
</dependency>
本作品采用知识共享署名 2.5 中国大陆许可协议进行许可,欢迎转载,但转载请注明来自Jack Wang Blog,并保持转载后文章内容的完整。本人保留所有版权相关权利。
本文出自”Jack Wang Blog”:http://www.yfshare.vip/2017/10/30/Kibana5%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97/