Nie mogę pojąć logging
modułu Pythona . Moje potrzeby są bardzo proste: chcę tylko rejestrować wszystko w syslogu. Po przeczytaniu dokumentacji wymyśliłem prosty skrypt testowy:
import logging
import logging.handlers
my_logger = logging.getLogger('MyLogger')
my_logger.setLevel(logging.DEBUG)
handler = logging.handlers.SysLogHandler()
my_logger.addHandler(handler)
my_logger.debug('this is debug')
my_logger.critical('this is critical')
Ale ten skrypt nie tworzy żadnych rekordów dziennika w syslog. Co jest nie tak?
Odpowiedzi:
Zmień wiersz na ten:
To działa dla mnie
źródło
'/var/run/syslog'
jestlogging.Formatter(fmt='myscriptname[%(process)d]: %(levelname)s: %(message)s', ...)
, takiego jak warunek rsyslog, taki jak$programname == 'myscriptname'
działa.Do rejestrowania należy zawsze używać lokalnego hosta, czy to / dev / log, czy localhost przez stos TCP. Pozwala to w pełni zgodnemu z RFC i funkcjonalnemu demonowi rejestrowania systemu obsługiwać syslog. Eliminuje to potrzebę działania zdalnego demona i zapewnia rozszerzone możliwości demonów syslog, takich jak na przykład rsyslog i syslog-ng. Ta sama filozofia dotyczy SMTP. Po prostu przekaż go do lokalnego oprogramowania SMTP. W tym przypadku użyj „trybu programu”, a nie demona, ale to ten sam pomysł. Niech obsłuży to bardziej wydajne oprogramowanie. Ponowne próby, kolejkowanie, buforowanie lokalne, używanie protokołu TCP zamiast UDP dla syslog i tak dalej stają się możliwe. Możesz także [re-] skonfigurować te demony niezależnie od kodu, tak jak powinno.
Zapisz kod swojej aplikacji, pozwól innym oprogramowaniu wykonać swoją pracę w porozumieniu.
źródło
Znalazłem moduł syslog, który ułatwia uzyskanie podstawowego zachowania logowania, które opisujesz:
Są też inne rzeczy, które możesz zrobić, ale nawet pierwsze dwie linijki tego tekstu zapewnią Ci to, o co prosiłeś, tak jak rozumiem.
źródło
Składając rzeczy tutaj i innych miejsc, oto co wymyśliłem, że działa na unbuntu 12.04 i centOS6
Utwórz plik w,
/etc/rsyslog.d/
który kończy się na .conf i dodaj następujący tekstUruchom ponownie
rsyslog
, ponowne ładowanie NIE działało dla nowych plików dziennika. Może tylko przeładowuje istniejące pliki konfiguracyjne?Następnie możesz użyć tego programu testowego, aby upewnić się, że faktycznie działa.
źródło
sudo service rsyslog restart
Dodaję trochę dodatkowego komentarza na wypadek, gdyby to komuś pomogło, ponieważ uznałem tę wymianę za przydatną, ale potrzebowałem tej trochę dodatkowej informacji, aby wszystko działało.
Aby zalogować się do określonego obiektu za pomocą SysLogHandler, musisz określić wartość obiektu. Powiedz na przykład, że zdefiniowałeś:
local3.* /var/log/mylog
w syslog, będziesz chciał użyć:
handler = logging.handlers.SysLogHandler(address = ('localhost',514), facility=19)
a także musisz mieć syslog nasłuchujący na UDP, aby używać localhost zamiast / dev / log.
źródło
Czy Twój syslog.conf jest skonfigurowany do obsługi obiektu = użytkownik?
Możesz ustawić narzędzie używane przez program rejestrujący Pythona za pomocą argumentu Facility, coś takiego:
źródło
LOG_DAEMON
podajesz jako wartośćfacility
parametru.SysLogHandler.LOG_DAEMON
.powyższy skrypt zaloguje się do narzędzia LOCAL0 z naszym niestandardowym "LOG_IDENTIFIER" ... możesz użyć LOCAL [0-7] do celów lokalnych.
źródło
Od https://github.com/luismartingil/per.scripts/tree/master/python_syslog
źródło
Oto sposób yaml dictConfig zalecany dla wersji 3.2 i nowszych.
W logu
cfg.yml
:Załaduj konfigurację za pomocą:
Skonfigurowano zarówno syslog, jak i plik bezpośredni. Zauważ, że
/dev/log
jest to specyficzne dla systemu operacyjnego.źródło
Naprawiam to na moim notebooku. Usługa rsyslog nie nasłuchiwała usługi gniazda.
Konfiguruję tę linię poniżej w
/etc/rsyslog.conf
pliku i rozwiązałem problem:$SystemLogSocketName /dev/log
źródło
Możesz także dodać moduł obsługi plików lub obrotowy moduł obsługi plików, aby wysyłać dzienniki do pliku lokalnego: http://docs.python.org/2/library/logging.handlers.html
źródło