Saya menggunakan Python logging, dan untuk beberapa alasan, semua pesan saya muncul dua kali.
Saya memiliki modul untuk mengonfigurasi logging:
# BUG: It's outputting logging messages twice - not sure why - it's not the propagate setting.
def configure_logging(self, logging_file):
self.logger = logging.getLogger("my_logger")
self.logger.setLevel(logging.DEBUG)
self.logger.propagate = 0
# Format for our loglines
formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
# Setup console logging
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
ch.setFormatter(formatter)
self.logger.addHandler(ch)
# Setup file logging as well
fh = logging.FileHandler(LOG_FILENAME)
fh.setLevel(logging.DEBUG)
fh.setFormatter(formatter)
self.logger.addHandler(fh)
Nanti, saya memanggil metode ini untuk mengkonfigurasi logging:
if __name__ == '__main__':
tom = Boy()
tom.configure_logging(LOG_FILENAME)
tom.buy_ham()
Dan kemudian katakanlah, modul buy_ham, saya akan menelepon:
self.logger.info('Successfully able to write to %s' % path)
Dan untuk beberapa alasan, semua pesan muncul dua kali. Saya mengomentari salah satu penangan arus, masih hal yang sama. Agak aneh, tidak yakin mengapa ini terjadi ... lol. Dengan asumsi saya melewatkan sesuatu yang jelas.
Cheers, Victor
configure_logging()
tidak dipanggil dua kali (misalnya dari konstruktor juga)? Apakah hanya satu instance Boy () yang dibuat?self.logger.handlers = [ch]
sebagai gantinya akan menyelesaikan masalah ini, meskipun akan lebih baik hanya memastikan bahwa Anda tidak menjalankan kode ini dua kali, misalnya, menggunakanif not self.logger
di awal.Jawaban:
Anda memanggil
configure_logging
dua kali (mungkin dalam__init__
metodeBoy
):getLogger
akan mengembalikan objek yang sama, tetapiaddHandler
tidak memeriksa apakah penangan serupa telah ditambahkan ke logger.Coba lacak panggilan ke metode itu dan hilangkan salah satunya. Atau atur tanda yang
logging_initialized
diinisialisasi keFalse
dalam__init__
metodeBoy
dan ubahconfigure_logging
menjadi tidak melakukan apa pun jikalogging_initialized
adaTrue
, dan setel keTrue
setelah Anda menginisialisasi logger.Jika program Anda membuat beberapa
Boy
contoh, Anda harus mengubah cara Anda melakukan sesuatu denganconfigure_logging
fungsi global menambahkan penangan, danBoy.configure_logging
metode hanya menginisialisasiself.logger
atribut.Cara lain untuk menyelesaikan ini adalah dengan memeriksa atribut penangan dari logger Anda:
sumber
logger
variabel yang digunakan, bukan yang dipakai dari salah satu kelas saya, tetapilogger
variabel yang ada di cache Python3 , dan penangan ditambahkan setiap 60 detik oleh AppScheduler yang saya konfigurasikan. Jadi, iniif not logger.handlers
adalah cara yang cukup cerdas untuk menghindari fenomena semacam ini. Terima kasih atas solusinya, kawan :)!Jika Anda melihat masalah ini dan Anda tidak menambahkan handler dua kali, lihat jawaban abarnert di sini
Dari dokumen :
Jadi, jika Anda menginginkan penangan khusus pada "test", dan Anda tidak ingin pesannya juga masuk ke penangan root, jawabannya sederhana: matikan tanda propagasi:
logger.propagate = Salah
sumber
Pawang ditambahkan setiap kali Anda menelepon dari luar. Coba Lepaskan Handler setelah Anda menyelesaikan pekerjaan Anda:
sumber
logger.handlers.pop()
python 2.7, melakukan trikSaya pemula python, tetapi ini sepertinya berhasil untuk saya (Python 2.7)
sumber
Dalam kasus saya, saya akan mengatur
logger.propagate = False
untuk mencegah pencetakan ganda.Dalam kode di bawah ini jika Anda menghapus
logger.propagate = False
maka Anda akan melihat pencetakan ganda.sumber
logger.propagate = False
adalah solusi untuk mencegah pencatatan ganda dalam aplikasi Flask yang dihosting oleh Pelayan, saat masuk keapp.logger
instance Flask .Panggilan untuk
logging.debug()
memanggillogging.basicConfig()
jika tidak ada penangan root yang diinstal. Itu terjadi pada saya dalam kerangka pengujian di mana saya tidak dapat mengontrol urutan kasus uji yang dijalankan. Kode inisialisasi saya sedang menginstal yang kedua. Defaultnya menggunakan logging.BASIC_FORMAT yang tidak saya inginkan.sumber
Tampaknya jika Anda mengeluarkan sesuatu ke logger (secara tidak sengaja) kemudian mengkonfigurasinya, itu sudah terlambat. Misalnya, dalam kode saya, saya punya
Saya akan mendapatkan sesuatu seperti (mengabaikan opsi format)
dan semuanya ditulis untuk stdout dua kali. Saya percaya ini karena panggilan pertama untuk
logging.warning
membuat penangan baru secara otomatis, dan kemudian saya secara eksplisit menambahkan penangan lain. Masalahnya hilang ketika saya menghapuslogging.warning
panggilan pertama yang tidak disengaja .sumber
Saya mendapatkan situasi yang aneh di mana log konsol digandakan tetapi log file saya tidak. Setelah banyak menggali, saya menemukan jawabannya.
Perlu diketahui bahwa paket pihak ketiga dapat mendaftarkan penebang. Ini adalah sesuatu yang harus diperhatikan (dan dalam beberapa kasus tidak dapat dicegah). Dalam banyak kasus, kode pihak ketiga memeriksa untuk melihat apakah ada penangan root logger yang ada; dan jika tidak ada - mereka mendaftarkan penangan konsol baru.
Solusi saya untuk ini adalah mendaftarkan logger konsol saya di tingkat root:
sumber