Log pustaka untuk game (c ++) [ditutup]


15

Saya tahu banyak tentang penebangan perpustakaan tetapi tidak menguji banyak dari mereka. (GoogleLog, Pantheios, dorongan tambahan :: pustaka log ...)

Dalam gim, terutama di gim multipemain dan multithreaded jarak jauh, pencatatan sangat penting untuk debugging, bahkan jika Anda menghapus semua log pada akhirnya.

Katakanlah saya membuat game PC (bukan konsol) yang membutuhkan log (multipemain dan multithreaded dan / atau multiproses) dan saya punya alasan yang bagus untuk mencari perpustakaan untuk logging (seperti, saya tidak punya waktu atau saya tidak percaya pada kemampuan saya untuk menulis satu dengan benar untuk kasus saya).

Dengan asumsi bahwa saya perlu:

  1. kinerja
  2. kemudahan penggunaan (memungkinkan streaming atau memformat atau sesuatu seperti itu)
  3. andal (jangan bocor atau mogok!)
  4. lintas-platform (setidaknya Windows, MacOSX, Linux / Ubuntu)

Apakah logging logging akan Anda rekomendasikan?

Saat ini, saya pikir itu meningkatkan :: log adalah yang paling fleksibel (Anda bahkan dapat login ke jarak jauh!), Tetapi tidak memiliki pembaruan kinerja yang baik : adalah untuk kinerja tinggi, tetapi belum dirilis. Pantheios sering dikutip tetapi saya tidak memiliki poin perbandingan pada kinerja dan penggunaan. Saya telah menggunakan lib saya sendiri untuk waktu yang lama, tetapi saya tahu itu tidak mengelola multithreading sehingga merupakan masalah besar, bahkan jika itu cukup cepat. Google Log sepertinya menarik, saya hanya perlu mengujinya tetapi jika Anda sudah membandingkan lib-lib itu dan yang lainnya, saran Anda mungkin bermanfaat.

Gim seringkali membutuhkan kinerja yang rumit dan sulit untuk di-debug sehingga akan lebih baik untuk mengetahui pencatatan pustaka yang, dalam kasus khusus kami, memiliki keuntungan yang jelas.


3
Salah satu persyaratan yang penting yang tidak Anda sebutkan adalah untuk apa Anda ingin menggunakan log. Persyaratan untuk masuk, katakanlah, pesan debug, metrik untuk desainer, keadaan karakter untuk dukungan pelanggan, dan transaksi kartu kredit, berbeda. Secara umum Anda menukar kinerja, kemudahan penggunaan untuk programmer, kemudahan / kecepatan penguraian offline, dan daya tahan tergantung pada situasi.

Itu benar, tetapi saya berasumsi bahwa solusi logging "lengkap" akan memungkinkan pengguna untuk mengatur berbagai jenis log seperti yang Anda gambarkan. Jika Anda menemukan ketepatan ini penting dalam pertanyaan, harap menjadi tamu saya dan menambahkannya ke pertanyaan.
Klaim

Jawaban:


8

catat dengan menggunakan soket (pembungkus soket apa pun bisa mencukupi) + browser web websocket => alat logging yang paling fleksibel dan tidak mencolok mungkin, akan mendapatkan waktu berjam-jam untuk debugging dan menghindari sakit mata.

  • asyncrhonous (kecepatan karena ia menolak semua pekerjaan di browser)
  • diformat (warna, ukuran dll.)
  • dapat diandalkan (soket ...)
  • lintas platform (browser)

Sekarang, bonusnya:

  • penyaringan dinamis sangat mudah dilakukan (menggunakan javascript regex jika diperlukan)
  • dengan riwayat log, memori dan perbandingan (spec HTML5 pada database "di-browser")
  • Cara mudah untuk membuat grafik dari data apa pun (menggunakan SVG, atau kanvas atau apa pun) seperti memori , fragmentasi memori , dll ...
  • cara mudah untuk membuat beberapa grafik 2D dari data apa pun ( subdivisi kd-tree ? bidang potensial? atau bahkan hanya variasi nilai variabel? dll ...)
  • memungkinkan logging jauh (menggunakan browser komputer lain)
  • menggunakan html5 di penyimpanan browser, Anda dapat menyimpan parameter sesi log (filter log saat ini, dll. dan bahkan catatan pada masing-masing)
  • sangat mudah untuk membuat laporan bug atau menautkan tiket trac hanya dengan satu klik
  • kemampuan untuk memundurkan logging dengan mudah, dengan garis waktu gui

