ELK - die grundlegende Verwendung von LogStash

1. Was ist logStash

ELK(Elasticsearch+Logstash+Kibana)

Was genau ist Logstash? offizielle Beschreibung

Offizielle Textbeschreibung: Logstash ist eine serverseitige Open-Source-Datenverarbeitungspipeline, die Daten aus mehreren Quellen gleichzeitig aufnehmen, transformieren und an Ihr bevorzugtes „Repository“ senden kann.

Beliebte Erklärung: Logstash ist ein leistungsstarkes Datenverarbeitungstool, das häufig für die Protokollverarbeitung verwendet wird.

Logstash hat bisher über 200 Plugins verfügbar, zusammen mit der Flexibilität, eigene zu erstellen und beizusteuern. Die Gemeinschaftsökologie ist sehr vollständig und wir können sie mit Zuversicht nutzen.

2. Warum logStash verwenden?

Wenn das System ausfällt, müssen sich Ingenieure normalerweise bei jedem Server anmelden und Linux-Skripttools wie grep / sed / awk verwenden, um die Ursache des Ausfalls im Protokoll zu finden. Wenn kein Protokollsystem vorhanden ist, müssen Sie zuerst den Server suchen, der die Anfrage verarbeitet. Wenn mehrere Instanzen auf diesem Server bereitgestellt werden, müssen Sie zum Protokollverzeichnis jeder Anwendungsinstanz wechseln, um die Protokolldateien zu finden. Jede Anwendungsinstanz legt auch eine fortlaufende Protokollrichtlinie (z. B. jeden Tag eine Datei generieren) sowie eine Protokollkomprimierungs- und Archivierungsrichtlinie usw. fest.

Nach einer solchen Reihe von Prozessen hat es uns viel Mühe bereitet, den Fehler zu beheben und die Fehlerursache rechtzeitig zu finden. Wenn wir also diese Protokolle zentral verwalten und eine zentralisierte Abruffunktion bereitstellen können, können wir nicht nur die Effizienz der Diagnose verbessern, sondern auch ein umfassendes Verständnis der Systemsituation haben und die Passivität der Brandbekämpfung nach dem Ereignis vermeiden.

Daher kann die zentralisierte Protokollverwaltungsfunktion unter Verwendung des ELK-Technologiestapels implementiert werden. Elasticsearch verfügt nur über Datenspeicher- und Analysefunktionen, und Kibana ist eine visuelle Verwaltungsplattform. Auch die Rolle der Datensammlung und -zusammenführung fehlt, wofür Logstash zuständig ist.

3. Arbeitsprinzip von Logstash

  • Datenquelle

Es gibt viele Datenquellen, die von Logstash unterstützt werden. Beispielsweise werden für die Log-Funktion nur Logs mit Log-Records und Log-Delivery-Funktionen unterstützt In Spring Boot wird Logback standardmäßig empfohlen, um Log-Ausgabefunktionen (Ausgabe an die Datenbank, Datenausgabe in Dateien) zu unterstützen.

  • Logstash-Pipeline

Das Ganze ist das, was Logstash tut.

In Logstash sind drei sehr wichtige Funktionen enthalten:

  • Eingang

Die Eingangsquelle wird im Allgemeinen als Host und Port konfiguriert, die sie überwacht. Die Datenquelle gibt Protokolle an die angegebene IP und den angegebenen Port aus, und die Eingabequelle kann die Dateninformationen nach der Überwachung sammeln.

  • Filter

Filterfunktion, um die gesammelten Informationen zu filtern (zusätzliche Verarbeitung), Sie können diese Konfiguration auch weglassen (keine Verarbeitung)

  • Ausgang

An wen die gesammelten Informationen gesendet werden sollen. Im ELK-Technologie-Stack wird alles an Elasticsearch ausgegeben, und der anschließende Datenabruf- und Datenanalyseprozess wird an Elasticsearch übergeben.

Endeffekt: Durch die Gesamtschritte kann die ursprüngliche Zeile der Protokollinformationen in Daten in Form eines Dokuments (Schlüssel-Wert-Paar-Form) konvertiert werden, das von Elasticsearch für die Speicherung unterstützt wird .

