Python / Django: çalıştırma sunucusu altında konsola giriş yapın, Apache altında dosyaya giriş yapın


114

printDjango uygulamamı altında çalıştırdığımda (örneğin ) konsola izleme mesajlarını nasıl gönderebilirim manage.py runserver, ancak uygulamayı Apache altında çalıştırdığımda bu mesajların bir günlük dosyasına gönderilmesini sağlayabilir miyim?

Django günlük kaydını inceledim ve gelişmiş kullanımlar için esnekliği ve yapılandırılabilirliğinden etkilenmiş olsam da, basit kullanım durumumu nasıl idare edeceğime hala şaşırıyorum.


1
En basit çözüm, ana sunucu ve geliştirme ortamı için farklı settings.py dosyalarına sahip olmaktır
Alex

Yanıtlar:


84

Stderr'e yazdırılan metin, mod_wsgi altında çalışırken httpd'nin hata günlüğünde görünecektir. Ya printdoğrudan kullanabilir ya da loggingonun yerine kullanabilirsiniz .

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

2
Teknik olarak WSGI geçerli değildir ve daha katı ortamlarda hataları tetikleyecektir.
Paul McMillan

13
WSGI gittiği sürece 'sys.stderr' ile 'print' kullanmakta herhangi bir yanlışlık yoktur ve hataları tetiklememelidir.
Graham Dumpleton

Sys'i içe aktardım ama bu benim için çalışmıyor gibi görünüyor.
Hack-R

17
Bu Python 3'te çalışmıyor buraya bir göz atın . İhtiyacın varprint("Goodbye cruel world!", file=sys.stderr)
kakule

103

İşte Django günlük kaydı tabanlı bir çözüm. Geliştirme sunucusunu gerçekten çalıştırıp çalıştırmadığınızı kontrol etmek yerine DEBUG ayarını kullanır, ancak bunu kontrol etmenin daha iyi bir yolunu bulursanız, uyarlaması kolay olmalıdır.

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']

bkz https://docs.djangoproject.com/en/dev/topics/logging/ detaylar için.


8
ayrıca deneyinLOGGING['loggers'][logger]['handlers'] += ['console']
Nir Levy

@ m01: Bunu settings.py olarak yapılandırdıktan sonra, bunu yazdırma amacıyla nasıl kullanabilirsiniz? Teşekkürler
Niks Jain

Cevabımdan aldığım kodu settings.pyen alta doğru koydum ve ayarladım DEBUG = True(aynı dosyada üst tarafa yakın olan bu ayarı arayın). Ardından, python manage.py runserverbir terminalden çalıştırıyorum (ayrıntılar için django belgelerine bakın) ve günlük mesajları terminal penceresinde görünecek. Üretimde, farklı bir settings.py kullanırdım, nerede DEBUG = False- günlük mesajları gidecek /path/to/your/file.log.
m01

Girintiniz başımı ağrıttı. Bilgi için teşekkürler, işe yarıyor!
ioan

Teşekkürler!
Girintide

27

settings.pyDosyanızda oturum açmayı yapılandırabilirsiniz .

Bir örnek:

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'
    )

Ancak bu, DEBUG ayarına bağlıdır ve belki de nasıl kurulduğu konusunda endişelenmek istemezsiniz. Bu cevap Bkz nasıl Django uygulama geliştirme sunucuda çalışan olup olmadığını söyleyebilir? şartlı yazmanın daha iyi bir yolu için. Düzenleme: Yukarıdaki örnek bir Django 1.1 projesinden alınmıştır, Django'da günlük kaydı yapılandırması bu sürümden bu yana biraz değişmiştir.


DEBUG'a güvenmek istemiyorum; Diğer gönderiyle bağlantılı olan dev-server algılama mekanizmasına güvenmeyi tercih ederim. Ancak diğer gönderinin algılama mekanizması, bir istek örneğine erişime dayanır. Settings.py'de bir istek örneğini nasıl edinebilirim?
Justin Grant

4

Bunu kullanıyorum:

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

Bunu oldukça kolay bir şekilde yapabilirsiniz tagalog(https://github.com/dorkitude/tagalog)

Örneğin, standart python modülü ekleme modunda açılan bir dosya nesnesine yazarken, App Engine modülü (https://github.com/dorkitude/tagalog/blob/master/tagalog_appengine.py) bu davranışı geçersiz kılar ve onun yerine kullanır logging.INFO.

Bu davranışı bir App Engine projesinde elde etmek için aşağıdakileri yapmanız yeterlidir:

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

Modülü kendiniz genişletebilir ve günlük işlevinin üzerine çok fazla zorluk çekmeden yazabilirsiniz.


0

Bu, local.py dosyamda oldukça iyi çalışıyor, beni normal günlük kaydını karıştırmaktan kurtarıyor:

from .settings import *

LOGGING['handlers']['console'] = {
    'level': 'DEBUG',
    'class': 'logging.StreamHandler',
    'formatter': 'verbose'
}
LOGGING['loggers']['foo.bar'] = {
    'handlers': ['console'],
    'propagate': False,
    'level': 'DEBUG',
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.