पायथन / Django: रनर के तहत कंसोल में लॉग इन करें, अपाचे के तहत फाइल करने के लिए लॉग इन करें


114

printजब मैं अपना Django ऐप चला रहा हूं, तो मैं कंसोल (जैसे ) को ट्रेस संदेश कैसे भेज सकता हूं manage.py runserver, लेकिन क्या मैं अपाचे के तहत ऐप चला रहा हूं, क्या उन संदेशों को लॉग फ़ाइल में भेजा गया है?

मैंने Django लॉगिंग की समीक्षा की और यद्यपि मैं इसके लचीलेपन और उन्नत उपयोगों के लिए कॉन्फ़िगर करने की क्षमता से प्रभावित था, फिर भी मैं अपने सरल उपयोग-मामले को संभालने के तरीके से प्रभावित हूं।


1
सरल समाधान मुख्य सर्वर और विकास के वातावरण के लिए अलग-अलग सेटिंग्स की फाइलें हैं, deploydjango.com/django_project_structure
एलेक्स

जवाबों:


84

Mod_wsgi के तहत चलने पर stderr पर मुद्रित पाठ httpd के त्रुटि लॉग में दिखाई देगा। आप या तो printसीधे उपयोग कर सकते हैं, या loggingइसके बजाय उपयोग कर सकते हैं ।

print >>sys.stderr, 'Goodbye, cruel world!'

2
यह तकनीकी रूप से WSGI के लिए मान्य नहीं है, और अधिक सख्त वातावरण में त्रुटियों को ट्रिगर करेगा।
पॉल मैकमिलन

13
जहां तक ​​WSGI के रूप में 'sys.stderr' के साथ 'प्रिंट' का उपयोग करने में कुछ भी गलत नहीं है और इसे त्रुटियों को ट्रिगर नहीं करना चाहिए।
ग्राहम डम्पल्टन

मैंने sys आयात किया लेकिन यह मेरे लिए काम नहीं करता है।
हैक-आर

17
यह पायथन 3 में काम नहीं करता है यहां एक नज़र है । आपको जरूरत हैprint("Goodbye cruel world!", file=sys.stderr)
इलायची

103

यहाँ एक Django लॉगिंग-आधारित समाधान है। यह वास्तव में जाँच कर रहा है कि आप डेवलपमेंट सर्वर चला रहे हैं या नहीं, बल्कि डिबग सेटिंग का उपयोग करता है, लेकिन अगर आपको इसके लिए जाँच करने का एक बेहतर तरीका मिल जाता है तो इसे अनुकूलित करना आसान होना चाहिए।

LOGGING = {
    'version': 1,
    'formatters': {
        'verbose': {
            'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s'
        },
        'simple': {
            'format': '%(levelname)s %(message)s'
        },
    },
    'handlers': {
        'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
            'formatter': 'simple'
        },
        'file': {
            'level': 'DEBUG',
            'class': 'logging.FileHandler',
            'filename': '/path/to/your/file.log',
            'formatter': 'simple'
        },
    },
    'loggers': {
        'django': {
            'handlers': ['file'],
            'level': 'DEBUG',
            'propagate': True,
        },
    }
}

if DEBUG:
    # make all loggers use the console.
    for logger in LOGGING['loggers']:
        LOGGING['loggers'][logger]['handlers'] = ['console']

देख https://docs.djangoproject.com/en/dev/topics/logging/ जानकारी के लिए।


8
यह भी कोशिश करेंLOGGING['loggers'][logger]['handlers'] += ['console']
नीर लेवी

@ m01: सेटिंग में इसे कॉन्फ़िगर करने के बाद, यह कैसे मुद्रण उद्देश्य के लिए उपयोग करें? धन्यवाद
Niks जैन

मैंने अपने उत्तर से कोड settings.pyको नीचे की ओर रखा, और सेट DEBUG = True(उसी फ़ाइल में शीर्ष के पास उस सेटिंग को देखें)। फिर, मैं python manage.py runserverएक टर्मिनल से चलता हूं (विवरण के लिए django डॉक्स देखें), और लॉग संदेश टर्मिनल विंडो में दिखाई देंगे। उत्पादन में, मैं एक अलग सेटिंग का उपयोग करूँगा, जहां DEBUG = False- लॉग संदेश जाते हैं /path/to/your/file.log
m01

आपके इंडेंटेशन ने मुझे सिरदर्द दिया। इस जानकारी के लिए धन्यवाद, यह काम करता है!
इयान