4. Docker installiert logStash

  • Ziehen Sie das logStash-Image

Docker-Pull-Logstash: 7.7.0

  • Starten Sie den Behälter

docker run -it -p 4560:4560 --name logstash -d logstash:7.7.0

  • Die Umgebung wechseln

in den Behälter

docker exec -it logstash /bin/bash

Ändern Sie die Konfigurationsdatei

vi /usr/share/logstash/config/logstash.yml

Ändern Sie die IP-Adresse in die Elasticsearch-Zugriffsadressen-IP

  • Eingangs- und Ausgangskonfiguration ändern

Fahren Sie mit der Eingabe in der Container-Befehlszeile fort

vi /usr/share/logstash/pipeline/logstash.conf

Konfigurationserklärung:

input: Eingangskonfiguration des Empfangsprotokolls

        TCP: Protokoll

                Modus: Logstash-Dienst

                port: Port, selbst angeben. Standard 4560

Ausgabe: Ausgabe der Protokollverarbeitung

        elasticsearch: zur Bearbeitung an es übergeben

                Aktion: Indexbefehl in es. Das heißt, der neue Befehl.

                Gastgeber: Gastgeber von es

                index: Der Index des gespeicherten Protokolls. Es kann automatisch erstellt werden, wenn es nicht vorhanden ist. Der Standardtypname ist doc

  • Starten Sie den Container neu

Verlassen Sie die Container-Befehlszeile, rufen Sie das Linux-Terminal auf und starten Sie den Logstash-Container neu.

Docker startet Logstash neu

5. Verwenden Sie logback, um Protokolle in logStash auszugeben

LogStash-Abhängigkeit hinzufügen

        <!-- logstash依赖-->
        <dependency>
            <groupId>net.logstash.logback</groupId>
            <artifactId>logstash-logback-encoder</artifactId>
            <version>6.3</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

logback.xml importieren

<?xml version="1.0" encoding="UTF-8"?>
<!--该日志将日志级别不同的log信息保存到不同的文件中 -->
<configuration>
	<include resource="org/springframework/boot/logging/logback/defaults.xml" />

	<springProperty scope="context" name="springAppName"
		source="spring.application.name" />

	<!-- 日志在工程中的输出位置 -->
	<property name="LOG_FILE" value="${BUILD_FOLDER:-build}/${springAppName}" />

	<!-- 控制台的日志输出样式 -->
	<property name="CONSOLE_LOG_PATTERN"
		value="%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}" />

	<!-- 控制台输出 -->
	<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
		<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
			<level>INFO</level>
		</filter>
		<!-- 日志输出编码 -->
		<encoder>
			<pattern>${CONSOLE_LOG_PATTERN}</pattern>
			<charset>utf8</charset>
		</encoder>
	</appender>
    <!-- logstash远程日志配置-->
    <appender name="logstash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        <destination>192.168.8.128:4560</destination>
        <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder" />
    </appender>
	<!-- 日志输出级别 -->
	<root level="INFO">
		<appender-ref ref="console" />
		<appender-ref ref="logstash" />
	</root>
</configuration>

Überprüfen Sie nach dem Start des Projekts, ob die Protokollinformationen in Elasticsearch in Kibanna geschrieben werden

6. Zeigen Sie Protokollinformationen in Kibanna an

Geben Sie Folgendes ein: GET test_log/_search, um alle anzuzeigen.

7. Erstellen Sie ein Protokollsystem

Gegeben eine einfache Anforderung:

Erstellen Sie ein Protokollsystem und stellen Sie eine Schnittstelle zum Abfragen von Protokollinformationen in Elasticsearch bereit. (Die Protokollinformationen innerhalb von 15 Minuten werden standardmäßig abgefragt)

7.1 Ändern Sie die pom.xml-Datei

    <dependencies>
        <!-- springDateElasticsearch依赖-->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
		</dependency>
        <!--lombok依赖-->
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<optional>true</optional>
		</dependency>
        <!-- test依赖-->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
        <!-- logstash依赖-->
        <dependency>
            <groupId>net.logstash.logback</groupId>
            <artifactId>logstash-logback-encoder</artifactId>
            <version>6.3</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
	</dependencies>