dan banyak lagi tugas di luar pencatatan:

  • memungkinkan info profiler (grafik ...)
  • bahkan dapat berfungsi sebagai konsol (kirim perintah dari browser) atau bahkan dengan GUI cepat menggunakan beberapa HTML atau bahkan flash ui
  • perbedaan gambar di browser (kirim gambar menggunakan soket, dan bandingkan di browser menggunakan kemampuan kanvas gambar piksel)
  • dll ...

(hampir semua hal di atas dapat dilakukan menggunakan soket flash, simpan kemampuan basis data)

Sekarang saya tahu agak lama untuk mengatur hal itu. Tapi itu benar-benar merupakan keuntungan waktu pada proyek yang panjang, dengan situasi debugging yang sulit (seperti dalam game.) Ini adalah hal paling kuat yang saya gunakan sejak para debugger ...

Catatan 1: satu-satunya downside => periksa efek samping ketika men-debug kode jaringan game (berdampak pada ukuran buffer socket, latency, bandwidth, dll ...)

Catatan 2: beberapa broswer dinonaktifkan oleh websocket default karena alasan keamanan, periksa tentang: konfigurasi hal-hal untuk memastikan itu diaktifkan.


1
Perbaiki saya jika saya salah, tetapi ini hanya menunjukkan ke mana harus mengarahkan hasil logging, bukan? Pustaka logging nyata juga akan memungkinkan pemfilteran pada waktu kompilasi (yang penting jika kinerja menjadi masalah), memformat, dan menyediakan sintaks yang mudah digunakan untuk membuat pesan log.
sbi

@ sbi Ini adalah hal global yang aktif atau tidak aktif di sisi aplikasi. "Browser log client" melakukan penyaringan, sintaks, tetapi selalu mendapatkan semua log. Ini radikal, tetapi didasarkan pada pengalaman bahwa selama dev, Anda harus selalu mencatat semuanya sehingga Anda dapat dengan mudah menangkap / mereproduksi bug yang Anda temukan. Jika Anda harus mengoptimalkan, itu sisi browser lagi: Menggunakan soket Anda tidak terikat untuk login menggunakan string, Anda dapat langsung mencatat data biner (Id + floats), yang lebih cepat lebih berani daripada log ... pencocokan ID dengan string sisi browser ...)
Tuan Kuranes

1
Meskipun saya dapat melihat bahwa ini sangat praktis, itu sebenarnya hanya backend logger (apa yang disebut templog sebagai "log sink", IIRC). Kinerja adalah salah satu persyaratan yang tercantum. Saya telah menemukan bahwa saya perlu menambahkan pernyataan log ke sepotong kode saat men-debug-nya, tetapi begitu terserah dan menjalankan bagian kode ini akan terlalu banyak bicara dan menenggelamkan apa pun yang sedang saya kerjakan maka dalam kebisingannya, dan juga akan menelan biaya terlalu banyak kinerja. Jadi saya ingin dapat menaikkan dan menurunkan tingkat log pada seluruh bagian kode dengan mengubah beberapa baris kode. Itulah yang dilakukan lapisan tengah log lib untuk Anda.
sbi

@ sbi: mungkin memerlukan tolok ukur, tetapi ada kemungkinan bahwa pustaka logging terbaik, bahkan pada level logging terendah, masih lebih mahal dari pada log biner yang mencatat semuanya. Bahkan tidak ada satu pun "biner untuk char" Siklus CPU terbuang ... Jadi itu benar-benar lebih banyak fitur DAN lebih banyak kinerja.
Tuan Kuranes

Sebelum kami memutuskan untuk benar-benar menggunakan templog, kami membuat beberapa tes. Jika logging dimatikan untuk tingkat keparahan, asal, atau yang lainnya dari pesan log tertentu, dan jika kompilator dapat mengetahui bahwa tidak ada efek samping dalam mengevaluasi parameter, maka VC memang mampu mengoptimalkan full-blown mencatat pernyataan ke dalam ketiadaan. Dan ketika datang ke kecepatan, Anda tidak akan mengalahkan kode yang tidak ada untuk dieksekusi di tempat pertama.
sbi

8

Ketika datang ke kinerja, saya telah menemukan templog cukup banyak tidak terkalahkan. Itu menggunakan templat ekspresi untuk menunda evaluasi pernyataan logging sampai itu ditetapkan bahwa informasi akan dicatat. Karena Anda juga dapat mematikan sebagian pencatatan (tergantung pada tingkat keparahan, asal, dan audiens yang ditargetkan dari pesan log), beberapa pernyataan pencatatan ini dapat dihilangkan menjadi nol kode oleh kompiler untuk rilis build. (Saya benar-benar melihat ini terjadi dengan VC.)

