2013-06-01 10 views
11

Domyślnie mogę włączyć logowanie w pliku settings.py w konfiguracji USTAWIENIA, tworząc program rejestrujący "", który będzie przechwytywał wszystkie. Ale co, jeśli chcę tylko rejestrować logowanie z aplikacji mojego projektu w przeciwieństwie do wewnętrznych elementów Django?Rejestrowanie Django tylko dla moich aplikacji

Potrafię sobie wyobrazić, że logujesz się bezpośrednio do każdego z moich modułów aplikacji Django i nazywasz go według jakiejś konwencji, np. logging.getLogger("myproject." + __file__). Następnie mogę utworzyć program rejestrujący o nazwie "myproject" (w SETTINGS), który pobiera wszystkie te dane wyjściowe. Wolałbym nie zakodować nazwy mojego projektu, więc zrobiłbym pewną logikę os.path na ___file___, aby wyodrębnić pełną przestrzeń nazw do pliku na dowolnej głębokości.

W tym momencie przestaję i zastanawiam się, czy istnieje łatwiejszy sposób?

+1

Czy czytasz dokumenty rejestracyjne (https://docs.djangoproject.com/en/dev/topics/logging/#configuring-logging)? Istnieje program rejestrujący "myproject.custom", który wygląda podobnie do tego, czego szukasz. –

+0

Tak, zrobiłem. Nie widziałem niczego, co uprościłoby to, co opisałem, ale jeśli to zrobi, będzie to świetna odpowiedź. –

+1

Ponownie przeczytałem twoje pytanie po tym, jak opublikowałem swój komentarz i zdałem sobie sprawę, że prawdopodobnie nie oferowałoby to dodatkowego wglądu. Na to przepraszam. –

Odpowiedz

9

Nie jestem pewien, czy w pełni zrozumiałem twoje pytanie, ponieważ odpowiedź wydaje się zbyt prosta.

Zakładając, że określony w LOGGING handlera dla aplikacji swojego projektu, na przykład tak:

'handlers': { 
    'handler_for_my_apps': { 
     'level': 'DEBUG', 
     'class': 'logging.FileHandler', 
     'filename': 'debug.log', 
    }, 

i biorąc pod uwagę aplikacje app1, app2 i tak, można mieć wszystkie dzienniki z tych aplikacji bez żadnego Django wewnętrzne rejestry operacji przez zdefiniowanie rejestratory:

'loggers': { 
    'app1': { 
     'handlers': ['handler_for_my_apps'], 
     'level': 'DEBUG', 
    }, 
    'app2': { 
     'handlers': ['handler_for_my_apps'], 
     'level': 'DEBUG', 
    }, 

Nie będzie kłody Django w tym samym pliku, o ile oczywiście zdefiniowane rejestratora nazwie django z han dler handler_for_my_apps.

W swoich aplikacjach możesz pobrać rejestrator za pomocą logging.getLogger(__name__) zgodnie z zaleceniami docs.

Chyba że źle pytanie ...

6

Można użyć schematu jak poniżej, aby utworzyć identyczne rejestratory dla wszystkich lokalnych aplikacji bez konieczności ręcznego dodać je wszystkie do konfiguracji rejestrowania.

pierwsze, podzielić się lokalne aplikacje:

LOCAL_APPS = [ 
    'myapp1', 
    'myapp2', 
    ... 
] 

THIRD_PARTY_APPS = [ 
    'django. ...', 
    ... 
] 

INSTALLED_APPS = LOCAL_APPS + THIRD_PARTY_APPS 

Następny utworzyć konfigurację rejestratora dla lokalnych aplikacji:

local_logger_conf = { 
    'handlers': ['my_handler',], 
    'level': 'DEBUG', 
} 

Wreszcie zdefiniować rejestratory następująco:

'loggers': { app: copy.deepcopy(local_logger_conf) for app in LOCAL_APPS } 
Powiązane problemy