Beispiel für den Import von Nginx-Protokollen in Elasticsearch

Beispiel für den Import von Nginx-Protokollen in Elasticsearch

Die Nginx-Protokolle werden von Filebeat gesammelt, an Logstash übergeben und nach der Verarbeitung durch Logstash in Elasticsearch geschrieben. Filebeat ist nur für die Erfassungsarbeit verantwortlich, während Logstash die Protokollformatierung, den Datenersatz, die Aufteilung und die Erstellung von Indizes nach dem Schreiben der Protokolle in Elasticsearch übernimmt.

1. Konfigurieren Sie das Nginx-Protokollformat

log_format main '$remote_addr $http_x_forwarded_for [$time_local] $server_name $request ' 
            „$status $body_bytes_sent $http_referer“ 
            '"$http_user_agent" '
            '"$Verbindung" '
            '"$http_cookie" '
            „$Anforderungszeit“
            „$upstream_response_time“;

2. Installieren und konfigurieren Sie Filebeat und aktivieren Sie das Nginx-Modul

tar -zxvf filebeat-6.2.4-linux-x86_64.tar.gz -C /usr/local
cd /usr/local;ln -s filebeat-6.2.4-linux-x86_64 filebeat
cd /usr/local/filebeat

Nginx-Modul aktivieren

./filebeat-Module aktivieren nginx

Modul anzeigen

./filebeat-Modulliste

Erstellen einer Konfigurationsdatei

vim /usr/local/filebeat/blog_module_logstash.yml
Dateibeat.modules:
- Modul: nginx
 Zugang:
  aktiviert: true
  var.paths: ["/home/weblog/blog.cnfol.com_access.log"]
 #Fehler:
 # aktiviert: true
 # var.paths: ["/home/weblogerr/blog.cnfol.com_error.log"]


Ausgabe.logstash:
 Gastgeber: ["192.168.15.91:5044"]

Starten Sie Filebeat

./filebeat -c blog_module_logstash.yml -e

3. Logstash konfigurieren

tar -zxvf logstash-6.2.4.tar.gz /usr/local
cd /usr/local;ln -s logstash-6.2.4 logstash
Erstellen Sie eine Pipeline-Datei für das Nginx-Protokoll cd /usr/local/logstash

Integriertes Logstash-Vorlagenverzeichnis

Anbieter/Bundle/jruby/2.3.0/Gems/logstash-patterns-core-4.1.2/Muster

Bearbeiten Sie Grok-Muster und fügen Sie ein reguläres Muster hinzu, das mehrere IPs unterstützt

VORWORT (?:%{IPV4}[,]?[ ]?)+|%{WORT}

Offizielles Grok

http://grokdebug.herokuapp.com/patterns#

Erstellen einer Logstash-Pipeline-Konfigurationsdatei

#Eingabe {
# stdin {}
#}
# Dateneingabe von Filebeat akzeptieren {
 schlägt {
 Port => 5044
 Host => "0.0.0.0"
 }
}