Tidak banyak yang dilakukan ke perpustakaan baru-baru ini, dan yang lain di SO telah menemukan bagasi kurang dalam beberapa hal, tetapi di sebuah perusahaan saya dulu bekerja untuk kami telah menemukan orang itu cukup responsif, dan salah satu pekerja saya saat itu bahkan sapi mendapat akses komit dan menambahkan beberapa kode ke dalamnya, sehingga Anda mungkin merasa layak mencobanya.

Untuk menghitung kebutuhan Anda:

kinerja

Terbaik yang saya temukan. Terutama kemampuannya untuk mengecualikan pesan log pada waktu kompilasi dan membuat kompiler sepenuhnya menghilangkannya sangat menarik.

kemudahan penggunaan (memungkinkan streaming atau memformat atau sesuatu seperti itu)

Ada pesan kesalahan kompiler mengerikan klasik dari templat-meta hal ketika Anda melakukan sesuatu yang salah, tetapi ketika datang untuk kemudahan penggunaan, ini

TEMPLOG_LOG(my_logger,sev_error,aud_support) << "logged in as " << user_name;

sulit dikalahkan.
Namun, Anda mungkin harus membuat log sink Anda sendiri (di situlah pesan log pergi), karena beberapa yang pra-paket (stderr, file, Windows logging, dll.) Tidak begitu canggih. Karena kinerja menjadi tujuan utama, intrinsik dari semuanya agak rumit (seperti formatters pesan log yang cukup kusut dengan log sink), tapi kami menguasainya (saya ingat melangkah melalui itu dalam debugger membantu dengan itu) dan sekali Memahami itu tidak terlalu sulit untuk menulis format pesan Anda sendiri atau log sink.

andal (jangan bocor atau mogok!)

Kami telah menggunakannya tanpa menemukan masalah parah seperti itu. Hampir tidak ada alokasi memori dinamis di sana, jadi sulit untuk membayangkan itu melakukan sesuatu yang salah. Tentu saja, kami hanya pernah mengujinya di dunia nyata dalam satu produk.

lintas-platform (setidaknya Windows, MacOSX, Linux / Ubuntu)

Ketika kami menggunakannya, kami menggunakannya di Win32, OSX, dan beberapa distribusi Linux yang berbeda, di antaranya Ubuntu.

Adapun multi-threading: Kami belum pernah menggunakan ini, tetapi dari apa yang saya ingat tentang arsitektur lib tampaknya Anda hanya perlu menangani ini di log sink. ICBWT.


Terima kasih, saya tidak tahu yang ini. Sepertinya versi boost :: log yang disederhanakan (dan pemain), setidaknya dalam ide aslinya.
Klaim

@Klaim: Saya tidak berpikir boost memiliki sesuatu untuk ditawarkan ketika saya terakhir melihat ke C ++ logging libraries, jadi saya tidak tahu tentang boost :: log.
sbi

1
@ Jo: Apakah Anda memahami istilah "templat ekspresi" ??
sbi

1
Saya pikir saya lakukan, tetapi sekarang saya telah mengunduh dan mulai membaca kode sumber templog, dan tampaknya C ++ telah mengecoh saya lagi.

1
@ sbi: Bagian dari kebingungan saya adalah pernyataan Anda "melewati sekaligus melalui beberapa lapisan" - Dalam bahasa Inggris sekaligus dapat berarti langsung atau bersama - sama , yang dalam hal ini bertentangan. Saya membacanya sebagai yang pertama, dan Anda (sekarang jelas bagi saya) berarti yang kedua. Terima kasih telah meluangkan waktu untuk menjelaskannya.


0

Anda mungkin tertarik dengan set alat Baical :

  • Pustaka sumber terbuka dan lintas platform (Menang, Linux, x86 / x64) untuk log, jejak & telemetri - P7
  • Sangat cepat (dirancang untuk perangkat yang disematkan) - 3 juta log per detik ke jaringan, 5 juta ke file pada CPU modern. Saya tidak tahu ada pustaka lain untuk pencatatan yang menyediakan kecepatan dan informasi yang begitu detail untuk setiap pesan log.
  • Aman utas
  • Setiap pesan jejak berisi:
    • pesan teks
    • tingkat
    • waktu yang tepat (100ns)
    • file sumber, nama fungsi & baris
    • ID modul dan nama modul
    • ID utas dan nama utas
    • indeks inti prosesor
  • Aplikasi server untuk menerima dan melihat log & telemetri
  • Anda dapat mengumpulkan, menganalisis, mencari, memfilter log dari berbagai sumber secara waktu nyata

Pada 06/2017% s dalam pemformatan string belum didukung.
Romeno
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.