Was ist ELK? ELK ist ein vollständiger Satz von Lösungen zur Protokollsammlung und Front-End-Anzeige, die von Elastic bereitgestellt werden. Es ist die Abkürzung für drei Produkte, nämlich ElasticSearch, Logstash und Kibana. Logstash ist für die Protokollverarbeitung, etwa Protokollfilterung und Protokollformatierung, zuständig; ElasticSearch verfügt über leistungsstarke Textsuchfunktionen und dient daher als Protokollspeichercontainer; und Kibana ist für die Front-End-Anzeige zuständig. Die ELK-Architektur ist wie folgt: Filebeat wird hinzugefügt, um Protokolle von verschiedenen Clients zu sammeln und sie dann zur einheitlichen Verarbeitung an Logstash weiterzuleiten. ELK-Bau Da ELK aus drei Produkten besteht, können Sie diese drei Produkte nacheinander installieren. Hier entscheiden wir uns, ELk mit Docker zu installieren. Bei der Docker-Installation von ELk können die Images dieser drei Produkte auch separat heruntergeladen und ausgeführt werden. Dieses Mal verwenden wir jedoch das Drei-in-Eins-Image von Elk, um es direkt zu installieren. Daher müssen Sie zunächst sicherstellen, dass Sie über eine Docker-Betriebsumgebung verfügen. Informationen zum Erstellen einer Docker-Betriebsumgebung finden Sie unter: https://blog.csdn.net/qq13112... Ziehen Sie das Bild Nachdem Sie die Docker-Umgebung erstellt haben, führen Sie den Befehl auf dem Server aus: Dieser Befehl lädt das Elk-Three-in-One-Image aus dem Docker-Repository herunter. Die Gesamtgröße beträgt mehr als 2 GB. Wenn Sie feststellen, dass die Downloadgeschwindigkeit zu langsam ist, können Sie die Quelladresse des Docker-Repositorys durch die inländische Quelladresse ersetzen. Nachdem der Download abgeschlossen ist, überprüfen Sie das Bild: Logstash-Konfiguration Erstellen Sie eine neue beats-input.conf im Verzeichnis Eingabe { schlägt { Port => 5044 } } Erstellen Sie eine neue output.conf zum Ausgeben von Protokollen von Logstash an ElasticSearch: Ausgabe { elastische Suche Hosts => ["lokaler Host"] manage_template => falsch index => "%{[@metadata][beat]}" } } Ausführen des Containers Nachdem Sie das Image haben, können Sie es direkt starten: -d bedeutet, den Container im Hintergrund auszuführen; -p bedeutet Host-Port: Container-Port, also die Zuordnung des im Container verwendeten Ports zu einem Port auf dem Host. Die Standardports von ElasticSearch sind 9200 und 9300. Da auf meinem Rechner bereits 3 ElasticSearch-Instanzen laufen, wird hier der Zuordnungsport geändert. -v bedeutet Hostdatei|Ordner:Containerdatei|Ordner. Hier werden die Elasticsearch-Daten im Container in --name bedeutet, den Container zu benennen. Die Benennung soll die spätere Bedienung des Containers erleichtern. Wenn Sie ElasticSearch schon einmal erstellt haben, werden Sie feststellen, dass während des Erstellungsprozesses verschiedene Fehler auftreten. Beim Erstellen von Elk mit Docker treten diese Fehler jedoch nicht auf. Überprüfen Sie den Container nach der Ausführung von: Zeigen Sie die Containerprotokolle an: Geben Sie den Container ein: Starten Sie den Container nach der Änderung der Konfiguration neu: Kinaba anzeigen Geben Sie http://my_host:5601/ in Ihren Browser ein Filebeat-Einrichtung Filebeat wird verwendet, um Daten zu sammeln und an Logstash oder ElasticSearch zu melden. Laden Sie Filebeat auf den Server herunter, auf dem Protokolle gesammelt werden müssen, und entpacken Sie es zur Verwendung. Ändern der Konfigurationsdatei Geben Sie Filebeat ein und ändern Sie Filebeat.yml. Dateibeat.prospectors: - Typ: Protokoll #Muss auf true gesetzt werden, damit die Konfiguration wirksam wirdenabled: true Weg: #Konfigurieren Sie den zu erfassenden Protokollpfad - /var/log/*.log #Sie können ein Tag hinzufügen und es später zur Klassifizierung verwenden: ["my_tag"] #Entspricht dem ElasticSearch-Typ Dokumenttyp: mein_Typ setup.kibana: #Hier ist die IP und der Port von Kibana, d. h. kibana:5601 Gastgeber: "" Ausgabe.logstash: #Hier ist die IP und der Port von Logstash, d. h. logstash:5044 Gastgeber: [""] #Muss auf true gesetzt werden, sonst wird es nicht wirksam aktiviert: true #Wenn Sie Daten direkt von Filebeat zu ElasticSearch sammeln möchten, können Sie die entsprechende Konfiguration von output.elasticsearch konfigurieren Führen Sie Filebeat aus laufen: An diesem Punkt können Sie sehen, dass Filebeat die Protokolle unter dem konfigurierten Pfad an Logstash sendet. Anschließend sendet Logstash die Daten nach der Verarbeitung an ElasticSearch. Wir möchten jedoch eine Datenanalyse über Elk durchführen, daher müssen die in ElasticSearch importierten Daten im JSON-Format vorliegen. Dies ist das Format meines vorherigen Einzelprotokolls: 2019-10-22 10:44:03.441 INFO rmjk.interceptors.IPInterceptor Zeile:248 - {"clientType":"1","deCode":"0fbd93a286533d071","eaType":2,"eaid":191970823383420928,"ip":"xx.xx.xx.xx","model":"HONOR STF-AL10","osType":"9","path":"/applicationEnter","result":5,"session":"ef0a5c4bca424194b29e2ff31632ee5c","timestamp":1571712242326,"uid":"130605789659402240","v":"2.2.4"} Da die Analyse nach dem Import schwierig war, dachte ich daran, die Protokolle mit Grok im Logstash-Filter in das JSON-Format zu verarbeiten und sie dann in ElasticSearch zu importieren. Da die Parameter in meinen Protokollen jedoch nicht festgelegt waren, fand ich das zu schwierig. Also wechselte ich zu Logback, das die Protokolle direkt in JSON formatierte und sie dann per Filebeat sendete. Logback-Konfiguration Mein Projekt ist Spring Boot. Fügen Sie dem Projekt Abhängigkeiten hinzu: <Abhängigkeit> <groupId>net.logstash.logback</groupId> <artifactId>logstash-logback-encoder</artifactId> <version>5.2</version> </Abhängigkeit> Fügen Sie dann logback.xml zum Ressourcenverzeichnis im Projekt hinzu: <?xml version="1.0" encoding="UTF-8"?> <Konfiguration> <!-- veranschaulichen: 1. Protokollebene und Dateiprotokolldatensätze werden hierarchisch aufgezeichnet. Die Ebene entspricht dem Protokolldateinamen. Protokollinformationen verschiedener Ebenen werden in verschiedenen Protokolldateien aufgezeichnet. Beispielsweise wird die Fehlerebene in log_error_xxx.log oder log_error.log aufgezeichnet (diese Datei ist die aktuelle Protokolldatei), und log_error_xxx.log ist ein Archivprotokoll. Protokolldateien werden nach Datum aufgezeichnet. Wenn die Protokolldateigröße innerhalb eines Tages gleich oder größer als 2 MB ist, wird sie in der Reihenfolge 0, 1, 2 usw. benannt. Beispiel: log-level-2013-12-21.0.log Das Gleiche gilt für andere Protokollierungsebenen. 2. Wenn der Dateipfad für Entwicklung und Tests verwendet wird, führen Sie das Projekt in Eclipse aus und suchen Sie im Eclipse-Installationspfad nach dem Ordner „Logs“. Verwenden Sie dazu den relativen Pfad ../logs. Wenn unter Tomcat bereitgestellt, dann in der Protokolldatei unter Tomcat 3. Appender FILEERROR entspricht der Fehlerstufe, und der Dateiname hat die Form log-error-xxx.log. FILEWARN entspricht der Warnstufe, und der Dateiname hat die Form log-warn-xxx.log. FILEINFO entspricht der Infostufe, und der Dateiname hat die Form log-info-xxx.log. FILEDEBUG entspricht der Debugstufe, und der Dateiname hat die Form log-debug-xxx.log. stdout gibt zur Vereinfachung von Entwicklung und Test Protokollinformationen an die Steuerung aus --> <contextName>Dienst</contextName> <Eigenschaftsname="LOG_PATH" Wert="Protokolle"/> <!--Systemprotokollverzeichnis festlegen--> <Eigenschaftsname="APPDIR" Wert="Arzt"/> <!-- Logger, fortlaufender Datumseintrag--> <appender name="DATEIFEHLER" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- Der Pfad und Dateiname der aufgezeichneten Protokolldatei--> <Datei>${LOG_PATH}/${APPDIR}/log_error.log</Datei> <!-- Die Rollstrategie des Loggers, Aufzeichnung nach Datum und Größe --> <rollingPolicy-Klasse="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- Der Pfad der archivierten Protokolldatei. Heute ist beispielsweise das Protokoll vom 21.12.2013. Der Pfad der aktuell geschriebenen Protokolldatei wird durch den Dateiknoten angegeben. Sie können diese Datei und den durch die Datei angegebenen Dateipfad auf unterschiedliche Pfade setzen, sodass die aktuelle Protokolldatei oder die archivierte Protokolldatei in unterschiedlichen Verzeichnissen abgelegt werden. Die Protokolldatei für den 21.12.2013 wird durch fileNamePattern angegeben. %d{yyyy-MM-dd} gibt das Datumsformat an, %i gibt den Index an --> <fileNamePattern>${LOG_PATH}/${APPDIR}/error/log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern> <!-- Zusätzlich zur Protokollierung ist die Protokolldatei so konfiguriert, dass sie 2 MB nicht überschreitet. Wenn sie 2 MB überschreitet, beginnt die Protokolldatei mit Index 0. Benennen Sie die Protokolldatei, zum Beispiel log-error-2013-12-21.0.log --> <timeBasedFileNamingAndTriggeringPolicy-Klasse="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>2 MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> </rollingPolicy> <!-- Protokolle anhängen --> <anhängen>wahr</anhängen> <!-- Protokolldateiformat --> <encoder Klasse="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger Zeile:%-3L - %msg%n</pattern> <Zeichensatz>utf-8</Zeichensatz> </Encoder> <!-- Diese Protokolldatei zeichnet nur die Informationsebene auf --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>Fehler</level> <onMatch>AKZEPTIEREN</onMatch> <onMismatch>ABLEHNEN</onMismatch> </filter> </appender> <!-- Logger, fortlaufender Datumseintrag--> <appender name="FILEWARN" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- Der Pfad und Dateiname der aufgezeichneten Protokolldatei--> <Datei>${LOG_PATH}/${APPDIR}/log_warn.log</Datei> <!-- Die Rollstrategie des Loggers, Aufzeichnung nach Datum und Größe --> <rollingPolicy-Klasse="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- Der Pfad der archivierten Protokolldatei. Heute ist beispielsweise das Protokoll vom 21.12.2013. Der Pfad der aktuell geschriebenen Protokolldatei wird durch den Dateiknoten angegeben. Sie können diese Datei und den durch die Datei angegebenen Dateipfad auf unterschiedliche Pfade setzen, sodass die aktuelle Protokolldatei oder die archivierte Protokolldatei in unterschiedlichen Verzeichnissen abgelegt werden. Die Protokolldatei für den 21.12.2013 wird durch fileNamePattern angegeben. %d{yyyy-MM-dd} gibt das Datumsformat an, %i gibt den Index an --> <fileNamePattern>${LOG_PATH}/${APPDIR}/warn/log-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern> <!-- Zusätzlich zur Protokollierung ist die Protokolldatei so konfiguriert, dass sie 2 MB nicht überschreitet. Wenn sie 2 MB überschreitet, beginnt die Protokolldatei mit Index 0. Benennen Sie die Protokolldatei, zum Beispiel log-error-2013-12-21.0.log --> <timeBasedFileNamingAndTriggeringPolicy-Klasse="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>2 MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> </rollingPolicy> <!-- Protokolle anhängen --> <anhängen>wahr</anhängen> <!-- Protokolldateiformat --> <encoder Klasse="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger Zeile:%-3L - %msg%n</pattern> <Zeichensatz>utf-8</Zeichensatz> </Encoder> <!-- Diese Protokolldatei zeichnet nur die Informationsebene auf --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>warnen</level> <onMatch>AKZEPTIEREN</onMatch> <onMismatch>ABLEHNEN</onMismatch> </filter> </appender> <!-- Logger, fortlaufender Datumseintrag--> <appender name="DATEIINFO" Klasse="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- Der Pfad und Dateiname der aufgezeichneten Protokolldatei--> <Datei>${LOG_PATH}/${APPDIR}/log_info.log</Datei> <!-- Die Rollstrategie des Loggers, Aufzeichnung nach Datum und Größe --> <rollingPolicy-Klasse="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- Der Pfad der archivierten Protokolldatei. Heute ist beispielsweise das Protokoll vom 21.12.2013. Der Pfad der aktuell geschriebenen Protokolldatei wird durch den Dateiknoten angegeben. Sie können diese Datei und den durch die Datei angegebenen Dateipfad auf unterschiedliche Pfade setzen, sodass die aktuelle Protokolldatei oder die archivierte Protokolldatei in unterschiedlichen Verzeichnissen abgelegt werden. Die Protokolldatei für den 21.12.2013 wird durch fileNamePattern angegeben. %d{yyyy-MM-dd} gibt das Datumsformat an, %i gibt den Index an --> <fileNamePattern>${LOG_PATH}/${APPDIR}/info/log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern> <!-- Zusätzlich zur Protokollierung ist die Protokolldatei so konfiguriert, dass sie 2 MB nicht überschreitet. Wenn sie 2 MB überschreitet, beginnt die Protokolldatei mit Index 0. Benennen Sie die Protokolldatei, zum Beispiel log-error-2013-12-21.0.log --> <timeBasedFileNamingAndTriggeringPolicy-Klasse="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>2 MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> </rollingPolicy> <!-- Protokolle anhängen --> <anhängen>wahr</anhängen> <!-- Protokolldateiformat --> <encoder Klasse="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger Zeile:%-3L - %msg%n</pattern> <Zeichensatz>utf-8</Zeichensatz> </Encoder> <!-- Diese Protokolldatei zeichnet nur die Informationsebene auf --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>Informationen</level> <onMatch>AKZEPTIEREN</onMatch> <onMismatch>ABLEHNEN</onMismatch> </filter> </appender> <appender name="jsonLog" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- Der Pfad und Dateiname der aufgezeichneten Protokolldatei--> <Datei>${LOG_PATH}/${APPDIR}/log_IPInterceptor.log</Datei> <rollingPolicy-Klasse="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${LOG_PATH}/${APPDIR}/log_IPInterceptor.%d{jjjj-MM-tt}.log</fileNamePattern> </rollingPolicy> <Encoder-Klasse="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder"> <jsonFactoryDecorator-Klasse="net.logstash.logback.decorate.CharacterEscapesJsonFactoryDecorator"> <Escape> <targetCharacterCode>10</targetCharacterCode> <escapeSequence>\u2028</escapeSequence> </escape> </jsonFactoryDecorator> <Anbieter> <Muster> <Muster> { "Zeitstempel":"%date{ISO8601}", "uid": "%mdc{uid}", "requestIp": "%mdc{ip}", "id": "%mdc{id}", "Clienttyp": "%mdc{Clienttyp}", "v":"%mdc{v}", "deCode":"%mdc{deCode}", "Daten-ID": "%mdc{Daten-ID}", "Datentyp": "%mdc{Datentyp}", "vid": "%mdc{vid}", "hat":"%mdc{hat}", "cid": "%mdc{cid}", "tagId":"%mdc{tagId}" } </Muster> </Muster> </Anbieter> </Encoder> </appender> <!-- Farbprotokoll --> <!-- Rendering-Klasse, von der Farbprotokolle abhängen --> <conversionRule Konvertierungswort="clr" Konverterklasse="org.springframework.boot.logging.logback.ColorConverter"/> <conversionRule Konvertierungswort="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/> <conversionRule Konvertierungswort="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/> <!-- Farbprotokollformat --> <Eigenschaftsname="CONSOLE_LOG_PATTERN" Wert="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){schwach} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){schwach} %clr([%15.15t]){schwach} %clr(%-40.40logger{39}){cyan} %clr(:){schwach} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <!--Die Standardkonfiguration des Encoders ist PatternLayoutEncoder--> <Encoder> <Muster>${CONSOLE_LOG_PATTERN}</Muster> <Zeichensatz>utf-8</Zeichensatz> </Encoder> <!--Dieser Protokoll-Appender ist für die Entwicklung bestimmt. Es ist nur die niedrigste Ebene konfiguriert. Die von der Konsole ausgegebene Protokollebene ist größer oder gleich dieser Ebene an Protokollinformationen--> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>Debuggen</level> </filter> </appender> <!-- Geben Sie die Protokollierungsebene für ein Paket im Projekt an, wenn ein Protokollierungsvorgangsverhalten vorliegt--> <!-- rmjk.dao.mappe ist das Stammpaket, d. h. alle Protokollvorgänge unter diesem Stammpaket verfügen über die Berechtigung DEBUG --> <!-- Die Stufen sind [von hoch nach niedrig]: FATAL > ERROR > WARN > INFO > DEBUG > TRACE --> <logger name="rmjk.dao.mapper" level="DEBUG"/> <logger name="rmjk.service" level="DEBUG"/> <!--Protokoll anzeigen--> <logger name="org.springframework.jdbc.core" additivity="false" level="DEBUG"> <appender-ref ref="STDOUT"/> <appender-ref ref="DATEIINFO"/> </logger> <!-- JSON-Protokoll drucken --> <logger name="IPInterceptor" level="info" additivity="false"> <appender-ref ref="jsonLog"/> </logger> <!-- Konfigurieren Sie diese Ebene in einer Produktionsumgebung auf ein geeignetes Niveau, um zu viele Protokolldateien oder eine Beeinträchtigung der Programmleistung zu vermeiden--> <root-Ebene="INFO"> <appender-ref ref="DATEIFEHLER"/> <appender-ref ref="FILEWARN"/> <appender-ref ref="DATEIINFO"/> <!-- Bitte entfernen Sie stdout und testfile in der Produktionsumgebung --> <appender-ref ref="STDOUT"/> </Wurzel> </Konfiguration> Die wichtigsten Punkte sind: <logger name="IPInterceptor" level="info" additivity="false"> <appender-ref ref="jsonLog"/> </logger> Führen Sie slf4j in die Datei ein, die gedruckt werden soll: privater statischer endgültiger Logger LOG = LoggerFactory.getLogger("IPInterceptor"); Tragen Sie die zu druckenden Informationen in MDC ein: MDC.put("ip", IP-Adresse); MDC.put("Pfad", ServletPfad); MDC.put("uid", paramMap.get("uid") == null ? "" : paramMap.get("uid").toString()); Wenn zu diesem Zeitpunkt Logstash-Konfiguration ändern Ändern Sie beats-input.conf im Verzeichnis Eingabe { schlägt { Port => 5044 Codec => "json" } } Es wird nur Da die Konfiguration geändert wurde, starten Sie elk neu: Auf diese Weise können wir unsere Protokolle nach der Generierung mit Filebeat in Elk importieren und anschließend Kibana zur Analyse der Protokolle verwenden. Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, er wird für jedermanns Studium hilfreich sein. Ich hoffe auch, dass jeder 123WORDPRESS.COM unterstützen wird. Das könnte Sie auch interessieren:
|
<<: Beispieloperation für die Summe des Mysql-Varchar-Typs
>>: Mehrere Lösungen zum Vergessen des MySQL-Passworts
Inhaltsverzeichnis 1. Mehrere Syntaxen von Insert...
Docker installiert MySQL Version 8.0.20 zu Ihrer ...
Der MySQL-Dienst wird gestartet, aber es kann kei...
Inhaltsverzeichnis 1. Komponenteneinführung 2. In...
Datensicherung und Wiederherstellung Teil 2, wie ...
1. Konfigurieren Sie den Docker-Remoteverbindungs...
Inhaltsverzeichnis PXE implementiert die unbeaufs...
Server: Ubuntu Server 16.04 LSS Kunde: Ubuntu 16....
Im vorherigen Artikel wurde erwähnt, dass die in ...
Installieren Sie zugehörige Abhängigkeiten npm ic...
Vorwort: Ich habe vor Kurzem begonnen, den Aufbau...
Inhaltsverzeichnis Vorwort 1. Linux ändert die Yu...
<br />Originaltext: http://blog.rexsong.com/...
Es gibt zwei Metaattribute: Name und http-equiv. D...
1. Einführung in MMM: MMM steht für Multi-Master ...