最近公司做一个项目,我所做的功能是接口访问日志明细和统计。我本想建一个表,按传统的模式进行查询和统计,但实际情况是每天的访问量达到100万级,这只是项目中的一个功能,如果真这么做,第一服务器承载不了,数据库也会崩掉。后来听同事说了一个ELK的套装工具,很适合目前的情况,就上网查各种资料就着手用了起来,下面是我使用中的笔记。
ELK是elasticsearch、logstash、kibana的缩写,有点像MVC模式。在官网http://www.elastic.co/downloads可以下载,我统一下载的6.3版本,如下:
,其中kibana和head是可视化工具。
1、安装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 } }
在bin目录执行命令:logstash -f logstash.conf (执行命令的捷径方法:以前都是通过cmd一层一层的进去,可以把文件打开到bin目录下按shift右击选择 在此处打开命令窗口)
经过多次运行后,后来报you must change the "path.data" setting 异常,需要换path.data。换path.data的命令是:logstash -f logstash.conf --path.data=/elkdata/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
解压,运行bin目录下的elasticsearch.bat,启动成功后,浏览器输入localhost:9200,可以查看json格式的信息,表示启动成功。
3、安装Kibana
解压,修改config/kibana.yml ,添加
elasticsearch.url: "http://localhost:9200"
进入bin目录双击运行kibana.bat。
浏览器输入http://localhost:5601可发现kibana启动成功。