Saya belum menemukan cara menyiapkan logging Python dengan Django yang saya sukai. Persyaratan saya cukup sederhana:
- Penangan log yang berbeda untuk acara yang berbeda - yaitu, saya ingin dapat masuk ke file yang berbeda
- Akses mudah ke logger di modul saya. Modul harus dapat menemukan pencatatnya dengan sedikit usaha.
- Harus mudah diterapkan ke modul baris perintah. Bagian dari sistem adalah baris perintah atau proses daemon yang berdiri sendiri. Logging harus dapat digunakan dengan mudah dengan modul ini.
Setup saya saat ini adalah dengan menggunakan logging.conf
file dan setup logging di setiap modul tempat saya login. Rasanya tidak benar.
Apakah Anda memiliki pengaturan logging yang Anda sukai? Harap jelaskan: bagaimana Anda mengatur konfigurasi (apakah Anda menggunakan logging.conf
atau mengaturnya dalam kode), di mana / kapan Anda memulai logger, dan bagaimana Anda mendapatkan akses ke mereka dalam modul Anda, dll.
Jawaban:
Cara terbaik yang saya temukan sejauh ini adalah dengan menginisialisasi pengaturan logging di settings.py - tidak di tempat lain. Anda dapat menggunakan file konfigurasi atau melakukannya secara programatis selangkah demi selangkah - itu tergantung pada kebutuhan Anda. Kuncinya adalah saya biasanya menambahkan handler yang saya inginkan ke root logger, menggunakan level dan terkadang logging. Filter untuk mendapatkan event yang saya inginkan ke file, konsol, syslogs yang sesuai, dll. Anda tentu saja dapat menambahkan handler ke logger lain. juga, tapi biasanya tidak ada kebutuhan untuk ini dalam pengalaman saya.
Di setiap modul, saya mendefinisikan logger menggunakan
dan gunakan itu untuk mencatat peristiwa dalam modul (dan, jika saya ingin membedakan lebih jauh) gunakan logger yang merupakan anak dari logger yang dibuat di atas.
Jika aplikasi saya berpotensi digunakan di situs yang tidak mengonfigurasi logging in settings.py, saya mendefinisikan NullHandler di suatu tempat sebagai berikut:
dan memastikan bahwa sebuah instance ditambahkan ke semua logger yang dibuat dalam modul di aplikasi saya yang menggunakan logging. (Catatan: NullHandler sudah ada dalam paket logging untuk Python 3.1, dan akan menggunakan Python 2.7.) Jadi:
Hal ini dilakukan untuk memastikan bahwa modul Anda berfungsi dengan baik di situs yang tidak mengkonfigurasi logging in settings.py, dan bahwa Anda tidak mendapatkan pesan "Tidak ada penangan yang dapat ditemukan untuk logger XYZ" yang mengganggu (yang merupakan peringatan tentang kemungkinan salah konfigurasi logging).
Melakukannya dengan cara ini memenuhi persyaratan yang Anda nyatakan:
getLogger(__name__)
.settings.py
.Pemutakhiran: Perhatikan bahwa pada versi 1.3, Django sekarang memasukkan dukungan untuk pencatatan .
sumber
foo
untuk menangani peristiwa yang dicatatfoo.bar
. Kembali. utas itu - fileConfig dan dictConfig sekarang memiliki opsi untuk mencegah penonaktifan penebang lama. Lihat masalah ini: bugs.python.org/issue3136 , yang muncul dalam beberapa bulan setelah masalah Anda bugs.python.org/issue2697 - bagaimanapun, ini telah diselesaikan sejak Juni 2008.logger = someutils.getLogger(__name__)
manasomeutils.getLogger
mengembalikan loggerlogging.getLogger
dengan null_handler sudah ditambahkan?NullHandler
tambahan - biasanya hanya logger tingkat atas untuk hierarki paket Anda. Jadi itu akan berlebihan, IMO.Saya tahu ini adalah jawaban yang sudah dipecahkan, tetapi menurut django> = 1.3 ada pengaturan logging baru.
Pindah dari lama ke baru tidak otomatis, jadi saya pikir saya akan menuliskannya di sini.
Dan tentu saja periksa dokumen django untuk lebih banyak lagi.
Ini adalah konfigurasi dasar, dibuat secara default dengan django-admin createproject v1.3 - jarak tempuh mungkin berubah dengan versi django terbaru:
Struktur ini didasarkan pada dictConfig logging Python standar , yang menentukan blok-blok berikut:
formatters
- nilai yang sesuai akan menjadi dict di mana setiap kunci adalah id pemformat dan setiap nilai adalah sebuah dict yang menjelaskan cara mengonfigurasi instance Formatter yang sesuai.filters
- nilai terkait akan menjadi dict di mana setiap kunci adalah id filter dan setiap nilai adalah dict yang menjelaskan cara mengonfigurasi instance Filter yang sesuai.handlers
- nilai terkait akan menjadi dict di mana setiap kunci adalah id penangan dan setiap nilai adalah dikt yang menjelaskan cara mengkonfigurasi instance Handler yang sesuai. Setiap penangan memiliki kunci berikut:class
(wajib). Ini adalah nama kelas penangan yang sepenuhnya memenuhi syarat.level
(pilihan). Level pawang.formatter
(pilihan). ID pemformat untuk penangan ini.filters
(pilihan). Daftar id filter untuk penangan ini.Saya biasanya melakukan setidaknya ini:
Yang diterjemahkan menjadi:
edit
Lihat pengecualian permintaan sekarang selalu dicatat dan Tiket # 16288 :
Saya memperbarui contoh conf di atas untuk secara eksplisit menyertakan filter yang benar untuk mail_admins sehingga, secara default, email tidak dikirim ketika debug adalah True.
Anda harus menambahkan filter:
dan terapkan ke penangan mail_admins:
Jika
django.core.handers.base.handle_uncaught_exception
tidak, kesalahan tidak akan lolos ke pencatat 'django.request' jika pengaturan.DEBUG adalah True.Jika Anda tidak melakukan ini di Django 1.5 Anda akan mendapatkan
tetapi semuanya masih akan bekerja dengan benar KEDUA di django 1.4 dan django 1.5.
** akhiri edit **
Conf itu sangat terinspirasi oleh contoh conf di dokumen django, tetapi menambahkan bagian file log.
Saya sering juga melakukan hal berikut:
Kemudian dalam kode python saya, saya selalu menambahkan NullHandler jika tidak ada konfigurasi logging yang ditentukan sama sekali. Ini menghindari peringatan karena tidak ada Handler yang ditentukan. Terutama berguna untuk lib yang tidak perlu dipanggil hanya di Django ( ref )
[...]
Semoga ini membantu!
sumber
Kami menginisialisasi logging di tingkat atas
urls.py
dengan menggunakanlogging.ini
file.Lokasi
logging.ini
disediakansettings.py
, tapi itu saja.Setiap modul kemudian melakukannya
Untuk membedakan contoh pengujian, pengembangan dan produksi, kami memiliki file logging.ini yang berbeda. Untuk sebagian besar, kami memiliki "log konsol" yang menuju ke stderr hanya dengan Kesalahan. Kami memiliki "log aplikasi" yang menggunakan file log bergulir biasa yang masuk ke direktori log.
sumber
Saat ini saya menggunakan sistem logging, yang saya buat sendiri. Ini menggunakan format CSV untuk logging.
django-csvlog.dll
Proyek ini masih belum memiliki dokumentasi lengkap, tetapi saya sedang mengerjakannya.
sumber