Filter {
 # Einen Debugging-Schalter hinzufügen mutate{add_field => {"[@metadata][debug]"=>true}}
 grok {
 # Nginx-Protokoll filtern #match => { "message" => "%{NGINXACCESS_TEST2}" }
 #Match => {"message" => ' %{iporhost: clientIp} # (? <http_x_forwarded_for> [^\ #]*) # \ [ %{httpdate: [@metadata] [WebTime]} {{nicht problem {{{nichtspace: Hostname: Hostname: {{} # %{Word {Word {Word {Word {{Word {Word {{Word {{Word {Word} {{{{{{{nicht : httpversion} #%{Nummer: Antwort} # (?:%{number: bytes} |-) # (?: "(?:%{NotSpace: Referrer} |-)" |%{NotSpace: Referrer} | {Nummer: Verbindung} |-) # (?: "(? <Cookies> [^ #]*)") # %{Nummer: Request_time: float} # (?: %{Number: upstream_response_time: float} |-) '}
 #Match => {"message" => '(?:%{iporhost: clientIp} |-) (? |-)%{word: methode}%{afripathparam: request} http/%{numme: httpversion}%{numme: response} (? : Verbindung} |-) "|%{Nummer: Verbindung} |-) (?:" (? <Cookies> [^#]*) ")%{Nummer: Request_Time: float} (?
    match => {"message" => '(? Nummer: httpversion}%{Nummer: Antwort} (? {Nummer: Request_time: float} (?:%{number: upstream_response_time: float} |-) '}
 }
 # Weisen Sie dem neuen Feld @read_tiimestamp den Standardwert @timestamp (die Zeit, zu der Beats Protokolle sammelt) zu
 Rubin { 
 #code => "event.set('@read_timestamp',event.get('@timestamp'))"
 #Ändern Sie die Zeitzone auf Ost 8 Code => "event.set('@read_timestamp',event.get('@timestamp').time.localtime + 8*60*60)"
 }
 # Formatieren Sie die Aufzeichnungszeit des Nginx-Protokolls. # Formatieren Sie die Zeit 20. Mai 2015:21:05:56 +0000
 Datum {
 Gebietsschema => "en"
 Übereinstimmung => ["[@metadata][webtime]","dd/MMM/yyyy:HH:mm:ss Z"]
 }
 # Wandelt das Bytefeld von einem String in eine Zahl um mutate {
 konvertieren => {"Bytes" => "Ganzzahl"}
 }
 # Analysieren Sie das Cookie-Feld in ein JSON
 #mutieren {
 # gsub => ["Cookies",'\;',',']
 #} 
 # Wenn CDN-Beschleunigung verwendet wird, gibt es mehrere IP-Adressen für http_x_forwarded_for. Die erste IP-Adresse ist die tatsächliche IP-Adresse des Benutzers.
 wenn[http_x_forwarded_for] =~ ", "{
     Rubin {
         Code => 'event.set("http_x_forwarded_for", event.get("http_x_forwarded_for").split(",")[0])'
        }
    }
 # Analysieren Sie die IP-Adresse und ermitteln Sie den geografischen Standort der IP-Adresse geoip {
 Quelle => "http_x_forwarded_for"
 # # Holen Sie sich nur die Felder Längen- und Breitengrad, Land, Stadt und Zeitzone der IP => ["Standort","Ländername","Stadtname","Regionsname"] 
 }
 # Analysieren Sie das Agent-Feld, um spezifische Informationen wie Browser- und Systemversion zu erhalten useragent {
 Quelle => "Agent"
 Ziel => "Benutzeragent"
 }
 #Geben Sie die zu löschenden Daten an#mutate{remove_field=>["message"]}
 # Legen Sie das Indexnamenpräfix entsprechend dem Protokollnamen ruby ​​​​{ fest
 Code => 'Ereignis.Setzen("@[Metadaten][index_pre]",Ereignis.Get("Quelle").Split("/")[-1])'
 } 
 # Formatieren Sie @timestamp auf 2019.04.23
 Rubin {
 Code => 'Ereignis.Setzen("@[Metadaten][Index_Tag]",Ereignis.Get("@Zeitstempel").Zeit.Lokalzeit.strftime("%Y.%m.%d"))'
 }
 # Legen Sie den Standardindexnamen für die Ausgabe von mutate { fest.
 Feld hinzufügen => {
  #"[@metadata][index]" => "%{@[metadata][index_pre]}_%{+JJJJ.MM.tt}"
  "[@metadata][index]" => "%{@[metadata][index_pre]}_%{@[metadata][index_day]}"
 }
 }
 # Analysieren Sie das Cookies-Feld in JSON
