2012-06-21 15 views
5

Próbuję dodać zmienną do mojej linii dziennika poprzez mój plik settings.py.Django: Przekaż zmienną do rejestrowania pliku ustawień

Jest to kod w ustawieniach (część rejestrowanie):

LOGGING = { 
    'version': 1, 
    'disable_existing_loggers': False, 
    'handlers': { 
     'mail_admins': { 
         'level': 'CRITICAL', 
         'class': 'django.utils.log.AdminEmailHandler' 
         }, 

     'customhandler':{ 
         'level':'DEBUG', 
         'class':'logging.RotatingFileHandler', 
         'formatter':'custom_format', 
         'filename':LOG_LOCATION 
         }, 
       }, 

    'loggers': { 
     'django.request': { 
         'handlers': ['mail_admins'], 
         'level': 'CRITICAL', 
         'propagate': True, 
          }, 
     'Logger_Custom1': { 
         'handlers':['customhandler'], 
         'level':'DEBUG', 
         'propagate':True 
          }, 
       }, 

    'formatters': { 
     'verbose': { 
      'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s' 
        }, 
     'simple': { 
      'format': '%(levelname)s %(message)s' 
        }, 
     'custom_format':{ 
      'format':'[%(asctime)s %(levelname)s T:%(threadName)s F:%(funcName)s ] %(message)s ' 
         }, 
       } 
} 

Powyższy kod działa poprawnie, ale teraz chciałbym każdą wiadomość dziennika, aby mieć zmienną na końcu. Coś takiego:

MyVariable = "Somelines" 
[%(asctime)s %(levelname)s T:%(threadName)s F:%(funcName)s ] %(message)s 'MyVariable 

Tak mój dziennik będzie mieć zawartość tej zmiennej na końcu każdej linii logowania. Wiem, że możemy to zrobić w funkcji widoku w ten sposób: logging.warning('% before you %','Look','Leap') Ale to będzie wymagać od nas włączenia tej linii wszędzie osobno. Ponadto, gdy musimy dodać lub zmienić nazwę zmiennej, będziemy musieli zmienić tę linię wszędzie w każdym pliku.

Tak więc zastanawiałem się, czy można to zrobić bezpośrednio z pliku settings.py, abyśmy mogli dokonać jednej zmiany i będzie ona dotyczyć wszystkich komunikatów rejestrowania.

Odpowiedz

3

Sam znalazłem rozwiązanie. Nie wiem, czy to dobra praktyka, ale działa.

Wszystko zrobiłem było przypisać zmiennej:

testvar = "MyVariable" 

A następnie dołączyć tę zmienną, jak poniżej:

'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s ' + testvar 

Wyjście będzie miał zmienną w swoim wpisu połączyła się z formatem dziennika . Dziękuję. Proszę dać mi znać, jeśli jest na to więcej sposobów.

+0

I dodaje spację na końcu łańcucha formatowania (tuż po '% (komunikatów) s'), może okazać się pomocne w rzeczywistym kodzie, jak dobrze! W ten sposób pojawi się spacja między komunikatem dziennika Django a twoją niestandardową wiadomością. Pamiętaj też, że działa to tylko tak długo, jak długo 'testvar' jest ciągiem! Możesz uczynić go nieco bardziej wytrzymałym poprzez zawinięcie go za pomocą funkcji string, czyli 'str (testvar)'. – Hannele

+0

Hej, to świetne wskazówki ...... Dzięki ... –

1

Łańcuch formatu dziennika, do którego się odnosisz, zawiera wiele zmiennych, które dostarcza moduł rejestrowania. Pełna lista is here. Zasadniczo przekazuje słownik do ciągu znaków w celu formatowania - i nie można manipulować tą listą. Zamiast tego, powinieneś "zakodować" swoją zmienną bezpośrednio w ciągu formatu, tak jak jest to wartość rzeczywista, lub zapisać wartość wewnątrz zmiennej w pliku ustawień i po prostu ją dołączyć.

'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s and look, custom stuff here!!!' 

Albo ..

custom = 'and look, custom stuff here!!!' 
'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s ' + custom 
Powiązane problemy