ELK之日誌來源微服務

 

ELK分析的是日誌,日誌本身是應用服務器產生的各種業務日誌及留痕日誌,方便後期進行追溯及查看分析;

 

真正開發到一定層次的人,業務就是基本中的最基本的了.....更高層次的追求就是更好的維護和兼容這些業務日誌,更重要的是操作及分析日誌的能力;

 

這就要求coder去實現完美的日誌記錄;這個日誌的好壞直接決定了後期分析日誌的可用性....

 

不扯了...

上服務日誌,springboot使用的是1.4.3,相應的pom文件如下

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.4.3.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.young</groupId>
	<artifactId>logstashservice</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>logstashservice</name>
	<description>Demo project for Spring Boot</description>

	<properties>
		<java.version>1.8</java.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>io.springfox</groupId>
			<artifactId>springfox-swagger2</artifactId>
			<version>2.2.2</version>
		</dependency>
		<dependency>
			<groupId>io.springfox</groupId>
			<artifactId>springfox-swagger-ui</artifactId>
			<version>2.2.2</version>
		</dependency>

		<!--logstash-->
		<dependency>
			<groupId>net.logstash.logback</groupId>
			<artifactId>logstash-logback-encoder</artifactId>
			<version>4.6</version>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-devtools</artifactId>
			<scope>runtime</scope>
			<optional>true</optional>
		</dependency>
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<optional>true</optional>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>

 

配置的logger日誌的配置類爲:

 

package com.young.logstashservice.config;

import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.Logger;
import net.logstash.logback.appender.LogstashTcpSocketAppender;
import net.logstash.logback.encoder.LogstashEncoder;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.net.InetSocketAddress;

/**
 * @author Young
 * @description 日誌文件配置類
 * @date 15:56 2019/11/25
 */
@Component
public class LogstashConfig {
    @Value(value ="${logstash.shipper.host}")
    private String host;
    @Value("${logstash.shipper.port}")
    private String port;
    @Value("${logstash.level}")
    private String level;

    @PostConstruct
    public void startLogstashAppener() {
        Logger logger = (Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
        LogstashTcpSocketAppender appender = new LogstashTcpSocketAppender();
        appender.setName("stash");
        appender.addDestinations(new InetSocketAddress(host,Integer.valueOf(port)));
        LogstashEncoder encoder = new LogstashEncoder();
        String serviceName = "logstashService";
        encoder.setCustomFields("{\"service\":\""+serviceName+"\"}");
        encoder.start();

        appender.setEncoder(encoder);
        appender.setContext(logger.getLoggerContext());
        appender.start();
        logger.addAppender(appender);
        logger.setLevel(Level.toLevel(level));
    }

}

配置文件就是上文提到的host,port和level,在application.properties文件中

logstash.shipper.host=192.168.241.239
logstash.shipper.port=4560
logstash.level=info

 

然後下面就是自己寫接口,輸出自己想要的日誌:

下文就是自己的簡單示例:

package com.young.logstashservice;

import io.swagger.annotations.Api;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@Api("logstash相關api")
@RestController
@RequestMapping("/logstash")
public class UserController {

    private static final Logger logger = LoggerFactory.getLogger(UserController.class);

    @RequestMapping(value = "/test/{userName}",method = RequestMethod.GET)
    public int getUserAge(@PathVariable("userName")String userName){
        int age=0;
        if (userName.equals("小紅")){
            logger.debug("我是[{}],今年[{}]歲",userName,age);
        }else {
            age=20;
            logger.error("我是[{}],今年[{}]",userName,age);
        }
        return age;
    }
}

 

發佈了165 篇原創文章 · 獲贊 40 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章