SORU
21 EKİM 2009, ÇARŞAMBA


Python Django giriş zarif Kur

Henüz Python kurma yolu ile mutlu olduğumu Django ile giriş bulmalıyım. Benim gereksinimleri oldukça basittir:

  • Farklı etkinlikler için farklı oturum işleyicileri, farklı dosyalar için oturum edebilmek istiyorum
  • Benim modüllerde kaydediciler kolay erişim. Modül küçük bir çaba ile logger bulmak mümkün olmalıdır.
  • Komut satırı modülleri için kolay uygulanabilir olmalıdır. Sistemin parçaları tek başına bir komut satırı veya daemon süreçleri vardır. Günlük bu modülleri ile kolayca kullanılabilir olmalıdır.

Benim şimdiki kurulum logging.conf dosyası ve her modülde ben günlüğü Kur. Bu bana doğru gelmiyor.

Senin gibi bir günlük bir kur var mı? Lütfen detay: nasıl Kur yapılandırma (mı kullanmak logging.conf veya daha kod), nerede ve ne zaman başlatmak kereste ve nasıl erişmek için onları modülleri, vb.

CEVAP
27 NİSAN 2011, ÇARŞAMBA


Bu zaten, ama django ^ başı olarak çözülmüş bir cevap olduğunu biliyorum . = 1.3 yeni bir oturum açma ayarı var.

Yeni için eski hareketli buraya yazarım diye düşündüm bu yüzden Otomatik değil.

Ve tabii ki ödeme 24* *biraz daha.

Bu temel conf, django-admin createproject v1 ile varsayılan olarak oluşturulur.3 - harcırah en son django sürümleri ile değişebilir:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'mail_admins': {
            'level': 'ERROR',
            'class': 'django.utils.log.AdminEmailHandler',
        }
    },
    'loggers': {
        'django.request': {
            'handlers': ['mail_admins'],
            'level': 'ERROR',
            'propagate': True,
        }
    }
}

Bu yapı standart üzerine kuruludur aşağıdaki blok dikte Python logging dictConfig,:

  • formatters - ilgili değeri olan her anahtar biçimlendirici bir kimliği bir dict olacak ve her değer bir dict ilgili Biçimlendirici örneği yapılandırmak için nasıl tanımlıyor.
  • filters - ilgili değeri olan her tuşa bir filtre kimliği bir dict olacak ve her değer bir dict ilgili Filtre örneğini yapılandırmak için nasıl tanımlıyor.
  • handlers - ilgili değeri olan her tuşa bir işleyici kimliği bir dict olacak ve her değer bir dict ilgili İşleyicisi örneği yapılandırmak için nasıl tanımlıyor.

ve tuşları:

  • class (zorunlu). Bu işleyici sınıfının tam adı.
  • level (isteğe bağlı). İşleyici seviyesi.
  • formatter (isteğe bağlı). Bu işleyici için biçimlendirici kimliği.
  • filters (isteğe bağlı). Bu işleyici için filtreler kimliklerinin bir listesini.

Ben genelde en azından bunu yapın:

  • bir ekleyin .günlük dosyası
  • uygulamalarım bu günlük yazmak için yapılandırın

Çeviren:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'verbose': {
            'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s'
        },
        'simple': {
            'format': '%(levelname)s %(message)s'
        },
    },
    'filters': {
        'require_debug_false': {
            '()': 'django.utils.log.RequireDebugFalse'
        }
    },
    'handlers': {
        'null': {
            'level':'DEBUG',
            'class':'django.utils.log.NullHandler',
        },
        'console':{
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
            'formatter': 'simple'
        },
        # I always add this handler to facilitate separating loggings
        'log_file':{
            'level': 'DEBUG',
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': os.path.join(VAR_ROOT, 'logs/django.log'),
            'maxBytes': '16777216', # 16megabytes
            'formatter': 'verbose'
        },
        'mail_admins': {
            'level': 'ERROR',
            'filters': ['require_debug_false'],
            'class': 'django.utils.log.AdminEmailHandler',
            'include_html': True,
        }
    },
    'loggers': {
        'django.request': {
            'handlers': ['mail_admins'],
            'level': 'ERROR',
            'propagate': True,
        },
        'apps': { # I keep all my of apps under 'apps' folder, but you can also add them one by one, and this depends on how your virtualenv/paths are set
            'handlers': ['log_file'],
            'level': 'INFO',
            'propagate': True,
        },
    },
    # you can also shortcut 'loggers' and just configure logging for EVERYTHING at once
    'root': {
        'handlers': ['console', 'mail_admins'],
        'level': 'INFO'
    },
}

edit

request exceptions are now always logged Ticket #16288 bkz

Varsayılan olarak, e-postalar hata ayıklama Doğru olduğunda gönderilir, böylece yukarıdaki örnek conf açıkça mail_admins için doğru filtre içerecek şekilde güncelledim.

Bir filtre eklemek gerekir:

'filters': {
    'require_debug_false': {
        '()': 'django.utils.log.RequireDebugFalse'
    }
},

ve mail_admins işleyicisi uygulamak:

    'mail_admins': {
        'level': 'ERROR',
        'filters': ['require_debug_false'],
        'class': 'django.utils.log.AdminEmailHandler',
        'include_html': True,
    }

Aksi takdirde django.core.handers.base.handle_uncaught_exception hataları geçmesi değil 'django.request' ayarları logger.Hata AYIKLAMA Doğrudur.

Eğer Django 1.5 bunu sen bile göreceksin

DeprecationWarning: filtre yok 'mail_admins' işleyicisi günlüğü: örtülü debug-yanlış-sadece filtre . ekleme tanımladınız

ama her şey hala doğru HEM django django 1.4 ve 1.5 çalışacak.

* * * * . sonunda Düzenle

Bu conf şiddetle django doktor örnek conf esinlenerek, ama günlük kısmı dosya ekleme.

Ben genellikle aşağıdakileri de yapın:

LOG_LEVEL = 'DEBUG' if DEBUG else 'INFO'

...
    'level': LOG_LEVEL
...

Python kodunu kullanarak, ben her zaman günlük conf olursa olsun tanımlanır diye bir NullHandler ekleyin. Bu İşleyici belirtilen uyarıları kaçının. Özellikle ille Django sadece çağrılan libs için yararlı (ref)

import logging
# Get an instance of a logger
logger = logging.getLogger(__name__)
class NullHandler(logging.Handler): #exists in python 3.1
    def emit(self, record):
        pass
nullhandler = logger.addHandler(NullHandler())

# here you can also add some local logger should you want: to stdout with streamhandler, or to a local file...

[...]

logger.warning('etc.etc.')

Bu yardımcı olur umarım!

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • BradleyWuzHere

    BradleyWuzHe

    25 NİSAN 2011
  • chickenby

    chickenby

    2 HAZİRAN 2008
  • Mary Jane Tauyan

    Mary Jane Ta

    20 AĞUSTOS 2009