Contoh Simple Log to File untuk django 1.3+

96

Catatan rilis mengatakan:

Django 1.3 menambahkan dukungan tingkat kerangka kerja untuk modul logging Python.

Itu bagus. Saya ingin memanfaatkan itu. Sayangnya dokumentasi tidak menyerahkan semuanya kepada saya di piring perak dalam bentuk kode contoh kerja lengkap yang menunjukkan betapa sederhana dan berharganya ini.

Bagaimana cara menyiapkan fitur baru yang funky ini sehingga saya dapat membumbui kode saya

logging.debug('really awesome stuff dude: %s' % somevar)

dan lihat file "/tmp/application.log" yang terisi

18:31:59 Apr 21 2011 awesome stuff dude: foobar
18:32:00 Apr 21 2011 awesome stuff dude: foobar
18:32:01 Apr 21 2011 awesome stuff dude: foobar

Apa perbedaan antara logging Python default dan 'dukungan tingkat kerangka kerja' ini?

John Mee
sumber

Jawaban:

183

Saya sangat menyukai ini, inilah contoh kerja Anda! Serius ini luar biasa!

Mulailah dengan memasukkan ini ke dalam file settings.py

LOGGING = {
    'version': 1,
    'disable_existing_loggers': True,
    'formatters': {
        'standard': {
            'format' : "[%(asctime)s] %(levelname)s [%(name)s:%(lineno)s] %(message)s",
            'datefmt' : "%d/%b/%Y %H:%M:%S"
        },
    },
    'handlers': {
        'null': {
            'level':'DEBUG',
            'class':'django.utils.log.NullHandler',
        },
        'logfile': {
            'level':'DEBUG',
            'class':'logging.handlers.RotatingFileHandler',
            'filename': SITE_ROOT + "/logfile",
            'maxBytes': 50000,
            'backupCount': 2,
            'formatter': 'standard',
        },
        'console':{
            'level':'INFO',
            'class':'logging.StreamHandler',
            'formatter': 'standard'
        },
    },
    'loggers': {
        'django': {
            'handlers':['console'],
            'propagate': True,
            'level':'WARN',
        },
        'django.db.backends': {
            'handlers': ['console'],
            'level': 'DEBUG',
            'propagate': False,
        },
        'MYAPP': {
            'handlers': ['console', 'logfile'],
            'level': 'DEBUG',
        },
    }
}

Sekarang apa artinya semua ini?

  1. Formaters Saya suka tampil dengan gaya yang sama seperti ./manage.py runserver
  2. Penangan - Saya ingin dua log - file teks debug, dan konsol info. Ini memungkinkan saya untuk benar-benar menggali (jika perlu) dan melihat file teks untuk melihat apa yang terjadi di balik terpal.
  3. Penebang - Di sinilah kami menentukan apa yang ingin kami catat. Secara umum django mendapat WARN dan di atasnya - pengecualian (karena itu menyebar) adalah backend di mana saya suka melihat panggilan SQL karena mereka bisa gila .. Terakhir adalah aplikasi saya, saya memiliki dua penangan dan mendorong semuanya ke sana.

Sekarang bagaimana cara mengaktifkan MYAPP untuk menggunakannya ...

Sesuai dokumentasi, letakkan ini di bagian atas file Anda (views.py) ..

import logging
log = logging.getLogger(__name__)

Kemudian untuk mendapatkan sesuatu lakukan ini.

log.debug("Hey there it works!!")
log.info("Hey there it works!!")
log.warn("Hey there it works!!")
log.error("Hey there it works!!")

Level log dijelaskan di sini dan untuk python murni di sini .

rh0dium.dll
sumber
7
saya mengikuti langkah-langkah di atas. file dibuat tetapi tidak ada yang ditulis padanya. mohon bantuan
Vivek S
12
@InternalServerError Anda perlu mengganti MYAPP dengan nama aplikasi Anda di bagian logger.
Rog
9
Pasti! Ganti 'MYAPP' dengan ''
rh0dium
10
Untuk klarifikasi, apa pun yang Anda panggil dengan logger settings.py, misalnya MYAPPdalam contoh ini, juga telah menjadi parameter dalam panggilan ke logging.getLogger. Oleh karena itu, jika proyek Anda berisi banyak aplikasi mandiri dan Anda ingin mereka menggunakan logger umum yang perlu Anda gunakan logging.getLogger('MYAPP')sebagai gantilogging.getLogger(__name__)
rhunwicks
3
Ini bekerja dengan baik. Harus menggunakan 'class': 'logging.NullHandler' karena 'django.utils.log.NullHandler' tidak lagi valid, tetapi sisanya berfungsi untuk saya di 1.11
JacquelineIO
4

Berdasarkan sebagian pada konfigurasi logging yang disarankan oleh rh0dium dan beberapa penelitian lagi yang saya lakukan sendiri, saya mulai merangkai contoh proyek Django dengan default logging yang bagus - fail-well-django .

Contoh keluaran logfile:

2016-04-05 22:12:32,984 [Thread-1    ] [INFO ] [djangoproject.logger]  This is a manually logged INFO string.
2016-04-05 22:12:32,984 [Thread-1    ] [DEBUG] [djangoproject.logger]  This is a manually logged DEBUG string.
2016-04-05 22:12:32,984 [Thread-1    ] [ERROR] [django.request      ]  Internal Server Error: /
Traceback (most recent call last):
  File "/Users/kermit/.virtualenvs/fail-nicely-django/lib/python3.5/site-packages/django/core/handlers/base.py", line 149, in get_response
    response = self.process_exception_by_middleware(e, request)
  File "/Users/kermit/.virtualenvs/fail-nicely-django/lib/python3.5/site-packages/django/core/handlers/base.py", line 147, in get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/Users/kermit/projekti/git/fail-nicely-django/djangoproject/brokenapp/views.py", line 12, in brokenview
    raise Exception('This is an exception raised in a view.')
Exception: This is an exception raised in a view.

Penggunaan rinci dijelaskan dalam README , tetapi pada dasarnya, Anda menyalin modul logger ke proyek Django Anda dan menambahkan from .logger import LOGGINGdi bagian bawah settings.py Anda .

metakermit
sumber