Nie ma potrzeby przekierowywania dzienników.
Docker domyślnie przechowuje dzienniki w jednym pliku dziennika. Aby sprawdzić ścieżkę pliku dziennika, uruchom polecenie:
docker inspect --format='{{.LogPath}}' containername
/var/lib/docker/containers/f844a7b45ca5a9589ffaa1a5bd8dea0f4e79f0e2ff639c1d010d96afb4b53334/f844a7b45ca5a9589ffaa1a5bd8dea0f4e79f0e2ff639c1d010d96afb4b53334-json.log
Otwórz ten plik dziennika i przeanalizuj.
jeśli przekierowujesz logi, otrzymasz tylko dzienniki przed przekierowaniem. nie będzie można zobaczyć dzienników na żywo.
EDYTOWAĆ:
Aby zobaczyć dzienniki na żywo, możesz uruchomić poniższe polecenie
tail -f `docker inspect --format='{{.LogPath}}' containername`
Uwaga:
Ten plik dziennika /var/lib/docker/containers/f844a7b45ca5a9589ffaa1a5bd8dea0f4e79f0e2ff639c1d010d96afb4b53334/f844a7b45ca5a9589ffaa1a5bd8dea0f4e79f0e2ff639c1d010d96afb4b53334-json.log
zostanie utworzony tylko wtedy, gdy docker generuje dzienniki, jeśli nie ma żadnych dzienników, to tego pliku nie będzie. jest podobnie, jak czasami, gdy uruchomimy polecenie docker logs containername
i nic nie zwraca. W takim przypadku ten plik nie będzie dostępny.
tail -f `docker inspect --format='{{.LogPath}}' myapp`
- to naprawdę JSONA co z tą opcją:
docker logs containername >& logs/myFile.log
Nie przekieruje dzienników, o które pytano w pytaniu, ale skopiuje je raz do określonego pliku.
źródło
docker logs --help
aby mieć pewnośćdocker logs -f <yourContainer> &> your.log &
Wyjaśnienie:
-f
(tj.--follow
): zapisuje wszystkie istniejące dzienniki i kontynuuje ( następuje ) rejestrowanie wszystkiego, co nastąpi później.&>
przekierowuje zarówno standardowe wyjście, jak i błąd standardowy.&
.> output.log 2> error.log
(zamiast używać&>
).źródło
Aby przechwycić zarówno stdout, jak i stderr z kontenera Dockera do pojedynczego pliku dziennika, uruchom następujące polecenie:
źródło
Zakładając, że masz wiele kontenerów i chcesz zagregować dzienniki w jeden plik, musisz użyć jakiegoś agregatora dzienników, takiego jak fluentd. Fluentd jest obsługiwany jako sterownik rejestrowania dla kontenerów Docker.
Dlatego w docker-compose musisz zdefiniować sterownik rejestrowania
Drugim krokiem byłaby aktualizacja konfiguracji fluentd w celu obsługi dzienników zarówno dla usługi 1, jak i usługi 2
W tej konfiguracji prosimy o zapisywanie logów do pojedynczego pliku w tej ścieżce
/fluentd/log/service/service.*.log
a trzecim krokiem byłoby uruchomienie dostosowanego fluentd, który rozpocznie zapisywanie dzienników do pliku.
Oto link do instrukcji krok po kroku
Nieco długi, ale poprawny sposób, ponieważ masz większą kontrolę nad ścieżką plików dziennika itp. I działa również dobrze w Docker Swarm.
źródło
Ponieważ Docker łączy dla nas stdout i stderr, możemy traktować dane wyjściowe dziennika jak każdy inny strumień powłoki. Aby przekierować bieżące dzienniki do pliku, użyj operatora przekierowania
$ docker logs test_container > output.log
docker logs -f test_container > output.log
Zamiast wysyłać dane wyjściowe do stderr i stdout, przekieruj dane wyjściowe aplikacji do pliku i zamapuj plik na stały magazyn poza kontenerem.
$ docker logs test_container> /tmp/output.log
Docker nie akceptuje ścieżek względnych w wierszu poleceń, więc jeśli chcesz użyć innego katalogu, musisz użyć pełnej ścieżki.
źródło
Jeśli pracujesz w systemie Windows i używasz PowerShell (tak jak ja), możesz użyć następującego wiersza, aby przechwycić
stdout
istderr
:Mam nadzieję, że to komuś pomoże!
źródło
foreach ($element in $(docker ps -a --format "{{.Names}}")) {docker logs $element | Out-File "C:/dockerlogs/$element.log"}
Najłatwiejszym sposobem, którego używam, jest to polecenie na terminalu:
struktura to:
źródło
Najpierw sprawdź identyfikator kontenera
Możesz zobaczyć pierwszy wiersz w kolumnach CONTAINER ID. Prawdopodobnie wygląda to tak "3fd0bfce2806", a następnie wpisz go w powłoce
Zobaczysz coś takiego
wtedy możesz zobaczyć to jako
Byłby w formacie JSON, możesz użyć sygnatury czasowej do śledzenia błędów
źródło
Skrypt Bash do kopiowania wszystkich dzienników kontenerów do określonego katalogu:
źródło