Saya menggunakan modul logging Python dan saya ingin menonaktifkan konsol logging untuk beberapa waktu tetapi tidak berhasil.
#!/usr/bin/python
import logging
logger = logging.getLogger() # this gets the root logger
# ... here I add my own handlers
#logger.removeHandler(sys.stdout)
#logger.removeHandler(sys.stderr)
print logger.handlers
# this will print [<logging.StreamHandler instance at ...>]
# but I may have other handlers there that I want to keep
logger.debug("bla bla")
Kode di atas menampilkan bla bla
on stdout dan saya tidak tahu bagaimana cara menonaktifkan konsol handler dengan aman. Bagaimana saya bisa yakin bahwa saya sementara menghapus StreamHandler konsol dan bukan yang lain?
logger.handlers
harus kosong (karena mendahuluilogger.debug()
panggilan). Kode yang dipermasalahkan hanya menampilkan[]
(daftar penangan kosong). Diverifikasi dengan Python 2.7.15 dan Python 3.6.6.Jawaban:
Saya menemukan solusi untuk ini:
Ini akan mencegah logging dari dikirim ke logger atas yang mencakup logging konsol.
sumber
INFO
pesan), Anda dapat mengubah baris kedua menjadi sesuatu sepertilogger.setLevel(logging.WARNING)
logging.lastResort
pawang akan tetap mencatat pesan-pesan dengan tingkat keparahanlogging.WARNING
dan lebih besarsys.stderr
karena tidak adanya penangan lain. Lihat jawaban saya .Saya menggunakan:
sumber
logging
level modul untuk menonaktifkan logging sepenuhnya , misalnyaimport logging; logging.disable(logging.CRITICAL);
:: docs.python.org/2/library/logging.html#logging.disabledisabled
atribut bukan bagian dari API publik. Lihat bugs.python.org/issue36318 .Kamu bisa memakai:
di mana your_level adalah salah satunya:
Jadi, jika Anda mengatur tingkat_Anda ke logging.CRITICAL , Anda hanya akan menerima pesan-pesan penting yang dikirim oleh:
Mengatur tingkat_mu ke logging . Debug akan menunjukkan semua tingkat logging.
Untuk detail lebih lanjut, silakan lihat contoh logging.
Dengan cara yang sama untuk mengubah level untuk setiap Handler gunakan fungsi Handler.setLevel () .
sumber
(pertanyaan lama, tetapi untuk pencari masa depan)
Lebih dekat ke kode / maksud poster asli, ini bekerja untuk saya di bawah python 2.6
Gotcha yang harus saya kerjakan adalah menghapus stdout handler setelah menambahkan yang baru; kode logger muncul untuk secara otomatis menambahkan kembali stdout jika tidak ada penangan yang hadir.
sumber
logger = logging.getLogger(); lhStdout = logger.handlers[0]
salah karena root logger awalnya tidak memiliki penangan -python -c "import logging; assert not logging.getLogger().handlers"
. Diverifikasi dengan Python 2.7.15 dan Python 3.6.6.Manajer konteks
Contoh penggunaan:
sumber
Untuk sepenuhnya menonaktifkan pencatatan :
Untuk mengaktifkan pencatatan :
Jawaban lain memberikan solusi untuk masalah yang tidak sepenuhnya menyelesaikan masalah, seperti
dan, untuk beberapa yang
n
lebih besar dari 50,Masalah dengan solusi pertama adalah hanya berfungsi untuk root logger. Penebang lain yang dibuat menggunakan, katakanlah,
logging.getLogger(__name__)
tidak dinonaktifkan oleh metode ini.Solusi kedua tidak mempengaruhi semua log. Tapi itu membatasi output ke level di atas yang diberikan, jadi orang bisa menimpanya dengan login dengan level lebih besar dari 50.
Itu bisa dicegah dengan
yang sejauh yang saya tahu (setelah meninjau sumber ) adalah satu-satunya cara untuk menonaktifkan logging sepenuhnya.
sumber
Ada beberapa jawaban yang sangat bagus di sini, tetapi tampaknya yang paling sederhana tidak terlalu dipertimbangkan (hanya dari infinito).
Ini menonaktifkan logger root, dan dengan demikian semua logger lainnya. Saya belum benar-benar diuji tetapi harus juga yang tercepat.
Dari kode logging di python 2.7 saya melihat ini
Yang berarti bahwa ketika dinonaktifkan tidak ada penangan yang dipanggil, dan itu harus lebih efisien bahwa penyaringan ke nilai yang sangat tinggi atau menetapkan penangan yang tidak ada op misalnya.
sumber
log = logging.getLogger(__name__)
disabled
atribut bukan bagian dari API publik. Lihat bugs.python.org/issue36318 .Tidak perlu mengalihkan stdout. Ini cara yang lebih baik untuk melakukannya:
Cara yang lebih sederhana adalah:
sumber
logging.basicConfig()
fungsi (penekanan tambang): Apakah konfigurasi dasar untuk sistem logging dengan membuat StreamHandler dengan Formatter default dan menambahkannya ke logger root. Fungsi debug (), info (), warning (), error () dan critical () akan memanggil basicConfig () secara otomatis jika tidak ada penangan yang didefinisikan untuk logger root . - docs.python.org/3/library/logging.html#logging.basicConfigSaya tidak tahu modul logging dengan sangat baik, tetapi saya menggunakannya dengan cara yang biasanya saya ingin menonaktifkan hanya pesan debug (atau info). Kamu bisa memakai
Handler.setLevel()
untuk mengatur level logging ke KRITIS atau lebih tinggi.Anda juga dapat mengganti sys.stderr dan sys.stdout dengan file yang terbuka untuk ditulis. Lihat http://docs.python.org/library/sys.html#sys. stdout . Tapi saya tidak akan merekomendasikan itu.
sumber
[]
.Anda juga bisa:
sumber
app.logger
yang bahkan tidak Anda tentukan alih-alih logger root yang secara eksplisit disebutkan dalam pertanyaan (logging.getLogger()
) dan sebagian besar jawaban? Bagaimana Anda tahu Anda bisa memodifikasihandlers
properti dengan aman alih-alihLogger.addHandler
metode menelepon ?Output konsol:
konten file test.log:
sumber
Dengan mengubah satu level di "logging.config.dictConfig" Anda akan dapat membawa keseluruhan level logging ke level baru.
})
sumber
Menemukan solusi elegan menggunakan dekorator , yang mengatasi masalah berikut: bagaimana jika Anda menulis modul dengan beberapa fungsi, masing-masing dengan beberapa pesan debug, dan Anda ingin menonaktifkan login di semua fungsi tapi yang sedang Anda fokuskan?
Anda dapat melakukannya menggunakan dekorator:
Kemudian, Anda dapat melakukan:
Bahkan jika Anda menelepon
function_already_debugged
dari dalamfunction_being_focused
, debug pesan darifunction_already_debugged
tidak akan ditampilkan. Ini memastikan Anda hanya akan melihat pesan debug dari fungsi yang Anda fokuskan.Semoga ini bisa membantu!
sumber
Jika Anda ingin menonaktifkan logger tertentu sementara di sini adalah apa yang dilakukan.
Contoh Log
Kode
sumber
Di pustaka Logging Python, seseorang dapat sepenuhnya menonaktifkan logging (untuk semua level) untuk logger tertentu dengan melakukan salah satu dari berikut ini:
Menambahkan ke
logging.NullHandler()
penangan pengendali (untuk mencegahlogging.lastResort
penangan dari penebangan peristiwa keparahanlogging.WARNING
dan lebih besar kesys.stderr
) dan mengaturpropagate
atribut pencatat itu untukFalse
(untuk mencegah penebang meneruskan peristiwa ke penangan penebang leluhurnya).Menggunakan API utama:
Menggunakan API konfigurasi:
Menambahkan
lambda record: False
filter ke logger .Menggunakan API utama:
Menggunakan API konfigurasi:
Peringatan.- Bertentangan dengan solusi 1, solusi 2 tidak menonaktifkan logging dari penebang anak (misalnya
logging.getLogger("foo.bar")
), jadi orang harus menggunakannya hanya untuk menonaktifkan logging untuk logger tunggal.Catatan. - Mengatur
disabled
atribut loggerTrue
bukanlah solusi ke-3, karena ini bukan bagian dari API publik. Lihat https://bugs.python.org/issue36318 :sumber
subkelas pawang yang ingin Anda nonaktifkan sementara:
menemukan pawang dengan nama cukup mudah:
pernah ditemukan:
sumber