7.2 Ändern Sie die Konfigurationsdatei application.yml

spring:
  elasticsearch:
    rest:
      uris: http://192.168.8.128:9200

7.3 Erstellen von Entitäten

Anhand der in Kibana angezeigten Protokollinformationen ist ersichtlich, dass außer message ein Klassentyp ist, der einige andere Attribute enthält, die anderen Attribute einfache Typattribute sind.

 Beachten Sie, dass @version und @timestamp mit @JsonProperty in Spring Data Elasticsearch 3.x empfangen werden.

@version und @timestamp können direkt über das Namensattribut von @Field in Spring Data Elasticsearch 4.x zugeordnet werden.

Der Zeittyp sollte mithilfe des Formatattributs konvertiert werden. Verwenden Sie keine benutzerdefinierten Methoden.

Erstellen Sie die LogPojo-Entitätsklasse

@Data
@Document(indexName = "test_log")
public class LogPojo {
    @Id
    private String id;
    @Field(type = FieldType.Keyword)
    private String host;
    @Field(type = FieldType.Long)
    private Long port;
    @Field(type = FieldType.Text)
    private String message;
    @Field(type = FieldType.Date,name = "@timestamp",format = DateFormat.date_time)
    private Date timestamp;
    @Field(type = FieldType.Text,name = "@version")
    private String version;
    // 不与ES中的属性对应。当自己业务中需要日志内容时
    private MessagePojo messagePojo;
}

Erstellen Sie eine MessagePojo-Entitätsklasse (um die Protokollinformationen des Nachrichtenfelds zu verfeinern)

@Data
public class MessagePojo {
    @JsonProperty("@timestamp")
    private Date timestamp;
    @JsonProperty("@version")
    private String version;
    private String message;
    private String logger_name;
    private String thread_name;
    private String level;
    private String level_value;
}

7.4 Neue Dienst- und Implementierungsklasse

public interface DemoService {
    List<LogPojo> demo();
}
@Service
@Slf4j
public class DemoServiceImpl implements DemoService {

    @Autowired
    private ElasticsearchRestTemplate elasticsearchRestTemplate;

    @Override
    public List<LogPojo> demo() {
        // 获取当前时间
        Calendar instance = Calendar.getInstance();
        instance.add(Calendar.MINUTE,-15);
        // 查询近15分钟的日志信息
        Query query = new NativeSearchQuery(QueryBuilders.rangeQuery("@timestamp").gte(instance));
        // 分页
        query.setPageable(PageRequest.of(1,30));
        SearchHits<LogPojo> search = elasticsearchRestTemplate.search(query, LogPojo.class);
        log.error("查询结果总条数为: "+ search.getTotalHits());
        List<SearchHit<LogPojo>> searchHits = search.getSearchHits();
        List<LogPojo> list = new ArrayList<>();
        searchHits.forEach(hits->{
            LogPojo logPojo = hits.getContent();
            String message = logPojo.getMessage();
            ObjectMapper objectMapper = new ObjectMapper();
            MessagePojo mp = null;
            try {
                mp = objectMapper.readValue(message, MessagePojo.class);
            } catch (JsonProcessingException e) {
                e.printStackTrace();
            }
            logPojo.setMessagePojo(mp);
            list.add(logPojo);
        });
        return list;
    }
}

7.5 Erstellen Sie eine neue Steuerung

@RestController
public class DemoController {

    @Autowired
    private DemoService demoService;

    /**
     * 获取es中最近15分钟的日志
     * @return
     */
    @RequestMapping("/")
    public List<LogPojo> demo(){
       return demoService.demo();
    }
}

7.6 Testergebnisse

Geben Sie im Browser ein: http://127.0.0.1:8080/ 

Das Ergebnis sehen Sie unten.

Ich denke du magst

Origin blog.csdn.net/xiaozhang_man/article/details/125034422
Empfohlen
Rangfolge