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

Drei Möglichkeiten zum Sperren und Entsperren von Benutzerkonten in Linux

Wenn in Ihrer Organisation bereits eine Kennwortr...

Detaillierte Erklärung der berechneten Eigenschaften in Vue

Inhaltsverzeichnis Interpolationsausdrücke Method...

Detaillierte Erklärung des Hash-Jump-Prinzips von Vue

Inhaltsverzeichnis Der Unterschied zwischen Hash ...

JavaScript-Funktion Currying

Inhaltsverzeichnis 1 Was ist Funktions-Currying? ...

Beispielcode von Vue + Element UI zur Realisierung der Player-Funktion

Die Anzeige ohne Effektbild ist nur leeres Gerede...

Zusammenfassung häufig verwendeter Toolfunktionen in Vue-Projekten

Inhaltsverzeichnis Vorwort 1. Benutzerdefinierter...

Fallstudie zu JavaScript-Funktionsaufrufen, Apply- und Bind-Methoden

Zusammenfassen 1. Ähnlichkeiten Beide können den ...