Saya menggunakan Permintaan python . Saya perlu men-debug beberapa OAuth
aktivitas, dan untuk itu saya ingin mencatat semua permintaan yang dilakukan. Saya bisa mendapatkan informasi ini dengan ngrep
, tetapi sayangnya tidak mungkin untuk mendapatkan koneksi https (yang diperlukan untuk OAuth
)
Bagaimana cara mengaktifkan pencatatan semua URL (+ parameter) yang Requests
sedang mengakses?
python
logging
python-requests
blueFast
sumber
sumber
Jawaban:
urllib3
Pustaka yang mendasari membuat log semua koneksi dan URL baru denganlogging
modul , tetapi tidakPOST
badan. UntukGET
permintaan ini sudah cukup:yang memberi Anda opsi pencatatan paling panjang; lihat HOWTO logging untuk detail lebih lanjut tentang cara mengkonfigurasi level dan tujuan logging.
Demo singkat:
Bergantung pada versi urllib3 yang tepat, pesan berikut akan dicatat:
INFO
: PengalihanWARN
: Kumpulan koneksi penuh (jika ini terjadi sering-seringlah memperbesar ukuran kumpulan koneksi)WARN
: Gagal mengurai header (header respons dengan format yang tidak valid)WARN
: Mencoba kembali koneksiWARN
: Sertifikat tidak cocok dengan nama host yang diharapkanWARN
: Menerima respons dengan Content-Length dan Transfer-Encoding, saat memproses respons yang dipotongDEBUG
: Koneksi baru (HTTP atau HTTPS)DEBUG
: Koneksi terputusDEBUG
: Detail koneksi: metode, jalur, versi HTTP, kode status, dan panjang responsDEBUG
: Coba lagi kenaikan hitunganIni tidak termasuk header atau badan.
urllib3
menggunakanhttp.client.HTTPConnection
kelas untuk melakukan pekerjaan kasar, tetapi kelas itu tidak mendukung logging, biasanya hanya dapat dikonfigurasi untuk mencetak ke stdout. Namun, Anda dapat menyesuaikannya untuk mengirim semua informasi debug ke logging dengan memasukkanprint
nama alternatif ke dalam modul itu:Panggilan
httpclient_logging_patch()
menyebabkanhttp.client
koneksi mengeluarkan semua informasi debug ke logger standar, dan diambil olehlogging.basicConfig()
:sumber
access_token
di permintaan OAuth. Linkedin mengeluh tentang permintaan yang tidak sah, dan saya ingin memverifikasi apakah perpustakaan yang saya gunakan (rauth
di atasrequests
) mengirim token itu dengan permintaan tersebut. Saya berharap untuk melihatnya sebagai parameter kueri, tetapi mungkin itu ada di header permintaan? Bagaimana cara memaksaurllib3
untuk menampilkan header juga? Dan badan permintaan? Hanya untuk membuatnya sederhana: bagaimana saya bisa melihat permintaan FULL ?httplib
. Saya berharap perpustakaan itu digunakanlogging
sebagai gantinya; keluaran debug ditulis langsung ke stdout daripada membiarkan Anda mengarahkannya ke tujuan log pilihan Anda.Anda perlu mengaktifkan debugging pada
httplib
level (requests
→urllib3
→httplib
).Berikut beberapa fungsi untuk mengaktifkan (
..._on()
dan..._off()
) atau untuk sementara:Penggunaan demo:
Anda akan melihat PERMINTAAN, termasuk KEPALA dan DATA, dan TANGGAPAN dengan KEPALA tetapi tanpa DATA. Satu-satunya hal yang hilang adalah response.body yang belum dicatat.
Sumber
sumber
httplib.HTTPConnection.debuglevel = 1
untuk mendapatkan tajuk - luar biasa! Tapi saya pikir saya mendapatkan hasil yang sama hanya dengan menggunakanlogging.basicConfig(level=logging.DEBUG)
5 baris lainnya. Apakah saya melewatkan sesuatu? Saya kira ini bisa menjadi cara untuk mengatur tingkat logging yang berbeda untuk root vs urllib3, jika diinginkan.httplib.HTTPConnection.debuglevel = 2
akan memungkinkan pencetakan badan POST juga.httplib.HTTPConnection.debuglevel = 1
cukup @ Mandible79$ curl https://raw.githubusercontent.com/python/cpython/master/Lib/http/client.py |grep debuglevel
itu selaludebuglevel > 0
Bagi yang menggunakan python 3+
sumber
stdout
. Contoh masalah di sini: stackoverflow.com/q/58738195/1090360Ketika mencoba membuat sistem logging Python (
import logging
) mengeluarkan pesan log debug tingkat rendah, saya terkejut menemukan yang diberikan:yang
urllib3
sebenarnya hanya menggunakanlogging
sistem Python :requests
tidakhttp.client.HTTPConnection
tidakurllib3
IyaTentu, Anda dapat mengekstrak pesan debug dari
HTTPConnection
dengan menyetel:tetapi keluaran ini hanya dikeluarkan melalui
print
pernyataan. Untuk membuktikan ini, cukup grepclient.py
kode sumber Python 3.7 dan lihat sendiri pernyataan cetaknya (terima kasih @Yohann):Agaknya mengarahkan stdout dalam beberapa cara mungkin berhasil untuk shoe-horn stdout ke dalam sistem logging dan berpotensi menangkap misalnya file log.
Pilih '
urllib3
' logger bukan 'requests.packages.urllib3
'Untuk menangkap
urllib3
informasi debug melalui sistem Python 3logging
, bertentangan dengan banyak saran di internet, dan seperti yang ditunjukkan @MikeSmith, Anda tidak akan beruntung untuk mencegat:sebagai gantinya Anda perlu:
Debugging
urllib3
ke file logBerikut adalah beberapa kode yang mencatat
urllib3
pekerjaan ke file log menggunakanlogging
sistem Python :hasil:
Mengaktifkan pernyataan
HTTPConnection.debuglevel
print ()Jika Anda mengatur
HTTPConnection.debuglevel = 1
Anda akan mendapatkan output pernyataan cetak dari info level rendah berair tambahan:
Ingat output ini menggunakan
print
dan bukanlogging
sistem Python , dan karenanya tidak dapat ditangkap menggunakanlogging
stream tradisional atau penangan file (meskipun dimungkinkan untuk menangkap output ke file dengan mengarahkan stdout) .Gabungkan keduanya - maksimalkan semua kemungkinan logging ke konsol
Untuk memaksimalkan semua kemungkinan logging, Anda harus puas dengan keluaran konsol / stdout dengan ini:
memberikan hasil yang lengkap:
sumber
Saya menggunakan python 3.4, permintaan 2.19.1:
'urllib3' adalah logger untuk mendapatkan sekarang (bukan lagi 'requests.packages.urllib3'). Pencatatan dasar masih akan terjadi tanpa menyetel http.client.HTTPConnection.debuglevel
sumber
Memiliki skrip atau bahkan subsistem aplikasi untuk debugging protokol jaringan, diinginkan untuk melihat apa pasangan permintaan-respons sebenarnya, termasuk URL, header, payloads dan status yang efektif. Dan biasanya tidak praktis untuk melengkapi permintaan individu di semua tempat. Pada saat yang sama ada pertimbangan kinerja yang menyarankan penggunaan tunggal (atau beberapa khusus)
requests.Session
, jadi berikut ini mengasumsikan bahwa saran itu diikuti.requests
mendukung apa yang disebut event hooks (pada 2.23 sebenarnya hanya adaresponse
hook). Ini pada dasarnya adalah pendengar acara, dan acara tersebut dipancarkan sebelum mengembalikan kontrol darirequests.request
. Pada saat ini baik permintaan maupun tanggapan telah ditentukan sepenuhnya, sehingga dapat dicatat.Itu pada dasarnya cara mencatat semua perjalanan bolak-balik HTTP dari sebuah sesi.
Memformat catatan log bolak-balik HTTP
Agar logging di atas bermanfaat, mungkin ada pemformat logging khusus yang memahami
req
danres
ekstra pada catatan logging. Ini bisa terlihat seperti ini:Sekarang jika Anda melakukan beberapa permintaan menggunakan
session
, seperti:Outputnya
stderr
akan terlihat sebagai berikut.Cara GUI
Saat Anda memiliki banyak kueri, memiliki UI sederhana dan cara untuk memfilter catatan akan berguna. Saya akan menunjukkan untuk menggunakan Chronologer untuk itu (saya adalah penulisnya).
Pertama, hook telah ditulis ulang untuk menghasilkan rekaman yang
logging
dapat diserialisasi saat dikirim melalui kabel. Ini bisa terlihat seperti ini:Kedua, konfigurasi logging harus disesuaikan untuk digunakan
logging.handlers.HTTPHandler
(yang dipahami oleh Chronologer).Terakhir, jalankan instance Chronologer. misal menggunakan Docker:
Dan jalankan permintaan lagi:
Pengendali aliran akan menghasilkan:
Sekarang jika Anda membuka http: // localhost: 8080 / (gunakan "logger" untuk nama pengguna dan kata sandi kosong untuk popup auth dasar) dan klik tombol "Open", Anda akan melihat sesuatu seperti:
sumber
Saya menggunakan
logger_config.yaml
file untuk mengkonfigurasi logging saya, dan untuk menampilkan log tersebut, yang harus saya lakukan adalah menambahkan adisable_existing_loggers: False
di akhir file.Pengaturan logging saya agak luas dan membingungkan, jadi saya bahkan tidak tahu cara yang baik untuk menjelaskannya di sini, tetapi jika seseorang juga menggunakan file YAML untuk mengkonfigurasi logging mereka, ini mungkin membantu.
https://docs.python.org/3/howto/logging.html#configuring-logging
sumber