目的:简化查询日志方式
参考:
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 访问:
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
本地存放位置:
来源:oschina
链接:https://my.oschina.net/u/4132381/blog/3213861