74. 日志系统 (elk +springboot)

限于喜欢 提交于 2020-04-06 05:49:08

 

目的:简化查询日志方式

参考
1.安装jdk1.8 +

https://my.oschina.net/springMVCAndspring/blog/1601197

1. elk整合springboot
    https://www.bbsmax.com/A/Gkz11xgnzR/
    
    
2. Linux安装Elasticsearch

   https://www.dalaoyang.cn/article/78
 
 3. Linux安装Logstash
 
 https://www.dalaoyang.cn/article/80
 
 4.安装kibana
 
 https://www.dalaoyang.cn/article/79
  
 5.日志工具类
 
 https://my.oschina.net/springMVCAndspring/blog/3041550#h1_20

0.准备

下载软件上传到 centos7上

1.安装软件

1.1 安装jdk1.8+

https://my.oschina.net/springMVCAndspring/blog/1601197

 

 

1.2 Linux安装Elasticsearch

   https://www.dalaoyang.cn/article/78

1.2.1 解压

tar -zxvf elasticsearch-5.3.2.tar.gz -C ../elasticsearch

1.2.2 处理问题

1.2.2.1 问题一:内存不足

(1)现象

(2)解决方案

1.2.2.2  不允许用root启动

(1)现象:

(2)解决方案:创建 新账号

a.新增账号:useradd es

b.将文件夹elasticsearch-5.3.2赋予es权限

   chown -R es:es /usr/local/develop/elasticsearch/elasticsearch-5.3.2

c. 切换为es用户

使用es账号 启动:成功====》新打开窗口 用root 查看

使用root查看

     curl -X GET http://localhost:9200

1.2.2.3 外部无法访问

现象:

 

解决方案:修改配置文件

使用root用户,打开elasticsearch.yml文件,如下:

vi /usr/local/develop/elasticsearch/elasticsearch-5.3.2/config/elasticsearch.yml

文件内增加如下代码

network.host: 0.0.0.0

 

 

使用root用户打开如下文件:

vi /etc/sysctl.conf

添加如下配置:

vm.max_map_count = 655360

使配置生效

/sbin/sysctl -p

 

 

 

 

 

 

 

 

 

1.2.3 启动Elasticsearch成功

1.3    Linux安装Logstash

1.3.1 解压

tar -zxvf logstash-5.3.2.tar.gz -C ../logstash/

 

1.3.2  测试及上传日志解析 文件位置

测试:

bin/logstash -e 'input { stdin { } } output { stdout {} }'

 

配置 启动规则:

logstash.conf 文件内容

input{
        tcp {
                mode => "server"
                host => "0.0.0.0"
                port => 4560
                codec => json_lines
        }
}
output{
        elasticsearch{
                hosts=>["IP:9200"]
                index => "applog"
                }
        stdout{codec => rubydebug}
}

bin/logstash -f logstash.conf

 

1.4 安装 kibana

1.4.1 解压

tar -zxvf kibana-5.3.2-linux-x86_64.tar.gz -C ../kibana/

1.4.2 修改config/kibana.yml文件配置

我们可以将该该文件替换 原有的

#Elasticsearch主机地址
elasticsearch.url: "http://IP:9200" 
# 允许远程访问
server.host: "0.0.0.0" 
# Elasticsearch用户名 这里其实就是我在服务器启动Elasticsearch的用户名
elasticsearch.username: "es"  
# Elasticsearch鉴权密码 这里其实就是我在服务器启动Elasticsearch的密码
elasticsearch.password: "123456"

 

 

1.4.3 启动kibana 配置索引

1.4.3.1 启动kibana

直接启动,进入bin目录后

./kibana

后台启动,进入bin目录后

nohup ./kibana &

1.4.3.2 访问:

http://IP:5601/

 

1.4.4 配置kibana索引

 

 

1.5 elk整合 springboot

1.5.1 导入相关jar

 

<!--12.logback 日志-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <scope>runtime</scope>
</dependency>
<dependency>
    <groupId>net.logstash.logback</groupId>
    <artifactId>logstash-logback-encoder</artifactId>
    <version>5.3</version>
