这次公司有个项目是关于接口调用统计,我们公司目前用的都是比较传统的模式,没有分布式服务没有分布式数据。但如果把接口调用日志存到表里面,一天的数据量达到千万级,如果算一个月的数据,更是夸张。上网查了一下,看到ELK这个工具,就着手用了起来,下面是我使用中的笔记。
ELK是elasticsearch、logstash、kibana的缩写,有点像MVC模式。在官网http://www.elastic.co/downloads/elasticsearch可以下载,我会部下的6.3版本的,目录如下
,kibana和head都是用于展示数据的。
1、安装logstash(重点,这边需要配置数据源在哪)
同样从官网http://www.elastic.co/downloads/logstash下载logstash,下载后解压,在bin目录下新建logstash-simple.conf文件,添加
input { file {
path => "D:/elk01/testlog/test1/*.*" #文件存方目录
start_position => "beginning"
codec => plain { charset => "UTF-8" }
} }
filter{
#定义数据的格式
grok { match => { "message" => "%{DATA:timestamp}\|%{DATA:username}\|%{IP:clientIp}\|%{DATA:ipname}\|%{DATA:actionName}\|%{DATA:detail}\|\|"} }
#定义时间戳的格式
date { match => [ "timestamp", "yyyy-MM-dd HH:mm:ss" ] target=>"@timestamp" } }
output {
if [timestamp] =~ /^\d{4}-\d{2}-\d{2}/ {
elasticsearch {
hosts => "localhost:9200" #elasticsearch启动后访问地址
index => "log4j-%{+YYYY-MM-dd}" #索引
document_type => "log4j_type"
codec => plain{ charset => "GBK" }
} }
#stdout { codec => rubydebug } }
input 是直接到我log4j所存放的地方拿的日志。logstash一行算做一条数据。
后来因实际情况,拿文件不稳定,不够快,直接用程序把log4j日志推给logstash
input的配置如下
input {
tcp {
host => "127.0.0.1"
port => 4560
codec => plain{ charset => "GBK" }
}
}
java程序如下:
java项目目录,因数是log4j日志需要log4j-api-2.11.0.jar、log4j-core-2.11.0.jar这两个jar包
log4j2.xml:
<?xml version="1.0" encoding="UTF-8"?> <configuration status="error"> <!-- 先定义所有的appender --> <appenders> <!-- 这个输出控制台的配置 --> <Console name="Console" target="SYSTEM_OUT"> <!-- 控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) --> <ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/> <!-- 这个都知道是输出日志的格式 --> <PatternLayout pattern="%d{yyyy.MM.dd HH:mm:ss}|%msg%xEx%n"/> </Console> <!-- 文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,这个也挺有用的,适合临时测试用 --> <!-- append为TRUE表示消息增加到指定文件中,false表示消息覆盖指定的文件内容,默认值是true --> <File name="log" fileName="log/test.log" append="false"> <PatternLayout pattern="%d{yyyy.MM.dd HH:mm:ss}|%msg%xEx%n"/> </File> <!-- 添加过滤器ThresholdFilter,可以有选择的输出某个级别以上的类别 onMatch="ACCEPT" onMismatch="DENY"意思是匹配就接受,否则直接拒绝 --> <File name="ERROR" fileName="logs/error.log"> <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/> <PatternLayout pattern="%d{yyyy.MM.dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/> </File> <!-- 这个会打印出所有的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档 --> <RollingFile name="RollingFile" fileName="logs/web.log" filePattern="logs/$${date:yyyy-MM}/web-%d{MM-dd-yyyy}-%i.log.gz"> <PatternLayout pattern="%d{yyyy-MM-dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/> <SizeBasedTriggeringPolicy size="2MB"/> </RollingFile> <Socket name="Logstash" host="127.0.0.1" port="4560" protocol="TCP"> <PatternLayout pattern="%d{yyyy-MM-dd}|%msg%xEx%n"/> </Socket> </appenders> <!-- 然后定义logger,只有定义了logger并引入的appender,appender才会生效 --> <loggers> <!-- 建立一个默认的root的logger --> <root level="trace"> <appender-ref ref="RollingFile"/> <appender-ref ref="Console"/> <appender-ref ref="ERROR" /> <appender-ref ref="log"/> <appender-ref ref="Logstash"/> </root> </loggers> </configuration>
Test.java:
package com.etc; import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.LogManager; public class Test { static Logger logger = LogManager.getLogger(Test.class.getName()); public static boolean hello(){ logger.info("admin|127.131.73.100|数字化门诊|queryChildInfo(ID)|mabcage1111111admin||"); logger.info("admin|110.131.73.100|app户端|queryChildInfo(ID)|message2222222admin||"); logger.info("user|110.131.73.100|app户端|queryChildInfo(ID)|messageuser1111111111||"); logger.info("user|168.131.73.100|自助一体机|queryChildInfo(ID)|messageuser2222222222||"); return false; } public static void main(String[] args) { logger.trace("开始主程序"); for(int i = 0; i < 150; i++){ logger.info("当前i:"+i); if(!Test.hello()){ logger.error("hello"); } } logger.trace("退出程序"); } }
2、安装Elasticsearch
直接从官网下载http://www.elastic.co/downloads/elasticsearch,文件解压,运行所有bin目录下的elasticsearch.bat,启动成功后,浏览输入localhost:9200,可以查看json格式的信息,表示启动成功。
3、安装Kibana
从官网http://www.elastic.co/downloads/kibana下载kibana,下载后解压,修改config/kibana.yml ,添加
elasticsearch.url: "http://localhost:9200"
简单分析一下进入bin目录并运行kibana.bat。
浏览器输入http://localhost:5601可发现kibana启动成功。