ELK+log4j笔记

    最近公司做一个项目,我所做的功能是接口访问日志明细和统计。我本想建一个表,按传统的模式进行查询和统计,但实际情况是每天的访问量达到100万级,这只是项目中的一个功能,如果真这么做,第一服务器承载不了,数据库也会崩掉。后来听同事说了一个ELK的套装工具,很适合目前的情况,就上网查各种资料就着手用了起来,下面是我使用中的笔记。

ELK是elasticsearch、logstash、kibana的缩写,有点像MVC模式。在官网http://www.elastic.co/downloads可以下载,我统一下载的6.3版本,如下:

,其中kibana和head是可视化工具。

1、安装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 } }

 在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启动成功。

 

 

 

 

 

 
 
 

 

posted @ 2018-05-03 10:48  诺宝宝  阅读(317)  评论(2编辑  收藏  举报