</dependency>

 

 

 

1.5.2  新增配置文件  logback-spring.xml(名字固定)

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <include resource="org/springframework/boot/logging/logback/base.xml" />
    <appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        <destination>IP:4560</destination>
        <!-- 日志输出编码 -->
        <encoder charset="UTF-8"
                 class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
            <providers>
                <timestamp>
                    <timeZone>UTC</timeZone>
                </timestamp>
                <pattern>
                    <pattern>
                        {
                        "logLevel": "%level",
                        "serviceName": "${springAppName:-}",
                        "pid": "${PID:-}",
                        "thread": "%thread",
                        "class": "%logger{40}",
                        "rest": "%message"
                        }
                    </pattern>
                </pattern>
            </providers>
        </encoder>
    </appender>
    <root level="INFO">
        <appender-ref ref="LOGSTASH" />
        <appender-ref ref="CONSOLE" />
    </root>
</configuration>

1.5.3 引入 日志

思想:AOP

(1) 导入spring AOP相关 jar

<!--9.aop-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

 

(2)配置mybaties日志(生成注意切换 类型)

logging.level.cn.ma.logstest.mapper=debug
logging.path=./logs

 

(3) 引入 自己编写的根据类

package cn.ma.logstest.utils;

import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import java.util.Date;
import java.util.Enumeration;
import java.util.LinkedHashMap;
import java.util.Map;

/**
 * 作用:获取用户请求
 * (1)访问时间
 * (2)访问地址URL
 * (3) 请求方式
 * (4) 请求者IP
 * (5) 返回内容RESPONSE
 * (6) 请求方法的响应时长
 * (7) 访问结束时间
 */
@Aspect
@Component
@Slf4j
public class HttpAspect {
    //切点
    @Pointcut("execution(public * cn.ma.logstest.controller.*.*(..))")
    public void webLog() {
    }

    //开始时间
    long beginTime = 0;
    //结束时间
    long endTime = 0;

    //前置通知
    @Before("webLog()")
    public void doBefore(JoinPoint joinPoint) throws Exception {
        //没抽取的原因是并发的时候会导致问题 这样安全性更高
        Date d = new Date();
        long time = d.getTime();
        beginTime = time;

        // 接收到请求,记录请求内容
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        if (attributes != null) {
            HttpServletRequest request = attributes.getRequest();
            StringBuffer sb = new StringBuffer();
            sb.append("访问时间:" + TimeUtils.getStringDate(d));
            sb.append(",");
            sb.append("访问地址URL :" + request.getRequestURL().toString());
            sb.append(",");
            sb.append("请求方式HTTP_METHOD :" + request.getMethod());
            sb.append(",");
            sb.append("访问者IP :" + request.getRemoteAddr());
            sb.append(",");
            Map<String, Object> map = new LinkedHashMap<>();
            Enumeration<String> enu = request.getParameterNames();
            while (enu.hasMoreElements()) {
                String name = enu.nextElement();
                map.put(name, request.getParameter(name));
            }
            sb.append("请求参数 :" + JSON.toJSONString(map));
            log.info("请求信息:{}", sb.toString());
        }
    }

    //后置通知
    @AfterReturning(returning = "ret", pointcut = "webLog()")
    public void doAfterReturning(Object ret) throws Throwable {


        StringBuffer sb = new StringBuffer();
        Date d = new Date();
        long time = d.getTime();
        sb.append("返回内容:" + ret);
        sb.append(",");
        sb.append("响应时长(单位毫秒):" + (time - beginTime));
        sb.append(",");
        sb.append("访问结束时间:" + TimeUtils.getStringDate(d));
        sb.append(",");
        log.info("响应信息 :{}", sb.toString());
    }

}

 

1.5.4 效果

 

2.附件

软件:

代码:

链接:https://pan.baidu.com/s/11OwaoqmxSAkttaxUKyIvvQ 
提取码:pqui

 

本地存放位置:

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!