最近由于的公司业务系统出现问题,而排查问题只能从生产服务器拷贝日志到测试机,然后我们再去测试机上查看生成服务器的日志,排查问题,有时
由于日志的量太大,生产环境报错了,常常等拷贝完成就要十几分钟,到查到问题就要半小时以上,还好这段时间没有什么人用,要不然早就有人投诉了,所
以就想升级一下日志系统。
于是先调研了ELK,并且是用logback传输json的数据到logstash, 再给elasticsearch处理后,最后统计好交给kibana展示。具体架构图如
ELK的下载地址 https://www.elastic.co/downloads
默认本机装好java的环境,查看java的版本,
下载好了三个安装包,本次安装的ELK的版本都是是6.0.0版本,
首先,在 logstash-6.0.0 的目录下,新建一个文件名为 logstash.conf,然后写入以下配置:
input { tcp { host => "localhost" port => 4560 mode => "server" tags => ["tags"] codec => json_lines } } output { elasticsearch { hosts => "localhost:9200" index => "%{[appname]}" user => "elastic" password => "@hvL9ni2Eu8^ohv0^gTD" } stdout{ codec=>rubydebug } }
然后用命令:
logstash -f logstash.conf
启动 logstash, 启动截图如下:
接下来进入elasticsearch目录,安装安全控制的插件x-pack,通过命令:
bin/elasticsearch-plugin install x-pack
安装完后,输入以下命令:
bin/x-pack/setup-passwords auto
会出现如下截图:
这样生成了三个用户的随机密码,只用elastic的用户是超级用户,这里生成的elastic用户名和密码在logstash里logstash.conf配置文件中user和password,这样logstash才能将数据写入
到 elasticsearch. 这里注意一下,我之前在网上找到的都是默认用户名是elastic,密码: changeme,总是不对,最后在官网找到的命令,生成的默认的以个密码。
接下启动elasticsearch, 使用命令:
bin/elasticsearch
接下来安装kibana的x-pack,使用以下命令:
bin/kibana-plugin install x-pack
这个过程需要时间长一点。安装完后 ,用vim打开kibana的配置文件,
vim config/kibana.yml
加入以下配置:
elasticsearch.username: "kibana"
elasticsearch.password: "#qP6~Q@ow#jzWMgfy3PT"
接下启动kibana,进入kibana目录后,使用命令 bin/kibana, 启动截图如下
完成后,访问本地的 http://localhost:5601 ,进入如下图:
使用再安装elasticsearch初始化的账号和密码, 就可以登录了。这时候,我们还看不奥日志,因为我使用的 logback 以tcp方式的传送json日志到 logstash. 那么接下来
在ideal中会创建一个maven工程。本demo是基于spring boot的,首先在pom.xml中添加一下依赖。
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>net.logstash.logback</groupId> <artifactId>logstash-logback-encoder</artifactId> <version>4.11</version> </dependency> </dependencies>
然后新建的一个配置文件application.yml, 添加一个配置
logging:
config: classpath:logback.xml
再新建一个logback.xml的文件,添加以下配置
<?xml version="1.0" encoding="UTF-8"?> <configuration> <logger name="org.springframework" level="WARN"/> <logger name="org.hibernate.validator" level="INFO"/> <appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender"> <destination>127.0.0.1:4560</destination> <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder"> <customFields>{"appname":"gateway-service"}</customFields> </encoder> </appender> <!-- 彩色日志依赖的渲染类 --> <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/> <conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/> <conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/> <!-- 彩色日志格式 --> <property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/> <!-- 控制台输出 --> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>DEBUG</level> </filter> <encoder> <pattern>${CONSOLE_LOG_PATTERN}</pattern> <charset>utf8</charset> </encoder> </appender> <root level="INFO"> <appender-ref ref="STDOUT" /> <appender-ref ref="LOGSTASH" /> </root> </configuration>
然后新建一个java启动类Application。
import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class LogApplication implements CommandLineRunner{ private final static Logger logger= LoggerFactory.getLogger(LogApplication.class); public static void main(String[] args) { SpringApplication.run(LogApplication.class, args); } @Override public void run(String... arg0) throws Exception { logger.error("=========hello World========"); logger.debug("=========hello World========"); } }
然后启动该项目后,具体代码也可以直接参考这里的:https://github.com/xjz1842/spring-cloud-learning/tree/master/logback
然后再返回kibana页面,新建一个index-pattern为gateway-service, 注意:这个是在 logback.xml中配置的 <customFields>{"appname":"gateway-service"}</customFields> 而这个是个变量,要和logstash.conf的配置文件中 index => "%{[appname]}"的key对应,
这样就可以看到如下图,
如果多个系统需要搜集日志,我们只需要改变的logback的配置的文件的 <customFields>{"appname":"gateway-service"}</customFields>里面的gateway-service,改为xxx-service,
就可以将各个系统的日志分开,如下图点击你要的index-pattern,就可以看到你想要的配置。
到此,日志系统算是搭建完了,但是还要很多优化的点,比如日志要存储多久,打日志配置成异步的,等等。如果上生产了,有问题再写出来,再交流下。