2011-03-25 12 views
84

मुझे लगता है कि मेरे Django स्थापना के लिए "डिफ़ॉल्ट" लॉगर कैसे सेट अप करें। मैं settings.py में Django 1.3 की नई LOGGING सेटिंग का उपयोग करना चाहता हूं।Django सेटअप डिफ़ॉल्ट लॉगिंग

मैंने Django Logging Doc's example पर देखा है, लेकिन ऐसा लगता है कि वे केवल हैंडलर सेट करते हैं जो विशेष लॉगर्स के लिए लॉगिंग करेंगे। उनके उदाहरण के मामले में वे 'django', 'django.request', और 'myproject.custom' नामक लॉगर्स के लिए हैंडलर सेट करते हैं।

मैं बस एक डिफ़ॉल्ट logging.handlers.RotatingFileHandler सेटअप करना चाहता हूं जो डिफ़ॉल्ट रूप से सभी लॉगर्स को संभाल लेगा। यानी, अगर मैं अपनी परियोजना में कहीं नया मॉड्यूल बना देता हूं और इसे कुछ इस तरह से दर्शाया गया है: my_app_name.my_new_module, मुझे ऐसा करने में सक्षम होना चाहिए और सभी लॉगिंग को घूर्णन फ़ाइल लॉग मिलना चाहिए।

# In file './my_app_name/my_new_module.py' 
import logging 
logger = logging.getLogger('my_app_name.my_new_module') 
logger.debug('Hello logs!') # <-- This should get logged to my RotatingFileHandler that I setup in `settings.py`! 

उत्तर

132

यह पता चल ...

आप रिक्त स्ट्रिंग के साथ यह हवाला 'सभी को पकड़ने' लकड़हारा सेट: ''

उदाहरण के तौर पर, निम्नलिखित सेटअप में मेरे पास logs/mylog.log पर सहेजे जाने वाले सभी लॉग ईवेंट django.request लॉग इवेंट के अपवाद के साथ logs/django_request.log पर सहेजे जाएंगे। क्योंकि 'propagate'False पर django.request लॉगर के लिए सेट है, लॉग इवेंट कभी भी 'सभी को पकड़ें' लॉगर तक नहीं पहुंच पाएगा।

LOGGING = { 
    'version': 1, 
    'disable_existing_loggers': True, 
    'formatters': { 
     'standard': { 
      'format': '%(asctime)s [%(levelname)s] %(name)s: %(message)s' 
     }, 
    }, 
    'handlers': { 
     'default': { 
      'level':'DEBUG', 
      'class':'logging.handlers.RotatingFileHandler', 
      'filename': 'logs/mylog.log', 
      'maxBytes': 1024*1024*5, # 5 MB 
      'backupCount': 5, 
      'formatter':'standard', 
     }, 
     'request_handler': { 
      'level':'DEBUG', 
      'class':'logging.handlers.RotatingFileHandler', 
      'filename': 'logs/django_request.log', 
      'maxBytes': 1024*1024*5, # 5 MB 
      'backupCount': 5, 
      'formatter':'standard', 
     }, 
    }, 
    'loggers': { 
     '': { 
      'handlers': ['default'], 
      'level': 'DEBUG', 
      'propagate': True 
     }, 
     'django.request': { 
      'handlers': ['request_handler'], 
      'level': 'DEBUG', 
      'propagate': False 
     }, 
    } 
} 
+2

क्रिस, इस पर Django डॉक्स भ्रमित नहीं कर रहे हैं:

logging.basicConfig( level = logging.DEBUG, format = '%(name)s %(levelname)s %(message)s', ) 

हम करने के लिए प्रारूप बदल सकते हैं। इसके लिए धन्यवाद। –

+4

