Beberapa waktu yang lalu, saya melihat aplikasi Mono dengan output berwarna, mungkin karena sistem log-nya (karena semua pesan distandarisasi).
Sekarang, Python memiliki logging
modul, yang memungkinkan Anda menentukan banyak opsi untuk menyesuaikan output. Jadi, saya membayangkan sesuatu yang serupa mungkin terjadi dengan Python, tetapi saya tidak bisa mengetahui bagaimana melakukan ini di mana saja.
Apakah ada cara untuk membuat logging
output modul Python berwarna?
Apa yang saya inginkan (misalnya) kesalahan warna merah, pesan debug berwarna biru atau kuning, dan sebagainya.
Tentu saja ini mungkin membutuhkan terminal yang kompatibel (sebagian besar terminal modern); tapi saya bisa mundur ke logging
output asli jika warna tidak didukung.
Adakah ide bagaimana saya bisa mendapatkan hasil berwarna dengan modul logging?
Jawaban:
Saya sudah tahu tentang warna yang keluar, saya menggunakannya dalam bash prompt saya beberapa waktu yang lalu. Bagaimanapun, terima kasih.
Yang saya inginkan adalah mengintegrasikannya dengan modul logging, yang akhirnya saya lakukan setelah beberapa percobaan dan kesalahan.
Inilah yang akhirnya saya dapatkan:
Dan untuk menggunakannya, buat Logger Anda sendiri:
Kalau-kalau ada orang lain yang membutuhkannya.
Hati-hati jika Anda menggunakan lebih dari satu logger atau handler:
ColoredFormatter
mengubah objek rekaman, yang diteruskan lebih jauh ke handler lain atau disebarkan ke logger lain. Jika Anda telah mengkonfigurasi file logger dll. Anda mungkin tidak ingin memiliki warna dalam file log. Untuk menghindari itu, mungkin yang terbaik adalah cukup membuat salinanrecord
dengancopy.copy()
sebelum memanipulasi atribut levelname, atau untuk mereset levelname ke nilai sebelumnya, sebelum mengembalikan string yang diformat (kredit ke Michael dalam komentar).sumber
Formatter
dan menentukan penggunaannya pada aStreamHandler
. Tetapi tidak perlu untuk subkelas logger. Bahkan penggunaan kelas logger menambahkan handler ke setiap logger yang dibuat, yang bukan apa yang biasanya Anda inginkan.ColoredFormatter
. Ini mengubah objek rekaman, yang diteruskan lebih lanjut ke penangan lain atau disebarkan ke penebang lain. Jika Anda telah mengkonfigurasi file logger dll. Anda mungkin tidak ingin memiliki warna dalam file log. Untuk menghindari itu, mungkin yang terbaik, cukup membuat salinanrecord
dengancopy.copy()
sebelum memanipulasi atribut levelname, atau untuk mereset levelname ke nilai sebelumnya, sebelum mengembalikan string yang diformat.Bertahun-tahun lalu saya menulis stream handler berwarna untuk saya gunakan sendiri. Lalu saya menemukan halaman ini dan menemukan kumpulan potongan kode yang orang salin / tempel :-(. Pengalih aliran saya saat ini hanya berfungsi di UNIX (Linux, Mac OS X) tetapi keuntungannya adalah bahwa itu tersedia di PyPI (dan GitHub ) dan itu sangat mudah digunakan. Ini juga memiliki mode sintaks Vim :-). Di masa depan saya mungkin memperpanjang untuk bekerja di Windows.
Untuk menginstal paket:
Untuk mengonfirmasi bahwa itu berfungsi:
Untuk memulai dengan kode Anda sendiri:
Format log default yang ditunjukkan pada contoh di atas berisi tanggal, waktu, nama host, nama logger, PID, level log dan pesan log. Dalam praktiknya seperti ini:
CATATAN: Saat menggunakan Git Bash dengan MinTTY
Git Bash di windows memiliki beberapa kebiasaan yang terdokumentasi: Winpty dan Git Bash
Yang untuk kode melarikan diri ANSI dan untuk penulisan ulang karakter gaya ncurses dan animasi, Anda harus mengawali perintah dengan
winpty
.sumber
AttributeError: 'module' object has no attribute 'install'
saat menggunakancoloredlogs.install()
. Bisakah Anda mengonfirmasinya dengan versi terbaru.logging.basicConfig()
dancoloredlogs.install()
instal stream handler yang masuk ke konsol, jadi tanpa "membatalkan" Anda akan mendapatkan pesan duplikat ...coloredlogs.install
format mana yang akan digunakan, seperti dalamcolorlog
paket.Ini adalah solusi yang bisa digunakan pada platform apa pun. Jika tidak hanya memberi tahu saya dan saya akan memperbaruinya.
Cara kerjanya: pada platform yang mendukung ANSI melarikan diri menggunakannya (non-Windows) dan pada Windows itu menggunakan panggilan API untuk mengubah warna konsol.
Script tidak hack metode logging.StreamHandler.emit dari pustaka standar menambahkan pembungkus untuk itu.
TestColorer.py
Colorer.py
sumber
args[1].msg = color + str(args[1].msg) + '\x1b[0m' # normal
.TestColorer.py
membuatku khawatir.Pembaruan : Karena ini adalah gatal yang sudah lama ingin saya garuk, saya melanjutkan dan menulis perpustakaan untuk orang-orang malas seperti saya yang hanya ingin cara sederhana untuk melakukan sesuatu: zenlog
Colorlog sangat bagus untuk ini. Ini tersedia di PyPI (dan dengan demikian dapat diinstal melalui
pip install colorlog
) dan secara aktif dipelihara .Berikut cuplikan singkat salin dan tempel untuk menyiapkan pencatatan dan mencetak pesan log yang tampak layak:
Keluaran:
sumber
setLevel
benar-benar dibutuhkan?)Solusi cepat dan kotor untuk level log yang telah ditentukan dan tanpa mendefinisikan kelas baru.
sumber
logging.basicConfig(format='%(asctime)s [%(name)s] [%(levelname)s] %(message)s')
Di mana tentu saja yang%(levelnames)s
penting.echo -e "Normal texst \033[1;31mred bold text\033[0m normal text again"
.-e
opsi echo mengartikan "\ 033" sebagai bentuk oktal dari simbol ASCII Escape. Simbol khusus ini membuat beberapa terminal yang kompatibel menafsirkan karakter selanjutnya (m
termasuk karakter ) sebagai perintah khusus. en.wikipedia.org/wiki/ANSI_escape_codeif sys.sdterr.isatty():
. Dalam hal ini jika Anda mengarahkan output ke file, file tidak akan mengandung karakter pelarian ini.Kode 2020, tidak perlu paket tambahan, Python 3
Tentukan kelas
Instantiate logger
Dan gunakan!
Hasil
Skema penuh warna
Untuk windows
Solusi ini berfungsi pada Mac OS, terminal IDE. Sepertinya command prompt window tidak memiliki warna sama sekali secara default. Berikut adalah petunjuk cara mengaktifkannya, yang belum saya coba https://www.howtogeek.com/322432/how-to-customize-your-command-prompts-color-scheme-with-microsofts-colortool/
sumber
←[38;21m2019-11-12 19:29:50,994 - My_app - DEBUG - debug message (test_colored_log.py:43)←[0m ←[38;21m2019-11-12 19:29:50,994 - My_app - INFO - info message (test_colored_log.py:44)←[0m ←[33;21m2019-11-12 19:29:50,994 - My_app - WARNING - warning message (test_colored_log.py:45)←[0m ←[31;21m2019-11-12 19:29:50,994 - My_app - ERROR - error message (test_colored_log.py:46)←[0m ←[31;1m2019-11-12 19:29:50,994 - My_app - CRITICAL - critical message (test_colored_log.py:47)←[0m
Yah, saya kira saya mungkin juga menambahkan variasi logger berwarna saya.
Ini bukan sesuatu yang mewah, tetapi sangat mudah digunakan dan tidak mengubah objek rekaman, sehingga menghindari logging urutan pelarian ANSI ke file log jika file handler digunakan. Itu tidak mempengaruhi pemformatan pesan log.
Jika Anda sudah menggunakan Formatter modul logging , yang harus Anda lakukan untuk mendapatkan nama level berwarna adalah mengganti Penasihat Penasihat Formatter dengan ColoredFormatter. Jika Anda mencatat seluruh aplikasi, Anda hanya perlu melakukan ini untuk pencatat tingkat atas.
warna_log.py
Contoh penggunaan
app.py
sub_module.py
Hasil
Output terminal
konten app.log
Tentu saja Anda bisa mendapatkan semewah yang Anda inginkan dengan memformat terminal dan output file log. Hanya level log yang akan diwarnai.
Saya harap seseorang menemukan ini berguna dan itu tidak terlalu banyak sama. :)
File contoh Python dapat diunduh dari GitHub Gist ini: https://gist.github.com/KurtJacobson/48e750701acec40c7161b5a2f79e6bfd
sumber
return
:colored_record.msg = ('{0}{1}m{2}{3}').format(self.PREFIX, seq, colored_record.getMessage(), self.SUFFIX)
Saya memperbarui contoh dari tag pendukung airmind untuk latar depan dan latar belakang. Cukup gunakan variabel warna $ BLACK - $ WHITE dalam string formatter log Anda. Untuk mengatur latar belakang cukup gunakan $ BG-BLACK - $ BG-WHITE.
Jadi sekarang Anda dapat dengan mudah melakukan hal berikut di file konfigurasi Anda:
sumber
super
hanya berlaku untuk beberapa versi Python kuno, kurasa? Karena jawaban ini dari 2010. Ini bekerja dengan baik untuk saya dengan Python 2.7Anda dapat mengimpor modul colorlog dan menggunakannya
ColoredFormatter
untuk mewarnai pesan log.Contoh
Boilerplate untuk modul utama:
Kode hanya mengaktifkan warna dalam pesan log, jika modul colorlog diinstal dan jika output benar-benar pergi ke terminal. Ini menghindari urutan melarikan diri sedang ditulis ke file ketika output log diarahkan.
Selain itu, skema warna khusus adalah pengaturan yang lebih cocok untuk terminal dengan latar belakang gelap.
Beberapa contoh mencatat panggilan:
Keluaran:
sumber
colorlog.basicConfig
alih-alihlogging.basicConfig
yang memiliki beberapa default yang baikLihatlah solusi berikut. Penangan aliran haruslah yang melakukan pewarnaan, maka Anda memiliki pilihan untuk mewarnai kata-kata alih-alih hanya seluruh baris (dengan Formatter).
http://plumberjack.blogspot.com/2010/12/colorizing-logging-output-in-terminals.html
sumber
Saya memodifikasi contoh asli yang disediakan oleh Sorin dan mensublimasikan StreamHandler menjadi ColorizedConsoleHandler.
Kelemahan dari solusi mereka adalah bahwa ia memodifikasi pesan, dan karena itu memodifikasi pesan yang sebenarnya, setiap penangan lain akan mendapatkan pesan yang dimodifikasi juga.
Ini menghasilkan file log dengan kode warna di dalamnya dalam kasus kami karena kami menggunakan banyak logger.
Kelas di bawah ini hanya berfungsi pada platform yang mendukung ansi, tetapi harus sepele untuk menambahkan kode warna windows ke dalamnya.
sumber
Sekarang ada modul PyPi yang dirilis untuk hasil logging berwarna yang dapat disesuaikan:
https://pypi.python.org/pypi/rainbow_logging_handler/
dan
https://github.com/laysakura/rainbow_logging_handler
Mendukung Windows
Mendukung Django
Warna yang bisa disesuaikan
Karena ini didistribusikan sebagai telur Python, sangat mudah untuk menginstal untuk setiap aplikasi Python.
sumber
Ada banyak tanggapan. Tapi tidak ada yang berbicara tentang dekorator. Jadi ini milikku.
Karena itu jauh lebih sederhana.
Tidak perlu mengimpor apa pun, atau menulis subkelas apa pun:
Ini mengatur kesalahan dalam warna merah, men-debug pesan dengan warna biru, dan sebagainya. Seperti ditanyakan dalam pertanyaan.
Kami bahkan dapat mengadaptasi pembungkus untuk mengambil
color
argumen agar secara dinamis mengatur warna pesan menggunakanlogger.debug("message", color=GREY)
EDIT: Jadi inilah dekorator yang disesuaikan untuk mengatur warna saat runtime:
sumber
Remix kecil lain dari pendekatan airmind yang menjaga semuanya dalam satu kelas:
Untuk menggunakan melampirkan formatter ke handler, sesuatu seperti:
sumber
Alat sederhana namun sangat fleksibel untuk mewarnai teks terminal APA PUN adalah ' colout '.
Dimana teks dalam output 'myprocess' yang cocok dengan grup 1 regex akan diwarnai dengan color1, group 2 dengan color2, dll.
Sebagai contoh:
yaitu grup regex pertama (parens) cocok dengan tanggal awal dalam logfile, grup kedua cocok dengan nama file python, nomor baris dan nama fungsi, dan grup ketiga cocok dengan pesan log yang datang setelah itu. Saya juga menggunakan urutan paralel 'tebal / normal' serta urutan warna. Ini terlihat seperti:
Perhatikan bahwa garis atau bagian dari garis yang tidak cocok dengan regex saya masih bergema, jadi ini bukan seperti 'grep --color' - tidak ada yang disaring dari output.
Jelas ini cukup fleksibel sehingga Anda dapat menggunakannya dengan proses apa pun, tidak hanya mengekor file log. Saya biasanya hanya menyiapkan regex baru dengan cepat setiap kali saya ingin mewarnai sesuatu. Untuk alasan ini, saya lebih suka colout ke alat pewarnaan logfile khusus, karena saya hanya perlu mempelajari satu alat, terlepas dari apa yang saya warnai: logging, output tes, sintaks menyoroti potongan kode di terminal, dll.
Ini juga menghindari sebenarnya membuang kode ANSI di logfile itu sendiri, yang IMHO adalah ide yang buruk, karena itu akan merusak hal-hal seperti menangkap pola di logfile kecuali Anda selalu ingat untuk mencocokkan kode ANSI di regex grep Anda.
sumber
sumber
[9*m
kode untuk warna ANSI "cerah"! PS baris terakhir Anda membuat saya sedikit khawatir karena belum diketahui apakah login di luar definisi fungsi aman dengan Python .Inilah solusi saya:
sumber
Bit yang saya punya masalah adalah menyiapkan formatter dengan benar:
Dan kemudian menggunakan:
sumber
Sementara solusi lain tampaknya baik-baik saja, mereka memiliki beberapa masalah. Beberapa memang mewarnai seluruh garis yang beberapa kali tidak diinginkan dan beberapa menghilangkan konfigurasi yang mungkin Anda miliki bersama. Solusi di bawah ini tidak memengaruhi apa pun kecuali pesan itu sendiri.
Kode
Contoh
Keluaran
Seperti yang Anda lihat, semua yang lain masih akan dikeluarkan dan tetap dalam warna awal mereka. Jika Anda ingin mengubah apa pun selain pesan, Anda cukup meneruskan kode warna
log_format
dalam contoh.sumber
[17:01:36]:WARNING:this should be yellowthis should be yellow
atau satu baris penuh sedang dicetak dua kali?7s:%(message)s
darilog_format
.Saya memiliki dua kiriman untuk ditambahkan, yang satu hanya mewarnai pesan (ColoredFormatter), dan satu lagi mewarnai seluruh baris (ColorizingStreamHandler). Ini juga mencakup lebih banyak kode warna ANSI daripada solusi sebelumnya.
Beberapa konten telah bersumber (dengan modifikasi) dari: Posting di atas, dan http://plumberjack.blogspot.com/2010/12/colorizing-logging-output-in-terminals.html .
Hanya mewarnai pesan:
Mewarnai seluruh baris:
sumber
Hanya menjawab yang sama pada pertanyaan serupa: Python | ubah warna teks dalam shell
Idenya adalah menggunakan perpustakaan clint . Yang memiliki dukungan untuk MAC, Linux dan Windows shells (CLI).
sumber
Ini adalah Enum yang berisi kode warna:
Ini dapat diterapkan pada nama - nama setiap tingkat log. Ketahuilah bahwa ini adalah hack yang mengerikan.
Perhatikan bahwa pemformat log Anda harus menyertakan nama level log
sebagai contoh:
sumber
FriendlyLog adalah alternatif lain. Ini bekerja dengan Python 2 & 3 di Linux, Windows dan MacOS.
sumber
Bagaimana dengan menyoroti juga mencatat argumen pesan dengan warna bergantian, selain pewarnaan menurut tingkat? Baru-baru ini saya menulis kode sederhana untuk itu. Keuntungan lain adalah bahwa panggilan log dibuat dengan pemformatan gaya Python 3. (
"{}"
).Lihat kode dan contoh terbaru di sini: https://github.com/davidohana/colargulog
Contoh kode logging:
Keluaran:
Penerapan:
sumber
Gunakan pyfancy .
Contoh:
sumber
logging
fungsi untuk menggunakan perpustakaan pewarnaan yang terpisah.Hanya solusi lain, dengan warna ZetaSyanthis:
menyebutnya sekali dari
__main__
fungsi Anda . Saya punya sesuatu seperti ini di sana:itu juga memverifikasi bahwa output adalah konsol, jika tidak, tidak ada warna yang digunakan.
sumber
Pemakaian
Logger("File Name").info("This shows green text")
sumber
Solusi berikut ini hanya berfungsi dengan python 3, tetapi bagi saya itu terlihat paling jelas.
Idenya adalah menggunakan pabrik catatan log untuk menambahkan atribut 'berwarna' untuk mencatat objek rekaman dan daripada menggunakan atribut 'berwarna' ini dalam format log.
Anda dapat dengan mudah mengubah contoh ini untuk membuat atribut berwarna lainnya (fe message_c) dan kemudian menggunakan atribut ini untuk mendapatkan teks berwarna (hanya) di tempat yang Anda inginkan.
(Trik praktis yang saya temukan baru-baru ini: Saya memiliki file dengan log debug berwarna dan setiap kali saya ingin sementara meningkatkan level log aplikasi saya, saya hanya
tail -f
file log di terminal yang berbeda dan melihat log debug di layar tanpa mengubah konfigurasi dan memulai kembali aplikasi )sumber
Ini adalah varian Python3 lain dari contoh airmind. Saya ingin beberapa fitur spesifik yang tidak saya lihat dalam contoh lain
Catatan: Saya menggunakan colorama tetapi Anda dapat memodifikasi ini sehingga tidak diperlukan. Juga untuk pengujian saya, saya hanya menjalankan file python sehingga kelas saya ada di modul.
__main__
Anda harus mengubah(): __main__.ColoredFormatter
apa pun modul Anda.logging.yaml
main.py
keluaran:
sumber