Saya menggunakan modul logging Python untuk mencatat beberapa string debug ke file yang bekerja cukup baik. Sekarang sebagai tambahan, saya ingin menggunakan modul ini untuk juga mencetak string ke stdout. Bagaimana saya melakukan ini? Untuk mencatat string saya ke file saya menggunakan kode berikut:
import logging
import logging.handlers
logger = logging.getLogger("")
logger.setLevel(logging.DEBUG)
handler = logging.handlers.RotatingFileHandler(
LOGFILE, maxBytes=(1048576*5), backupCount=7
)
formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
handler.setFormatter(formatter)
logger.addHandler(handler)
lalu panggil fungsi logger seperti
logger.debug("I am written to the file")
Terima kasih atas bantuannya di sini!
StreamHandler
dengansys.stdout
, dan kemudian akan masuk ke itu alih-alih stderr.import sys
terlebih dahulu. Dan benar-benar menginisialisasi pawang, yaituconsoleHandler = logging.StreamHandler(sys.stdout)
rootLogger.setLevel(logging.DEBUG)
jika Anda mencoba melihat info atau men-debug pesanlogging.basicConfig()
dapat mengambil argumen kata kuncihandlers
sejak Python 3.3, yang menyederhanakan banyak pengaturan logging, terutama ketika mengatur beberapa penangan dengan formatter yang sama:Seluruh pengaturan karenanya dapat dilakukan dengan satu panggilan seperti ini:
(Atau dengan
import sys
+StreamHandler(sys.stdout)
per persyaratan pertanyaan asli - standar untuk StreamHandler adalah menulis ke stderr. Lihat atribut LogRecord jika Anda ingin menyesuaikan format log dan menambahkan hal-hal seperti nama file / baris, info utas dll.)Pengaturan di atas hanya perlu dilakukan sekali di dekat bagian awal skrip. Anda bisa menggunakan pencatatan dari semua tempat lain di basis kode nanti seperti ini:
Catatan: Jika tidak berhasil, orang lain mungkin telah menginisialisasi sistem logging secara berbeda. Komentar menyarankan dilakukan
logging.root.handlers = []
sebelum panggilan kebasicConfig()
.sumber
FileHandler
:logging.FileHandler(filename, mode='a', encoding=None, delay=False)
. Ini berarti, bahwa ketika Anda hanya ingin masuk ke folder yang sama, Anda bisa menggunakannyaFileHandler("mylog.log")
. Jika Anda ingin menimpa log setiap kali, atur "w" sebagai argumen kedua.logging.root.handlers = []
sebelum panggilanbasicConfig
, lihat fungsinya - itu menjengkelkan.Menambahkan StreamHandler tanpa argumen masuk ke stderr alih-alih stdout. Jika beberapa proses lain memiliki ketergantungan pada dump stdout (yaitu ketika menulis plugin NRPE), maka pastikan untuk menentukan stdout secara eksplisit atau Anda mungkin mengalami beberapa masalah yang tidak terduga.
Berikut adalah contoh cepat menggunakan kembali nilai yang diasumsikan dan LOGFILE dari pertanyaan:
sumber
Baik dijalankan
basicConfig
denganstream=sys.stdout
sebagai argumen sebelum mengatur penangan lain atau masuk pesan, atau secara manual menambahkanStreamHandler
yang mendorong pesan ke stdout ke logger root (atau logger lain yang Anda inginkan, dalam hal ini).sumber
Setelah menggunakan kode Waterboy berulang-ulang dalam beberapa paket Python, saya akhirnya memasukkannya ke dalam paket Python mandiri yang kecil, yang dapat Anda temukan di sini:
https://github.com/acschaefer/duallog
Kode ini didokumentasikan dengan baik dan mudah digunakan. Cukup unduh
.py
file dan sertakan dalam proyek Anda, atau instal seluruh paket melaluipip install duallog
.sumber
Masuk ke
stdout
danrotating file
dengan berbagai tingkatan dan format:sumber
Berikut ini adalah solusi lengkap yang dibungkus dengan baik berdasarkan jawaban Waterboy dan berbagai sumber lainnya. Ini mendukung logging ke konsol dan file log, memungkinkan untuk pengaturan tingkat log yang berbeda, memberikan output berwarna dan mudah dikonfigurasi (juga tersedia sebagai Gist ):
sumber
Untuk 2.7, coba yang berikut ini:
sumber