2014-04-15 9 views
7

Ich führe mehrere CoreOS-Instanzen auf Google Compute Engine (GCE). CoreOS verwendet die Protokollierungsfunktion von Systemd. Wie kann ich alle Protokolle an ein entferntes Ziel senden? Wie ich es verstehe, kommt Systemd Journal nicht mit Remote-Logging-Fähigkeiten. Meine aktuelle Work-around sieht wie folgt aus:Wie soll ich Remote Logging mit Systemd umgehen?

journalctl -o short -f | ncat <addr> <ip> 

Mit https://logentries.com mit ihren Token-based input via TCP:

journalctl -o short -f | awk '{ print "<token>", $0; fflush(); }' | ncat data.logentries.com 10000 

Gibt es bessere Möglichkeiten?

EDIT:https://medium.com/coreos-linux-for-massive-server-deployments/defb984185c5

+0

'' awk '{Druck "", $ 0; fflush(); } ''' '' '' für jede Protokollzeile vor. – mattes

Antwort

6

Ein Nachteil -o short zu verwenden ist, dass das Format parsen hart ist; short-iso ist besser. Wenn Sie einen ELK-Stack verwenden, ist der Export als JSON noch besser. Ein Systemdienst wie der folgende wird JSON-formatierte Protokolle recht gut an einen entfernten Host senden.

[Unit] 
Description=Send Journalctl to Syslog 

[Service] 
TimeoutStartSec=0 
ExecStart=/bin/sh -c '/usr/bin/journalctl -o json -f | /usr/bin/ncat syslog 515' 

Restart=always 
RestartSec=5s 

[Install] 
WantedBy=multi-user.target 

Auf der anderen Seite schließt logstash.conf für mich:

input { 
    tcp { 
    port => 1515 
    codec => json_lines 
    type => "systemd" 
    } 
} 

filter { 
    if [type] == "systemd" { 
    mutate { rename => [ "MESSAGE", "message" ] } 
    mutate { rename => [ "_SYSTEMD_UNIT", "program" ] } 
    } 
} 

Daraus ergibt sich die gesamte Datenstruktur journalctl zu Kibana/Elasticsearch zur Verfügung stehen.

+0

ich denke, diese Portnummer sollte das gleiche Recht sein? 1515 und 515? – user22866

0

Kelsey Hightower Journal-2-logentries hat für uns ziemlich gut funktioniert: https://logentries.com/doc/coreos/

Wenn Sie löschen möchten und ermöglichen die Geräte ohne Flotte:

#!/bin/bash 
# 
# Requires the Logentries Token as Parameter 

if [ -z "$1" ]; then echo "You need to provide the Logentries Token!"; exit 
0; fi 

cat << "EOU1" > /etc/systemd/system/systemd-journal-gatewayd.socket 
[Unit] 
Description=Journal Gateway Service Socket 
[Socket] 
ListenStream=/run/journald.sock 
Service=systemd-journal-gatewayd.service 
[Install] 
WantedBy=sockets.target 
EOU1 

cat <<EOU2> /etc/systemd/system/journal-2-logentries.service 
[Unit] 
Description=Forward Systemd Journal to logentries.com 
After=docker.service 
Requires=docker.service 
[Service] 
TimeoutStartSec=0 
Restart=on-failure 
RestartSec=5 
ExecStartPre=-/usr/bin/docker kill journal-2-logentries 
ExecStartPre=-/usr/bin/docker rm journal-2-logentries 
ExecStartPre=/usr/bin/docker pull 
quay.io/kelseyhightower/journal-2-logentries 
ExecStart=/usr/bin/bash -c \ 
"/usr/bin/docker run --name journal-2-logentries \ 
-v /run/journald.sock:/run/journald.sock \ 
-e LOGENTRIES_TOKEN=$1 \ 
quay.io/kelseyhightower/journal-2-logentries" 
[Install] 
WantedBy=multi-user.target 
EOU2 

systemctl enable systemd-journal-gatewayd.socket 
systemctl start systemd-journal-gatewayd.socket 
systemctl start journal-2-logentries.service 

rm -f $0 
0

Eine aktuelle Python-Paket mein nützlich sein : journalpump

Mit Unterstützung für Elastic Search, Kafka und Logplex-Ausgänge.

Verwandte Themen