ELK+log4j

这次公司有个项目是关于接口调用统计,我们公司目前用的都是比较传统的模式,没有分布式服务没有分布式数据。但如果把接口调用日志存到表里面,一天的数据量达到千万级,如果算一个月的数据,更是夸张。上网查了一下,看到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、filter、output
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启动成功。

 
 
 

 

猜你喜欢

转载自www.cnblogs.com/wuxiaojuan/p/8984246.html