धन्यवाद! मैंने इंडेंटेशन में कुछ बदलाव किए हैं, मुझे उम्मीद है कि अब यह बेहतर होगा
m01

27

आप अपने में लॉगिंग कॉन्फ़िगर कर सकते हैं settings.py फ़ाइल ।

एक उदाहरण:

if DEBUG:
    # will output to your console
    logging.basicConfig(
        level = logging.DEBUG,
        format = '%(asctime)s %(levelname)s %(message)s',
    )
else:
    # will output to logging file
    logging.basicConfig(
        level = logging.DEBUG,
        format = '%(asctime)s %(levelname)s %(message)s',
        filename = '/my_log_file.log',
        filemode = 'a'
    )

हालाँकि यह DEBUG की स्थापना पर निर्भर है, और शायद आप इस बारे में चिंता नहीं करना चाहते हैं कि यह कैसे सेट किया गया है। यह उत्तर देखें कि मैं कैसे बता सकता हूं कि मेरा Django एप्लिकेशन डेवलपमेंट सर्वर पर चल रहा है या नहीं? उस सशर्त लिखने के बेहतर तरीके के लिए। संपादित करें: ऊपर का उदाहरण एक Django 1.1 परियोजना से है, Django में लॉगिंग कॉन्फ़िगरेशन उस संस्करण के बाद से कुछ हद तक बदल गया है।


मैं DEBUG पर भरोसा नहीं करना चाहता; मैं उस अन्य पोस्ट में जुड़े डेव-सर्वर डिटेक्शन तंत्र पर निर्भर करता हूं। लेकिन अन्य पोस्ट का पता लगाने का तंत्र एक अनुरोध उदाहरण तक पहुंच पर निर्भर करता है। मैं सेटिंग्स में एक उदाहरण कैसे प्राप्त कर सकता हूँ?
जस्टिन ग्रांट

4

मैं इसका उपयोग करता हूं:

logging.conf:

[loggers]
keys=root,applog
[handlers]
keys=rotateFileHandler,rotateConsoleHandler

[formatters]
keys=applog_format,console_format

[formatter_applog_format]
format=%(asctime)s-[%(levelname)-8s]:%(message)s

[formatter_console_format]
format=%(asctime)s-%(filename)s%(lineno)d[%(levelname)s]:%(message)s

[logger_root]
level=DEBUG
handlers=rotateFileHandler,rotateConsoleHandler

[logger_applog]
level=DEBUG
handlers=rotateFileHandler
qualname=simple_example

[handler_rotateFileHandler]
class=handlers.RotatingFileHandler
level=DEBUG
formatter=applog_format
args=('applog.log', 'a', 10000, 9)

[handler_rotateConsoleHandler]
class=StreamHandler
level=DEBUG
formatter=console_format
args=(sys.stdout,)

testapp.py:

import logging
import logging.config

def main():
    logging.config.fileConfig('logging.conf')
    logger = logging.getLogger('applog')

    logger.debug('debug message')
    logger.info('info message')
    logger.warn('warn message')
    logger.error('error message')
    logger.critical('critical message')
    #logging.shutdown()

if __name__ == '__main__':
    main()

0

आप इसे बहुत आसानी से कर सकते हैं tagalog (https://github.com/dorkitude/tagalog) के

उदाहरण के लिए, जबकि मानक पायथन मॉड्यूल एपेंड मोड में खोली गई फ़ाइल ऑब्जेक्ट को लिखता है, ऐप इंजन मॉड्यूल (https://github.com/dorkitude/tagalog/blob/master/tagalog_appengine.py) इस व्यवहार से आगे निकल जाता है और इसके बजाय इसका उपयोग करता है logging.INFO

एक App इंजन परियोजना में इस व्यवहार को प्राप्त करने के लिए, कोई बस कर सकता है:

import tagalog.tagalog_appengine as tagalog
tagalog.log('whatever message', ['whatever','tags'])

आप स्वयं मॉड्यूल का विस्तार कर सकते हैं और बहुत कठिनाई के बिना लॉग फ़ंक्शन को अधिलेखित कर सकते हैं।


0

यह मेरे लोकल थ्री डी में काफी अच्छा काम करता है, मुझे नियमित लॉगिंग में गड़बड़ करने से बचाता है:

from .settings import *

LOGGING['handlers']['console'] = {
    'level': 'DEBUG',
    'class': 'logging.StreamHandler',
    'formatter': 'verbose'
}
LOGGING['loggers']['foo.bar'] = {
    'handlers': ['console'],
    'propagate': False,
    'level': 'DEBUG',
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.