# mutieren {
# gsub => [
# "Kekse", ";", ",",
# "Kekse", "=", ":"
# ]
# #split => {"Cookies" => ","}
# }
# json_encode {
# Quelle => "Cookies"
# Ziel => "cookies_json"
# }
# mutieren {
# gsub => [
# "cookies_json", ',', ',',
# "cookies_json", ':', '":"'
# ]
# }
# json {
# Quelle => "cookies_json"
# Ziel => "Cookies2"
# }
 # Wenn beim Grok-Parsing ein Fehler auftritt, schreiben Sie den Fehler in einen separaten Index, wenn "_grokparsefailure" in [tags] {
 #if "_dateparsefailure" in [tags] {
 mutieren {
  ersetzen => {
  #"[@metadata][index]" => "%{@[metadata][index_pre]}_failure_%{+JJJJ.MM.tt}"
  "[@metadata][index]" => "%{@[metadata][index_pre]}_failure_%{@[metadata][index_day]}"
  }
 }
 # Wenn kein Fehler vorliegt, löschen Sie die Nachricht
 }anders{
 mutieren{remove_field=>["Nachricht"]}
 }
}

Ausgabe {
 wenn [@metadata][debug]{
 # Ausgabe an rubydebuyg und Ausgabemetadaten
 stdout{codec => rubydebug{metadata => true}}
 }anders{
 # Konvertieren Sie den Ausgabeinhalt in "."
 stdout{codec => Punkte} 
 # Ausgabe an das angegebene es
 elastische Suche
  Hosts => ["192.168.15.160:9200"]
  index => "%{[@metadata][index]}"
  Dokumenttyp => "Dokument"
 } 
 }
}

Starten Sie Logstash

nohup bin/logstash -f test_pipline2.conf &

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:
  • Detaillierte Erläuterung der Verwendung von ELK zur Analyse von Nginx-Serverprotokollen
  • Detaillierte Erklärung zum Nginx-Protokollschneiden nach Datum (Schneiden nach Tag)
  • Shell-Skript zum Schneiden von Nginx-Protokollen
  • Konfigurationsbeispiel für die Protokollierung im JSON-Format in nginx
  • Shell-Skript-Analyse der Nginx-Protokollzugriffszeiten und der zeitaufwändigsten Seiten (langsame Abfrage)
  • So löschen Sie Nginx-Protokolle regelmäßig automatisch
  • Nginx-Protokollverarbeitungsskript unter Windows
  • Python analysiert Nginx-Protokolldateien

<<:  JS verwendet Canvas-Technologie, um Echarts-Balkendiagramme zu imitieren

>>:  So installieren Sie MySQL unter Linux (Yum und Quellcode-Kompilierung)

Artikel empfehlen

So schreiben Sie eine Node.JS-Version eines Spiels

Inhaltsverzeichnis Überblick Build-Prozess Verwan...

Natives JS zur Implementierung eines Hover-Dropdown-Menüs

JS implementiert ein Hover-Dropdown-Menü. Dies is...

Detaillierte Erklärung zur Verwendung von umask unter Linux

Ich habe vor Kurzem angefangen, Linux zu lernen. ...

JavaScript-Funktion Currying

Inhaltsverzeichnis 1 Was ist Funktions-Currying? ...

Der einfachste Weg, ein Programm beim Start in Linux automatisch auszuführen

Ich habe viele davon gesammelt, aber alle endeten...

Vue implementiert die Anzeige und Ausblendung der dreistufigen Navigation

In diesem Artikelbeispiel wird der spezifische Co...

ThingJS-Partikeleffekte, um Regen- und Schneeeffekte mit einem Klick zu erzielen

Inhaltsverzeichnis 1. Partikeleffekte 2. Laden Si...

Detaillierte Erklärung des Marquee-Attributs in HTML

Dieses Tag ist nicht Teil von HTML3.2 und wird nu...

MySql Installer 8.0.18 Visuelles Installationstutorial mit Bildern und Text

Inhaltsverzeichnis 1. MySQL 8.0.18 installieren 2...

Anwendungsbeispiel-Tutorial zum Schlüssel-Rendering in Vue

Einführung Während des Front-End-Projektentwicklu...