2014-04-15 21 views
7

Uruchamiam wiele instancji CoreOS w Google Compute Engine (GCE). CoreOS wykorzystuje funkcję rejestrowania dziennika systemd. Jak mogę przesłać wszystkie dzienniki do zdalnego miejsca docelowego? Jak rozumiem, dziennik systemd nie pochodzi ze zdolnościami zdalnego logowania. Mój obecny obejście wygląda następująco:Jak powinienem obsługiwać zdalne rejestrowanie przy użyciu systemd?

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

Z https://logentries.com używając ich Token-based input via TCP:

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

Czy istnieją lepsze sposoby?

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

+0

'' awk '{print "", 0 USD; fflush(); } ''' przedkłada '' '' dla każdej linii dziennika. – mattes

Odpowiedz

6

Minusem użyciem -o short to, że format jest trudne do analizowania; short-iso jest lepszy. Jeśli używasz stosu ELK, eksportowanie jako JSON jest jeszcze lepsze. Usługa systemowa, taka jak poniższa, będzie wysyłać dzienniki w formacie JSON do zdalnego hosta całkiem dobrze.

[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 

Po drugiej stronie, logstash.conf dla mnie obejmuje:

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

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

Wynika to w całej strukturze danych journalctl będącego do dyspozycji Kibana/Elasticsearch.

+0

Myślę, że ten numer portu powinien być taki sam, prawda? 1515 i 515? – user22866

0

journal-2-logentries Kelsey Hightower za pracował bardzo dobrze dla nas: https://logentries.com/doc/coreos/

Jeśli chcesz wpaść i umożliwić jednostki bez Floty:

#!/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

Niedawny pakiet python moich być użyteczne : journalpump

Dzięki obsłudze wyników Elastic Search, Kafka i logplex.

Powiązane problemy