2013-02-27 16 views
5

Mam pytanie i nie mogłem znaleźć pomocy nigdzie na stackoverflow lub w sieci.Logowanie do nie blokującej nazwanej potoku?

Mam program (kolejka zadań rozproszonych selera) i mam wiele instancji (pracowników), z których każdy ma plik dziennika (celery_worker1.log, celery_worker2.log).

Ważne błędy są przechowywane w bazie danych, ale lubię je od czasu do czasu uruchamiać, aby upewnić się, że wszystko jest w porządku (poziom jest niższy).

Mój problem: te dzienniki zajmują dużo miejsca na dysku. Co chciałbym zrobić: móc "oglądać" dzienniki (ogon-f) tylko wtedy, gdy ich potrzebuję, bez zajmowania dużej ilości miejsca.

Moje pomysły do ​​tej pory: kłody

  • outputing na standardowe wyjście, a nie do pliku: nie możliwe tutaj, ponieważ mam wielu pracowników outputing do różnych plików, ale chcę ogona je wszystkie na raz (ogon - f celery_worker * .log)
  • za pomocą logrotate: dla mnie jest to rozwiązanie "OK". Nie chcę, żeby to było codzienne zadanie, ale raczej nie umieszczałbym w tym celu minutowego pliku crontab, a więcej, serwer nie jest mój, więc oznaczałoby to trochę pracy po stronie administracyjnej
  • używając nazwanych potoków: to wyglądało dobrze od pierwszego wejrzenia, ale nie wiedziałem, że nazwane potoki (linux FIFO), w których blokowanie. Dlatego też, gdy nie piszę WSZYSTKICH rur w tym samym czasie lub kiedy po prostu opuszczam swój ogon, operacje zapisu z rejestratora są blokowane.

Czy istnieje sposób, aby mieć niezablokowane nazwane potoki, które po prostu rzuciłyby się na standardowe wyjście w stanie tailed, i wyrzuciłyby do/dev/null, gdyby nie?

Czy występują problemy techniczne z takim typem rury? Jeśli są, jakie one są?

Dziękuję za odpowiedzi!

+0

możliwy duplikat [Linux non-blocking fifo (rejestracja na żądanie)] (http://stackoverflow.com/questions/7360473/linux-non-blocking-fifo-on-demand-logging) –

Odpowiedz

1

Każdy dziennik roboczy powinien być na standardowe wyjście, ale należy podłączyć każde standardowe wyjście do narzędzia, które automatycznie buforuje i obraca dzienniki na podstawie rozmiaru lub czasu. multilog i svlogd są tego przykładem. W przypadku tych programów wystarczy ograniczyć "bieżący" plik dziennika.

Masz rację, że logrotate nie jest właściwym rozwiązaniem problemu, który masz.

Nazwane rury nie będą działać tak, jak chcesz. W najlepszym razie twoi autorzy mogą wypełnić swoje rury, a następnie odrzucić kolejne logi, co jest odwrotnością pożądanego zachowania.

+0

Dziękuję @ pilcrow dla Twojej odpowiedzi. Wszystkich 5 pracowników uruchamia się w tle za pomocą pojedynczego polecenia i nie chcę mieć ekranu z zawsze otwartymi zakładkami, więc w jaki sposób mogę je logować do różnych stdoutów? Czy potwierdzasz, że "nie blokujące nazwane potoki przekierowujące do/dev/null, gdy nie są czytane" nie istnieją jako takie? Dzięki –

+0

@noe, dotyczące wspólnego lub oddzielnego stdout ... to zależy. Nie wiemy wystarczająco dużo o ich inwokacji do powiedzenia. W odniesieniu do tak nazwanej semantyki rurowej nieistniejącej, poprawne. – pilcrow

1

Można wypróbować urządzenie pamięci wspólnej man:shm_overview lub może ich kilka. Musisz zorganizować je w postaci buforów kołowych, aby przechowywać ostatnie N kb dziennika, a za każdym razem, gdy przeczytasz je z czytnikiem, wyświetli wszystko na konsoli. Takie podejście jest przyjęte przez kombinację syslog/logread zajętości busybox (patrz logread.c).