2015-08-18 9 views
5

Obecnie przekierowujemy wszystkie logi aplikacji na standardowe wyjście z wielu kontenerów i zbieramy plik/var/log/message przez rsyslog w hoście na stos ELK.Rozwiązania logów dla wielu kontenerów działających na tym samym hoście

Wszystkie dzienniki kontenera dokera są wyświetlane jako docker/xxxxxxxx, nie możemy stwierdzić, dla której aplikacji jest ten dziennik, w każdym razie możemy łatwo odróżnić aplikacje od wielu dzienników kontenerów od stdout dokowanego?

+1

"Dzienniki-dokowania -f" mogą wystarczyć, jeśli tak się zaczęło –

Odpowiedz

1

Czy przejrzałeś fluentd? To może być to, czego potrzebujesz.

+0

To samo pytanie, jak możemy określić każdy typ aplikacji inny niż identyfikator kontenera? – Tom

+0

Szczerze mówiąc nigdy tego nie używałem, ale słyszałem o tym dobre rzeczy. Obawiam się, że musielibyście sięgnąć głębiej na jego dokumentacje. –

0

Dlaczego polegasz na dziennikach/var/log/messages dla logów aplikacji? Moim zdaniem logi aplikacji powinny być niezależne.

Załóżmy, że masz java, ruby, python, węzeł, aplikację golang (cokolwiek), wtedy możesz pompować dzienniki w kontenerze w coś takiego jak /var/log/myapp/myapp.log. RUN swój dziennik forwarder w pojemniku wysyłać ELK wszystko pod /var/log/myapp/myapp.log

Zazwyczaj nadawca pokaże nazwę hosta jako swojej container_id oparciu o zmiennej HOSTNAME env. Na przykład:

[[email protected] ~]# env | grep HOSTNAME 
HOSTNAME=1dfab5ea15cd 
[[email protected] ~]# 

Można również użyć coś jak Beaver lub log-courier wysyłać dzienniki.

Możesz obracać swoje dzienniki i pozbywać się starych dzienników, jeśli chodzi o miejsce na dysku.

Jeśli więc chcesz użyć polecenia docker logs, aby przekierować do STDOUT i STDERR, będziesz chciał, aby twoja aplikacja zapisała coś w dzienniku, który identyfikuje kontener/aplikację. (Kontener może być nazwą hosta ponownie) Ale możesz przekierować na numer /var/log/app/application.log na komputerze głównym. Coś jak:

containerid/<hostname>-application: INFO: <message> 

Nie myśl jest jakaś inna droga ...

Można również przełączyć na Fluentd zamiast Logstash jako inną opcję.

+0

Zapisywanie logów fizycznych do kontenera nie jest najlepszą praktyką, z Docker 1.6 jesteśmy w stanie wyprowadzić wszystkie logi aplikacji na standardowe wyjście, a host go odbiera do dalszego przetwarzania. – Tom

+0

Nie do końca widzę to w ten sposób, uważam, że najlepszą praktyką jest identyfikowanie przez Dockera identyfikatorów kontenerów podczas przekierowywania do STDOUT/STDERR w przyszłych wersjach. Wygląda na to, że jeszcze tam nie ma. – Rico

8

(Instrukcje dla OS X, ale powinien działać w systemie Linux)

Tam nie wydaje się być sposób to zrobić za pomocą polecenia Döcker jednak w bash można uruchomić wiele poleceń w tym samym czasie, a z sed możesz poprzedzić swoją nazwą kontenera.

docker logs -f --tail=30 container1 | sed -e 's/^/[-- container1 --]/' & 
docker logs -f --tail=30 container2 | sed -e 's/^/[-- container2 --]/' & 

I zobaczysz dane wyjściowe z obu kontenerów w tym samym czasie.

container1 :: logging line 
container1 :: logging line 
container2 :: logging line 
container2 :: logging line 
container1 :: logging line 
container1 :: logging line 
container2 :: logging line 
container2 :: logging line 

do ogona wszystkie pojemniki na raz:

#!/bin/bash 

names=$(docker ps --format "{{.Names}}") 
echo "tailing $names" 

while read -r name 
do 
    # eval to show container name in jobs list 
    eval "docker logs -f --tail=5 \"$name\" | sed -e \"s/^/[-- $name --] /\" &" 
    # For Ubuntu 16.04 
    #eval "docker logs -f --tail=5 \"$name\" |& sed -e \"s/^/[-- $name --] /\" &" 
done <<< "$names" 

function _exit { 
    echo 
    echo "Stopping tails $(jobs -p | tr '\n' ' ')" 
    echo "..." 

    # Using `sh -c` so that if some have exited, that error will 
    # not prevent further tails from being killed. 
    jobs -p | tr '\n' ' ' | xargs -I % sh -c "kill % || true" 

    echo "Done" 
} 

# On ctrl+c, kill all tails started by this script. 
trap _exit EXIT 

# For Ubuntu 16.04 
#trap _exit INT 

# Don't exit this script until ctrl+c or all tails exit. 
wait 

i zatrzymać je uruchomić fg a następnie naciśnij ctrl+c dla każdego pojemnika.

Aktualizacja: Dzięki @ Flo-Woo dla Ubuntu 16.04 support

+1

dla mojego serwera Ubuntu 16.04 musiałem wprowadzić te zmiany i działałem dobrze dzięki. "eval" dzienniki dokowania -f --tail = 5 \ "$ nazwa \" | & sed -e \ "s/^/[- $ nazwa -]/\" & "' i 'pułapka _exit INT ' –

+1

Dodałem także definicję powłoki na początku skryptu, inaczej otrzymałem" przekierowanie nieoczekiwane ". '#!/Bin/bash' – Jleuleu

+0

Dobry telefon @Jleuleu – Nate

Powiązane problemy