छोटे सुधार: टिप्पणी का अर्थ है कि एसक्यूएल लॉगिंग django.request लॉगर से प्रभावित होगी। एसक्यूएल लॉगिंग को पुनर्निर्देशित करने के लिए, आप 'django.db' के लिए लॉगजर परिभाषित करेंगे। Django.request लॉगर 5xx और 4xx HTTP प्रतिक्रियाओं को संभालता है। – rych

+0

@rych धन्यवाद आपका सुधार, यह मुझे कुछ समय बचाया !! – 18bytes

17

के रूप में आप your answer में कहा, क्रिस, एक ही विकल्प एक डिफ़ॉल्ट लकड़हारा परिभाषित करने के लिए उसके प्रमुख के रूप में रिक्त स्ट्रिंग का प्रयोग है।

हालांकि, मुझे लगता है कि इच्छित तरीका लॉगिंग कॉन्फ़िगरेशन शब्दकोश की root कुंजी के तहत एक विशेष लॉगर को परिभाषित करना है। मैं Python documentation में यह पाया:

जड़ - इस रूट लकड़हारा के लिए विन्यास किया जाएगा। कॉन्फ़िगरेशन की प्रसंस्करण किसी भी लॉगर के लिए होगी, सिवाय इसके कि propagate सेटिंग लागू नहीं होगी।

LOGGING = { 
    'version': 1, 
    'disable_existing_loggers': True, 
    'formatters': { 
     'standard': { 
      'format': '%(asctime)s [%(levelname)s] %(name)s: %(message)s' 
     }, 
    }, 
    'handlers': { 
     'default': { 
      'level':'DEBUG', 
      'class':'logging.handlers.RotatingFileHandler', 
      'filename': 'logs/mylog.log', 
      'maxBytes': 1024*1024*5, # 5 MB 
      'backupCount': 5, 
      'formatter':'standard', 
     }, 
     'request_handler': { 
      'level':'DEBUG', 
      'class':'logging.handlers.RotatingFileHandler', 
      'filename': 'logs/django_request.log', 
      'maxBytes': 1024*1024*5, # 5 MB 
      'backupCount': 5, 
      'formatter':'standard', 
     }, 
    }, 
    'root': { 
     'handlers': ['default'], 
     'level': 'DEBUG' 
    }, 
    'loggers': { 
     'django.request': { 
      'handlers': ['request_handler'], 
      'level': 'DEBUG', 
      'propagate': False 
     }, 
    } 
} 

निष्पक्ष बनाने के लिए मैं दो विन्यास के बीच व्यवहार में कोई अंतर नहीं देख सकते हैं:

यहाँ अपने जवाब से विन्यास root कुंजी का उपयोग करने के लिए बदल रहा है। ऐसा प्रतीत होता है कि एक खाली स्ट्रिंग कुंजी के साथ लॉगर को परिभाषित करने से रूट लॉगर संशोधित होगा, क्योंकि logging.getLogger('') रूट लॉगर वापस कर देगा।

'' से अधिक पर एकमात्र कारण यह है कि यह रूट लॉगर को संशोधित करने के बारे में स्पष्ट है। यदि आप उत्सुक थे, '' ओवरराइड करता है यदि आप दोनों को परिभाषित करते हैं, सिर्फ रूट प्रविष्टि को संसाधित किया जाता है।

+0

हाँ, यह सही है, मिस्त्री के लिए खेद है! 'रूट' के बजाए '' 'का उपयोग करते समय कुछ हद तक तार्किक है, फिर भी मुझे 2.6 रूट कॉन्फिग लॉजिक से 2.7 dictCigfig तर्क से अन्य रूट चिकनी संक्रमण की प्रक्रिया में' रूट 'एंट्री को' रूट 'एंट्री को स्थानांतरित करने के लिए थोड़ा असंगत लगता है। –

0
import logging 
logger = logging.getLogger(__name__) 
जोड़ने के बाद

:

format = '"%(levelname)s:%(name)s:%(message)s" ', 

या

format = '%(name)s %(asctime)s %(levelname)s %(message)s', 
संबंधित मुद्दे