﷽
→ Rilis Terbaru
→ Catatan Perubahan
→ Sampel
Ringkasan Mengapa perpustakaan lain lagi Sekilas fitur Memulai Unduh Mulai Cepat Instal (Opsional) Menetapkan Argumen Aplikasi Konfigurasi Tingkat Konfigurasikan Menggunakan File Konfigurasi Menggunakan el::Kelas Konfigurasi Menggunakan Konfigurasi Sebaris Konfigurasi Bawaan Konfigurasi Global Penentu Format Pencatatan Penentu Format Tanggal/Waktu Penentu Format Kustom Bendera Pencatatan Argumen Aplikasi Makro Konfigurasi Konfigurasi Membaca Pencatatan Dasar Pencatatan Bersyarat Pencatatan Sesekali printf Suka Mencatat Pencatatan Jaringan Pencatatan Verbose Dasar Bersyarat dan Sesekali Tingkat Verbosa Periksa Apakah Pencatatan Verbose Aktif Modul V Mendaftarkan Logger Baru Batalkan Pendaftaran Logger Mengisi ID Logger yang Ada Berbagi Repositori Logging Fitur Ekstra Pelacakan Kinerja Pelacakan Kinerja Bersyarat Manfaatkan Data Pelacakan Kinerja File Log Berputar Penanganan Kecelakaan Memasang Crash Handler Khusus pelacakan tumpukan Multi-utas PERIKSA Makro Kesalahan pencatatan() Menggunakan Syslog Pencatatan STL Templat yang Didukung Pencatatan Qt Tingkatkan Pencatatan wxWidget Pencatatan Memperluas Perpustakaan Mencatat Kelas Anda Sendiri Mencatat Kelas Pihak Ketiga Membilas dan Menggulung File Log Secara Manual Log Panggilan Balik Pengiriman Panggilan Balik Pendaftaran Logger Pencatatan Asinkron Kelas Pembantu Kontribusi Mengirimkan Patch Melaporkan Bug Kesesuaian Bangun Matriks Lisensi Penafian
Easylogging++ adalah pustaka logging header tunggal yang efisien untuk aplikasi C++. Ini sangat kuat, sangat dapat diperluas, dan dapat dikonfigurasi sesuai kebutuhan pengguna. Ini memberikan kemampuan untuk menulis sink Anda sendiri (melalui fitur yang disebut LogDispatchCallback
). Pustaka ini saat ini digunakan oleh ratusan proyek sumber terbuka di github dan situs manajemen kontrol sumber sumber terbuka lainnya.
Panduan ini untuk Easylogging++ v9.97.1. Untuk versi lain silakan merujuk ke rilis terkait di github.
Anda mungkin juga tertarik dengan server pencatatan residu.
Pergi ke Atas
Jika Anda mengerjakan utilitas kecil atau proyek besar di C++, perpustakaan ini bisa berguna. Ini didasarkan pada header tunggal dan hanya perlu ditautkan ke file sumber tunggal. (Awalnya hanya header dan diubah untuk menggunakan file sumber di edisi #445. Anda masih dapat menggunakan header saja di v9.89).
Perpustakaan ini telah dirancang dengan berbagai pemikiran (yaitu, portabilitas, kinerja, kegunaan, fitur, dan kemudahan pengaturan).
Mengapa perpustakaan lain lagi? Jawabannya cukup mudah, gunakan saat Anda menulisnya sehingga Anda dapat memperbaiki masalah (jika ada) saat Anda melanjutkan atau menyampaikannya di github. Selain itu, saya pribadi belum melihat perpustakaan logging apa pun berdasarkan header tunggal dengan desain yang dapat Anda konfigurasi saat bepergian, memperluasnya sesuai kebutuhan Anda, dan mendapatkan kinerja cepat. Saya telah melihat perpustakaan logging header tunggal lainnya untuk C++ tetapi mereka menggunakan perpustakaan eksternal, misalnya, boost atau Qt untuk mendukung fitur-fitur tertentu seperti threading, ekspresi reguler atau tanggal dll. Perpustakaan ini memiliki segalanya bawaan untuk mencegah penggunaan perpustakaan eksternal, bukannya saya tidak menyukai perpustakaan-perpustakaan itu, sebenarnya saya menyukainya, tetapi karena tidak semua proyek menggunakan perpustakaan-perpustakaan ini, saya tidak dapat mengambil risiko untuk bergantung pada perpustakaan-perpustakaan itu.
Pergi ke Atas
Easylogging++ kaya akan fitur yang berisi banyak fitur yang dibutuhkan oleh pengembang biasa dan tingkat lanjut saat menulis perangkat lunak;
Pergi ke Atas
Unduh versi terbaru dari Rilis Terbaru
Untuk rilis lainnya, silakan kunjungi halaman rilis. Jika aplikasi Anda tidak mendukung C++11, harap pertimbangkan untuk menggunakan v8.91. Ini adalah versi stabil untuk C++98 dan C++03, hanya kekurangan beberapa fitur.
Pergi ke Atas
Untuk memulai Easylogging++, Anda dapat mengikuti tiga langkah mudah:
easylogging++.h
dan easylogging++.cc
)# include " easylogging++.h "
INITIALIZE_EASYLOGGINGPP
int main ( int argc, char * argv[]) {
LOG (INFO) << " My first info log using default logger " ;
return 0 ;
}
Sekarang kompilasi menggunakan
g++ main.cc easylogging++.cc -o prog -std=c++11
Sesederhana itu! Harap dicatat bahwa INITIALIZE_EASYLOGGINGPP
harus digunakan sekali dan hanya sekali jika tidak, Anda akan mendapatkan kesalahan kompilasi. Ini adalah definisi dari beberapa variabel extern
. Artinya, ini hanya dapat ditentukan satu kali per aplikasi. Tempat terbaik untuk meletakkan pernyataan inisialisasi ini adalah di file tempat fungsi int main(int, char**)
didefinisikan, tepat setelah pernyataan penyertaan terakhir.
Jika Anda ingin menginstal header ini di seluruh sistem, Anda dapat melakukannya melalui:
mkdir build
cd build
cmake -Dtest=ON ../
make
make test
make install
Opsi berikut didukung oleh Easylogging++ cmake dan Anda dapat mengaktifkan opsi ini menggunakan -D<option>=ON
lib_utc_datetime
- Mendefinisikan ELPP_UTC_DATETIME
build_static_lib
- Membangun perpustakaan statis untuk Easylogging++ Oleh karena itu, Anda masih memerlukan file easylogging++.cc
untuk dapat dikompilasi. Untuk header saja, silakan periksa v9.89 dan lebih rendah.
Alternatifnya, Anda dapat mengunduh dan menginstal easyloggingpp menggunakan pengelola ketergantungan vcpkg:
git clone https://github.com/Microsoft/vcpkg.git
cd vcpkg
./bootstrap-vcpkg.sh
./vcpkg integrate install
./vcpkg install easyloggingpp
Port easyloggingpp di vcpkg selalu diperbarui oleh anggota tim Microsoft dan kontributor komunitas. Jika versinya sudah kedaluwarsa, silakan buat masalah atau tarik permintaan pada repositori vcpkg.
Pergi ke Atas
Selalu disarankan untuk meneruskan argumen aplikasi ke Easylogging++. Beberapa fitur Easylogging++ mengharuskan Anda untuk mengatur argumen aplikasi, misalnya, verbose logging untuk mengatur level verbose atau vmodules (dijelaskan nanti). Untuk melakukan itu Anda dapat menggunakan makro pembantu atau kelas pembantu;
int main ( int argc, char * argv[]) {
START_EASYLOGGINGPP (argc, argv);
...
}
Pergi ke Atas
Untuk mulai mengonfigurasi perpustakaan logging, Anda harus memahami tingkat keparahan. Easylogging++ sengaja tidak menggunakan logging hierarkis untuk mengontrol sepenuhnya apa yang diaktifkan dan apa yang tidak. Meskipun demikian, masih ada opsi untuk menggunakan logging hierarki menggunakan LoggingFlag::HierarchicalLogging
. Easylogging++ memiliki level berikut (diurutkan berdasarkan level hierarki)
Tingkat | Keterangan |
---|---|
Global | Level generik yang mewakili semua level. Berguna saat mengatur konfigurasi global untuk semua level. |
Jejak | Informasi yang berguna untuk melacak kembali peristiwa tertentu - sebagian besar berguna daripada log debug. |
Men-debug | Peristiwa informasional yang paling berguna bagi pengembang untuk men-debug aplikasi. Hanya berlaku jika NDEBUG tidak ditentukan (untuk non-VC++) atau _DEBUG ditentukan (untuk VC++). |
Fatal | Peristiwa kesalahan yang sangat parah yang mungkin akan menyebabkan aplikasi dibatalkan. |
Kesalahan | Informasi kesalahan tetapi akan melanjutkan aplikasi agar tetap berjalan. |
Peringatan | Informasi yang mewakili kesalahan dalam aplikasi tetapi aplikasi akan tetap berjalan. |
Informasi | Terutama berguna untuk mewakili kemajuan aplikasi saat ini. |
Bertele-tele | Informasi yang bisa sangat berguna dan bervariasi menurut tingkat logging yang panjang. Logging verbose tidak berlaku untuk logging hierarki. |
Tidak dikenal | Hanya berlaku untuk logging hierarki dan digunakan untuk mematikan logging sepenuhnya. |
Pergi ke Atas
Easylogging++ mudah dikonfigurasi. Ada tiga cara yang mungkin untuk melakukannya,
Konfigurasi dapat dilakukan dengan file yang dimuat saat runtime oleh kelas Configurations
. File ini memiliki format berikut;
* LEVEL:
CONFIGURATION NAME = "VALUE" ## Comment
ANOTHER CONFIG NAME = "VALUE"
Nama level dimulai dengan bintang (*) dan diakhiri dengan titik dua (:). Sangat disarankan untuk memulai file konfigurasi Anda dengan level Global
sehingga konfigurasi apa pun yang tidak ditentukan dalam file akan secara otomatis menggunakan konfigurasi dari Global
. Misalnya, jika Anda mengatur Filename
di Global
dan Anda ingin semua level menggunakan nama file yang sama, jangan mengaturnya secara eksplisit untuk setiap level, perpustakaan akan menggunakan nilai konfigurasi dari Global
secara otomatis. Tabel berikut berisi konfigurasi yang didukung oleh file konfigurasi.
Nama Konfigurasi | Jenis | Keterangan |
---|---|---|
Enabled | bodoh | Menentukan apakah level logger yang sesuai diaktifkan atau tidak. Anda dapat menonaktifkan semua log dengan menggunakan el::Level::Global |
To_File | bodoh | Apakah akan menulis log yang sesuai ke file log atau tidak |
To_Standard_Output | bodoh | Apakah akan menulis log ke output standar misalnya terminal atau command prompt |
Format | arang* | Menentukan format/pola logging untuk level dan logger yang sesuai. |
Filename | arang* | Menentukan file log (path lengkap) untuk menulis log untuk level dan logger yang sesuai |
Subsecond_Precision | tidak | Menentukan presisi subdetik (sebelumnya disebut 'lebar milidetik'). Lebar dapat berada dalam jangkauan (1-6) |
Performance_Tracking | bodoh | Menentukan apakah pelacakan kinerja diaktifkan atau tidak. Ini tidak tergantung pada logger atau level. Pelacakan kinerja selalu menggunakan pencatat 'kinerja' kecuali ditentukan |
Max_Log_File_Size | ukuran_t | Jika ukuran file log pada level yang sesuai >= ukuran yang ditentukan, file log akan terpotong. |
Log_Flush_Threshold | ukuran_t | Menentukan jumlah entri log yang akan disimpan hingga kami menghapus data log yang tertunda |
Harap jangan menggunakan tanda kutip ganda di mana pun dalam komentar, Anda mungkin akan mendapatkan perilaku yang tidak terduga.
Contoh File Konfigurasi
* GLOBAL:
FORMAT = "%datetime %msg"
FILENAME = "/tmp/logs/my.log"
ENABLED = true
TO_FILE = true
TO_STANDARD_OUTPUT = true
SUBSECOND_PRECISION = 6
PERFORMANCE_TRACKING = true
MAX_LOG_FILE_SIZE = 2097152 ## 2MB - Comment starts with two hashes (##)
LOG_FLUSH_THRESHOLD = 100 ## Flush after every 100 logs
* DEBUG:
FORMAT = "%datetime{%d/%M} %func %msg"
Isi file konfigurasi dalam contoh di atas sangatlah mudah. Kita mulai dengan level GLOBAL
untuk mengesampingkan semua level. Level selanjutnya yang ditentukan secara eksplisit akan menggantikan konfigurasi dari GLOBAL
. Misalnya, semua level kecuali DEBUG
memiliki format yang sama, yaitu tanggal waktu dan pesan log. Untuk level DEBUG
, kami hanya memiliki tanggal (dengan hari dan bulan), fungsi sumber dan pesan log. Konfigurasi lainnya untuk DEBUG
digunakan dari GLOBAL
. Perhatikan juga {%d/%M}
dalam format DEBUG
di atas, jika Anda tidak menentukan format tanggal, format default akan digunakan. Nilai default tanggal/waktu adalah %d/%M/%Y %h:%m:%s,%g
Untuk informasi lebih lanjut tentang penentu format ini, lihat bagian Penentu Format Tanggal/Waktu di bawah
# include " easylogging++.h "
INITIALIZE_EASYLOGGINGPP
int main ( int argc, const char ** argv) {
// Load configuration from file
el::Configurations conf ( " /path/to/my-conf.conf " );
// Reconfigure single logger
el::Loggers::reconfigureLogger ( " default " , conf);
// Actually reconfigure all loggers instead
el::Loggers::reconfigureAllLoggers (conf);
// Now all the loggers will use configuration from file
}
File konfigurasi Anda dapat dikonversi ke objek
el::Configurations
(menggunakan konstruktor) yang dapat digunakan kapan pun diperlukan (seperti pada contoh di atas).
Pergi ke Atas
Anda dapat mengatur konfigurasi atau mengatur ulang konfigurasi;
# include " easylogging++.h "
INITIALIZE_EASYLOGGINGPP
int main ( int argc, const char ** argv) {
el::Configurations defaultConf;
defaultConf. setToDefault ();
// Values are always std::string
defaultConf. set (el::Level::Info,
el::ConfigurationType::Format, " %datetime %level %msg " );
// default logger uses default configurations
el::Loggers::reconfigureLogger ( " default " , defaultConf);
LOG (INFO) << " Log using default file " ;
// To set GLOBAL configurations you may use
defaultConf. setGlobally (
el::ConfigurationType::Format, " %date %msg " );
el::Loggers::reconfigureLogger ( " default " , defaultConf);
return 0 ;
}
Konfigurasi hanya perlu diatur satu kali. Jika Anda puas dengan konfigurasi default, Anda dapat menggunakannya juga.
Pergi ke Atas
Konfigurasi inline berarti Anda dapat mengatur konfigurasi di std::string
tetapi pastikan Anda menambahkan semua karakter baris baru, dll. Ini tidak disarankan karena selalu berantakan.
el::Configurations c;
c.setToDefault();
c.parseFromText( " *GLOBAL: n FORMAT = %level %msg " );
Kode di atas hanya menyetel objek Konfigurasi, Anda masih perlu mengkonfigurasi ulang logger menggunakan konfigurasi ini.
Pergi ke Atas
Jika Anda ingin memiliki konfigurasi untuk logger yang ada dan yang akan datang, Anda dapat menggunakan el::Loggers::setDefaultConfigurations(el::Configurations& configurations, bool configureExistingLoggers = false)
. Ini berguna ketika Anda bekerja dalam skala yang cukup besar, atau menggunakan perpustakaan pihak ketiga yang sudah menggunakan Easylogging++. Setiap logger yang baru dibuat akan menggunakan konfigurasi default. Jika Anda juga ingin mengonfigurasi logger yang ada, Anda dapat menyetel argumen kedua ke true
(defaultnya adalah false
).
Pergi ke Atas
Level::Global
tidak ada hubungannya dengan konfigurasi global, ini adalah konsep di mana Anda dapat mendaftarkan konfigurasi untuk semua/atau beberapa logger dan bahkan mendaftarkan logger baru menggunakan file konfigurasi. Sintaks file konfigurasi adalah:
-- LOGGER ID ## Case sensitive
## Everything else is same as configuration file
-- ANOTHER LOGGER ID
## Configuration for this logger
ID Logger dimulai dengan dua tanda hubung. Setelah Anda menulis file konfigurasi global, Anda dapat mengonfigurasi semua logger Anda (dan mendaftarkan yang baru) menggunakan satu fungsi;
int main ( void ) {
// Registers new and configures it or
// configures existing logger - everything in global.conf
el::Loggers::configureFromGlobal ( " global.conf " );
// .. Your prog
return 0 ;
}
Harap diperhatikan, tidak mungkin mendaftarkan logger baru menggunakan konfigurasi global tanpa menentukan konfigurasinya. Anda harus menentukan setidaknya satu konfigurasi. Cara lain untuk mendaftarkan logger dibahas di bagian Logging di bawah.
Pergi ke Atas
Anda dapat menyesuaikan format logging menggunakan penentu berikut:
Penentu | Digantikan Oleh |
---|---|
%logger | ID Pencatat |
%thread | ID Thread - Menggunakan std::thread jika tersedia, jika tidak, GetCurrentThreadId() di windows |
%thread_name | Gunakan Helpers::setThreadName untuk menetapkan nama thread saat ini (tempat Anda menjalankan setThreadName ). Lihat contoh Nama Thread |
%level | Tingkat keparahan (Info, Debug, Kesalahan, Peringatan, Fatal, Verbose, Jejak) |
%levshort | Tingkat keparahan (Versi singkat yaitu I untuk Info dan masing-masing D, E, W, F, V, T) |
%vlevel | Tingkat verbositas (Berlaku untuk logging verbose) |
%datetime | Tanggal dan/atau waktu - Pola dapat disesuaikan - lihat Penentu Format Tanggal/Waktu di bawah |
%user | Pengguna sedang menjalankan aplikasi |
%host | Aplikasi nama komputer sedang berjalan |
%file * | Nama file dari file sumber (Jalur lengkap) - Fitur ini bergantung pada ketersediaan makro kompiler __FILE__ |
%fbase * | Nama file dari file sumber (Hanya nama dasar) |
%line * | Nomor baris sumber - Fitur ini bergantung pada ketersediaan __LINE__ makro kompilasi |
%func * | Fungsi pencatatan |
%loc * | Nama file sumber dan nomor baris logging (dipisahkan dengan titik dua) |
%msg | Pesan log aktual |
% | Karakter escape (misalnya, %%level akan menulis %level) |
__LINE__
, __FILE__
dll Pergi ke Atas
Anda dapat menyesuaikan format tanggal/waktu menggunakan penentu berikut
Penentu | Digantikan Oleh |
---|---|
%d | Hari dalam sebulan (dengan bantalan nol) |
%a | Hari dalam seminggu - pendek (Senin, Selasa, Rabu, Kamis, Jumat, Sabtu, Minggu) |
%A | Hari dalam seminggu - panjang (Senin, Selasa, Rabu, Kamis, Jumat, Sabtu, Minggu) |
%M | Bulan (dengan bantalan nol) |
%b | Bulan - pendek (Jan, Feb, Mar, Apr, Mei, Jun, Jul, Agustus, Sep, Okt, Nov, Des) |
%B | Bulan - Panjang (Januari, Februari, Maret, April, Mei, Juni, Juli, Agustus, September, Oktober, November, Desember) |
%y | Tahun - Dua digit (13, 14 dst) |
%Y | Tahun - Empat digit (2013, 2014 dst) |
%h | Jam (format 12 jam) |
%H | Jam (format 24 jam) |
%m | Menit (dengan bantalan nol) |
%s | Kedua (dengan bantalan nol) |
%g | Bagian subdetik (presisi dikonfigurasikan oleh ConfigurationType::SubsecondPrecision) |
%F | Penunjukan AM/PM |
% | Karakter melarikan diri |
Harap diperhatikan, tanggal/waktu dibatasi maksimal 30
karakter.
Pergi ke Atas
Anda juga dapat menentukan penentu format Anda sendiri. Untuk melakukan itu, Anda dapat menggunakan el::Helpers::installCustomFormatSpecifier
. Contoh sempurna adalah %ip_addr
untuk aplikasi server TCP;
const char * getIp ( const el::LogMessage*) {
return " 192.168.1.1 " ;
}
int main ( void ) {
el::Helpers::installCustomFormatSpecifier ( el::CustomFormatSpecifier ( " %ip_addr " , getIp));
el::Loggers::reconfigureAllLoggers (el::ConfigurationType::Format, " %datetime %level %ip_addr : %msg " );
LOG (INFO) << " This is request from client " ;
return 0 ;
}
Pergi ke Atas
Dari beberapa bagian logging, Anda dapat mengatur tanda logging; berikut adalah tanda yang didukung:
Bendera | Keterangan |
---|---|
NewLineForContainer (1) | Pastikan kita memiliki baris baru untuk setiap entri log kontainer |
AllowVerboseIfModuleNotSpecified (2) | Pastikan jika -vmodule digunakan dan tidak menentukan modul, maka logging verbose diperbolehkan melalui modul tersebut. Katakanlah param adalah -vmodule=main*=3 dan log verbose sedang ditulis dari file bernama Something.cpp maka jika tanda ini diaktifkan, log akan ditulis jika tidak maka akan tidak diizinkan. Catatan: ini akan mengalahkan tujuan -vmodule |
LogDetailedCrashReason (4) | Saat menangani kerusakan secara default, alasan kerusakan yang terperinci juga akan dicatat (Dinonaktifkan secara default) (masalah #90) |
DisableApplicationAbortOnFatalLog (8) | Memungkinkan untuk menonaktifkan aplikasi aborsi ketika login menggunakan level FATAL. Perhatikan bahwa ini tidak berlaku untuk penangan kerusakan default karena aplikasi harus dibatalkan setelah sinyal kerusakan ditangani. (Tidak ditambahkan secara default) (masalah #119) |
ImmediateFlush (16) | Menghapus log dengan setiap entri log (sensitif terhadap kinerja) - Dinonaktifkan secara default |
StrictLogFileSizeCheck (32) | Pastikan ukuran file log diperiksa pada setiap log |
ColoredTerminalOutput (64) | Output terminal akan berwarna jika didukung oleh terminal. |
MultiLoggerSupport (128) | Mengaktifkan dukungan untuk menggunakan banyak logger untuk mencatat satu pesan. (Misalnya, CLOG(INFO, "default", "network") << This will be logged using default and network loggers; ) |
DisablePerformanceTrackingCheckpointComparison (256) | Menonaktifkan perbandingan pos pemeriksaan |
DisableVModules (512) | Menonaktifkan penggunaan vmodules |
DisableVModulesExtensions (1024) | Menonaktifkan ekstensi vmodules. Ini berarti jika Anda memiliki vmodule -vmodule=main*=4 itu akan mencakup semuanya yang dimulai dengan main, sedangkan jika Anda belum mendefinisikannya, Anda akan dilindungi untuk file apa pun yang dimulai dengan main dan diakhiri dengan salah satu ekstensi berikut; .h .c .cpp .cc .cxx .-inl-.h .hxx .hpp. Harap perhatikan vmodule berikut tidak benar -vmodule=main.=4 dengan makro ini tidak ditentukan karena ini akan memeriksa main..c, perhatikan titik ganda. Jika Anda ingin ini valid, lihat tanda logging di atas: AllowVerboseIfModuleNotSpecified '?' dan '' wildcard didukung |
HierarchicalLogging (2048) | Mengaktifkan pencatatan hierarki. Ini tidak berlaku untuk logging verbose. |
CreateLoggerAutomatically (4096) | Membuat logger secara otomatis ketika tidak tersedia. |
AutoSpacing (8192) | Secara otomatis menambahkan spasi. Misalnya, LOG(INFO) << "DODGE" << "THIS!"; akan menampilkan "HINDARI INI!" |
FixedTimeFormat (16384) | Hanya berlaku untuk pelacakan kinerja - ini mencegah waktu pemformatan. Misalnya, 1001 ms akan dicatat sebagaimana adanya, alih-alih memformatnya sebagai 1.01 sec |
IgnoreSigInt (32768) | Saat aplikasi mogok, abaikan sinyal Interupsi |
Anda dapat menyetel/menghapus tanda ini dengan menggunakan el::Loggers::addFlag
dan el::Loggers::removeFlag
. Anda dapat memeriksa apakah flag tertentu tersedia dengan menggunakan el::Loggers::hasFlag
, semua fungsi ini menggunakan enum el::LoggingFlag
yang diketik dengan kuat
Anda dapat menyetel tanda ini dengan menggunakan argumen baris perintah
--logging-flags
. Anda perlu mengaktifkan fungsi ini dengan mendefinisikan makroELPP_LOGGING_FLAGS_FROM_ARG
(Anda harus memastikan untuk menggunakanSTART_EASYLOGGINGPP(argc, argv)
untuk mengonfigurasi argumen).
Anda juga dapat menyetel tanda default (awal) menggunakan
ELPP_DEFAULT_LOGGING_FLAGS
dan menyetel nilai numerik untuk tanda awal
Pergi ke Atas
Tabel berikut akan menjelaskan semua argumen baris perintah yang mungkin Anda gunakan untuk mendefinisikan perilaku tertentu; Anda perlu menginisialisasi argumen aplikasi dengan menggunakan START_EASYLOGGINGPP(argc, argv)
di fungsi main(int, char**)
Anda.
Argumen | Keterangan |
---|---|
-v | Mengaktifkan verbositas maksimum |
--v=2 | Mengaktifkan verbositas hingga verbose level 2 (kisaran valid: 0-9) |
--verbose | Mengaktifkan verbositas maksimum |
-vmodule=MODULE_NAME | Mengaktifkan verbositas untuk file yang dimulai dengan main hingga level 1, file lainnya bergantung pada tanda logging AllowVerboseIfModuleNotSpecified Silakan lihat bagian Bendera Logging di atas. Dua modul dapat dipisahkan dengan koma. Perlu diperhatikan bahwa vmodules berada di urutan terakhir dalam urutan prioritas pemeriksaan argumen untuk logging verbose, misalnya, jika kita memiliki -v dalam argumen aplikasi sebelum vmodules, vmodules akan diabaikan. |
--logging-flags=3 | Menyetel tanda logging. Misalnya ie, 3 , ia menetapkan tanda logging ke NewLineForContainer dan AllowVerboseIfModuleNotSpecified . Lihat bagian tanda logging di atas untuk detail dan nilai lebih lanjut. Lihat bagian makro untuk menonaktifkan fungsi ini. |
--default-log-file=FILE | Menetapkan file log default untuk logger yang ada dan yang akan datang. Anda mungkin ingin mempertimbangkan untuk mendefinisikan ELPP_NO_DEFAULT_LOG_FILE untuk mencegah pembuatan file log kosong default selama pra-pemrosesan. Lihat bagian makro untuk menonaktifkan fungsi ini. |
Pergi ke Atas
Beberapa opsi logging dapat diatur oleh makro, ini adalah keputusan yang bijaksana, misalnya jika kita telah menentukan ELPP_THREAD_SAFE
, semua fungsi thread-safe diaktifkan atau dinonaktifkan (pastikan over-head keamanan thread menyertainya). Untuk memudahkan mengingat dan mencegah kemungkinan konflik, semua makro dimulai dengan ELPP_
CATATAN: Semua makro dapat ditentukan dengan salah satu cara berikut:
Definisikan makro menggunakan opsi -D
kompiler, misalnya dalam kasus g++
Anda akan melakukan g++ source.cpp ... -DELPP_SYSLOG -DELPP_THREAD_SAFE ...
( cara yang disarankan )
Definisikan makro di dalam "easylogging++.h"
(mendefinisikan makro di file lain tidak akan berfungsi)
Nama Makro | Keterangan |
---|---|
ELPP_DEBUG_ASSERT_FAILURE | Membatalkan aplikasi pada kegagalan pernyataan pertama. Pernyataan ini disebabkan oleh input yang tidak valid, misalnya file konfigurasi tidak valid, dll. |
ELPP_UNICODE | Mengaktifkan dukungan Unicode saat masuk. Membutuhkan START_EASYLOGGINGPP |
ELPP_THREAD_SAFE | Mengaktifkan keamanan thread - pastikan -lpthread menghubungkan untuk linux. |
ELPP_FORCE_USE_STD_THREAD | Memaksa menggunakan pustaka standar C++ untuk threading (Hanya berguna saat menggunakan ELPP_THREAD_SAFE |
ELPP_FEATURE_CRASH_LOG | Hanya berlaku untuk GCC. Mengaktifkan pelacakan tumpukan pada aplikasi mogok |
ELPP_DISABLE_DEFAULT_CRASH_HANDLING | Menonaktifkan penanganan kerusakan default. Anda dapat menggunakan el::Helpers::setCrashHandler untuk menggunakan pengendali Anda sendiri. |
ELPP_DISABLE_LOGS | Menonaktifkan semua log - (pemrosesan awal) |
ELPP_DISABLE_DEBUG_LOGS | Menonaktifkan log debug - (pemrosesan awal) |
ELPP_DISABLE_INFO_LOGS | Menonaktifkan log info - (pemrosesan awal) |
ELPP_DISABLE_WARNING_LOGS | Menonaktifkan log peringatan - (pemrosesan awal) |
ELPP_DISABLE_ERROR_LOGS | Menonaktifkan log kesalahan - (pemrosesan awal) |
ELPP_DISABLE_FATAL_LOGS | Menonaktifkan log fatal - (pemrosesan awal) |
ELPP_DISABLE_VERBOSE_LOGS | Menonaktifkan log verbose - (pemrosesan awal) |
ELPP_DISABLE_TRACE_LOGS | Menonaktifkan log jejak - (pemrosesan awal) |
ELPP_FORCE_ENV_VAR_FROM_BASH | Jika variabel lingkungan tidak dapat ditemukan, paksakan penggunaan perintah bash alternatif untuk mencari nilai, misalnya whoami untuk nama pengguna. (JANGAN GUNAKAN MAKRO INI DENGAN LD_PRELOAD UNTUK PERPUSTAKAAN YANG SUDAH MENGGUNAKAN Easylogging++ ATAU ANDA AKAN TERMASUK STACK OVERFLOW UNTUK PROSES ( popen ) (lihat edisi #87 untuk detailnya)) |
ELPP_DEFAULT_LOG_FILE | Nama file lengkap tempat Anda ingin membuat file awal. Anda perlu menyematkan nilai makro ini dengan tanda kutip, misalnya, -DELPP_DEFAULT_LOG_FILE='"logs/el.gtest.log"' Perhatikan tanda kutip ganda di dalam tanda kutip tunggal, tanda kutip ganda adalah nilai untuk const char* dan tanda kutip tunggal menentukan nilai makro |
ELPP_NO_LOG_TO_FILE | Nonaktifkan logging ke file pada awalnya |
ELPP_NO_DEFAULT_LOG_FILE | Jika Anda tidak ingin menginisialisasi perpustakaan dengan file log default, tentukan makro ini. Ini akan masuk ke perangkat null untuk unix dan windows. Di platform lain Anda mungkin mendapatkan kesalahan dan Anda harus menggunakan ELPP_DEFAULT_LOG_FILE . (PR untuk perangkat null platform lain sangat diterima) |
ELPP_FRESH_LOG_FILE | Jangan pernah menambahkan file log setiap kali file log dibuat (Gunakan dengan hati-hati karena dapat menyebabkan hasil yang tidak diharapkan bagi beberapa pengguna) |
ELPP_DEBUG_ERRORS | Jika Anda ingin mengetahui kesalahan internal yang ditimbulkan oleh Easylogging++ yang mungkin disebabkan oleh konfigurasi atau hal lain, Anda dapat mengaktifkannya dengan mendefinisikan makro ini. Anda akan mendapatkan kesalahan pada output standar yaitu, terminal atau command prompt. |
ELPP_DISABLE_CUSTOM_FORMAT_SPECIFIERS | Menonaktifkan secara paksa penentu format khusus |
ELPP_DISABLE_LOGGING_FLAGS_FROM_ARG | Menonaktifkan secara paksa kemampuan untuk menyetel tanda logging menggunakan argumen baris perintah |
ELPP_DISABLE_LOG_FILE_FROM_ARG | Menonaktifkan secara paksa kemampuan untuk mengatur file log default dari argumen baris perintah |
ELPP_WINSOCK2 | Pada sistem windows, paksakan untuk menggunakan winsock2.h alih-alih winsock.h ketika WIN32_LEAN_AND_MEAN ditentukan |
ELPP_CUSTOM_COUT (lanjutan) | Memutuskan ke nilai misalnya, #define ELPP_CUSTOM_COUT qDebug() atau #define ELPP_CUSTOM_COUT std::cerr . Ini akan menggunakan nilai untuk keluaran standar (daripada menggunakan std::cout |
ELPP_CUSTOM_COUT_LINE (lanjutan) | Digunakan dengan ELPP_CUSTOM_COUT untuk menentukan cara menulis baris log dengan cout khusus. misalnya, #define ELPP_CUSTOM_COUT_LINE(msg) QString::fromStdString(msg).trimmed() |
ELPP_NO_CHECK_MACROS | Jangan mendefinisikan makro CHECK |
ELPP_NO_DEBUG_MACROS | Jangan tentukan makro DEBUG |
ELPP_UTC_DATETIME | Menggunakan waktu UTC, bukan waktu lokal (pada dasarnya menggunakan gmtime bukan localtime dan fungsi keluarga) |
ELPP_NO_GLOBAL_LOCK | Jangan mengunci seluruh penyimpanan saat pengiriman. Ini harus digunakan dengan hati-hati. Lihat terbitan #580 |
Pergi ke Atas
Jika Anda ingin membaca konfigurasi logger tertentu, Anda dapat melakukannya dengan menggunakan fungsi typedConfigurations()
di kelas Logger.
el::Logger* l = el::Loggers::getLogger( " default " );
bool enabled = l-> typedConfigurations ()->enabled(el::Level::Info);
// Or to read log format/pattern
std::string format =
l-> typedConfigurations ()->logFormat(el::Level::Info).format();
Pergi ke Atas
Masuk easylogging++ dilakukan menggunakan kumpulan makro. Hal ini untuk memudahkan pengguna dan mencegah mereka mengetahui rincian lebih lanjut yang tidak perlu tentang cara melakukan sesuatu.
Anda diberikan dua makro dasar yang dapat Anda gunakan untuk menulis log:
LOG(LEVEL)
CLOG(LEVEL, logger ID)
LOG
menggunakan logger 'default' sedangkan di CLOG (LOG Kustom) Anda menentukan ID logger. Untuk LEVEL silakan merujuk ke bagian Konfigurasi - Level di atas. Logger yang berbeda mungkin memiliki konfigurasi yang berbeda tergantung pada kebutuhan Anda, Anda juga dapat menulis makro khusus untuk mengakses logger khusus. Anda juga memiliki makro berbeda untuk logging verbose yang dijelaskan pada bagian di bawah. Berikut adalah contoh sederhana penggunaan makro ini setelah Anda menginisialisasi easylogging++.
LOG (INFO) << "This is info log";
CLOG (ERROR, " performance " ) << "This is info log using performance logger";
Ada cara lain untuk menggunakan makro yang sama yaitu, LOG
(dan makro terkait). Ini adalah Anda mendefinisikan makro ELPP_DEFAULT_LOGGER
dan ELPP_DEFAULT_PERFORMANCE_LOGGER
dengan ID logger yang sudah terdaftar, dan sekarang ketika Anda menggunakan makro LOG
, secara otomatis akan menggunakan logger yang ditentukan, bukan logger default
. Harap dicatat bahwa ini harus didefinisikan dalam file sumber, bukan file header. Hal ini agar ketika kita memasukkan header kita tidak sengaja menggunakan logger yang tidak valid.
Contoh singkatnya ada di sini
# ifndef ELPP_DEFAULT_LOGGER
# define ELPP_DEFAULT_LOGGER " update_manager "
# endif
# ifndef ELPP_DEFAULT_PERFORMANCE_LOGGER
# define ELPP_DEFAULT_PERFORMANCE_LOGGER ELPP_DEFAULT_LOGGER
# endif
# include " easylogging++.h "
UpdateManager::UpdateManager {
_TRACE; // Logs using LOG(TRACE) provided logger is already registered - i.e, update_manager
LOG (INFO) << " This will log using update_manager logger as well " ;
}
# include " easylogging++.h "
UpdateManager::UpdateManager {
_TRACE; // Logs using LOG(TRACE) using default logger because no `ELPP_DEFAULT_LOGGER` is defined unless you have it in makefile
}
Anda juga dapat menulis log dengan menggunakan kelas
Logger
secara langsung. Fitur ini tersedia pada kompiler yang mendukung templat variadik. Anda dapat menjelajahi lebih lanjut dengan melihatsamples/STL/logger-log-functions.cpp
.
Pergi ke Atas
Easylogging++ menyediakan aspek-aspek tertentu dalam logging, salah satu aspek tersebut adalah conditional logging, yaitu log hanya akan ditulis jika kondisi tertentu terpenuhi. Ini sangat berguna dalam beberapa situasi. Makro pembantu diakhiri dengan _IF;
LOG_IF(condition, LEVEL)
CLOG_IF(condition, LEVEL, logger ID)
LOG_IF (condition, INFO) << "Logged if condition is true";
LOG_IF ( false , WARNING) << "Never logged";
CLOG_IF ( true , INFO, " performance " ) << "Always logged (performance logger)"
Makro yang sama tersedia untuk logging verbose dengan V
di awal, yaitu VLOG_IF
dan CVLOG_IF
. lihat bagian logging verbose di bawah untuk informasi lebih lanjut. Anda mungkin memiliki kondisi rumit yang Anda inginkan tergantung pada kebutuhan Anda.
Pergi ke Atas
Pencatatan log sesekali adalah aspek lain yang berguna dalam pencatatan dengan Easylogging++. Artinya, log akan ditulis jika mengenai waktu tertentu atau sebagian waktu tertentu, misalnya setiap pukulan ke-10, pukulan ke-100, atau pukulan ke-2. Makro pembantu diakhiri dengan _EVERY_N
;
LOG_EVERY_N(n, LEVEL)
CLOG_EVERY_N(n, LEVEL, logger ID)
Ada beberapa cara lain untuk mencatat juga berdasarkan jumlah hit. Makro yang berguna ini adalah
LOG_AFTER_N(n, LEVEL)
; Hanya mencatat ketika kita telah mencapai jumlah hit n
LOG_N_TIMES(n, LEVEL)
; Log n kali for ( int i = 1 ; i <= 10 ; ++i) {
LOG_EVERY_N ( 2 , INFO) << " Logged every second iter " ;
}
// 5 logs written; 2, 4, 6, 7, 10
for ( int i = 1 ; i <= 10 ; ++i) {
LOG_AFTER_N ( 2 , INFO) << " Log after 2 hits; " << i;
}
// 8 logs written; 3, 4, 5, 6, 7, 8, 9, 10
for ( int i = 1 ; i <= 100 ; ++i) {
LOG_N_TIMES ( 3 , INFO) << " Log only 3 times; " << i;
}
// 3 logs writter; 1, 2, 3
Versi makro yang sama tersedia untuk mode
DEBUG
saja, makro ini dimulai denganD
(untuk debug) diikuti dengan nama yang sama. misalnya,DLOG
untuk login hanya dalam mode debug (yaitu, ketika_DEBUG
ditentukan atauNDEBUG
tidak ditentukan)
Pergi ke Atas
printf
Suka Mencatat Untuk kompiler yang mendukung templat variadik C++11, tersedia kemampuan untuk mencatat seperti "printf". Ini dilakukan dengan menggunakan kelas Logger
. Fitur ini aman untuk thread dan tipe (karena kami tidak menggunakan makro apa pun seperti LOG(INFO)
dll)
Hal ini dilakukan dalam dua langkah:
el::Loggers::getLogger(<logger_id>);
Satu-satunya perbedaan dari printf
adalah bahwa logging menggunakan fungsi-fungsi ini memerlukan %v
untuk setiap argumen (Ini untuk keamanan tipe); alih-alih penentu format khusus. Anda dapat menghindarinya dengan %%v
Berikut adalah berbagai tanda tangan fungsi:
info(const char*, const T&, const Args&...)
warn(const char*, const T&, const Args&...)
error(const char*, const T&, const Args&...)
debug(const char*, const T&, const Args&...)
fatal(const char*, const T&, const Args&...)
trace(const char*, const T&, const Args&...)
verbose(int vlevel, const char*, const T&, const Args&...)
// Use default logger
el::Logger* defaultLogger = el::Loggers::getLogger( " default " );
// STL logging (`ELPP_STL_LOGGING` should be defined)
std::vector< int > i;
i.push_back( 1 );
defaultLogger-> warn ( " My first ultimate log message %v %v %v " , 123 , 222 , i);
// Escaping
defaultLogger-> info ( " My first ultimate log message %% %%v %v %v " , 123 , 222 );
Penentu format
%file
,%func
%line
dan%loc
tidak akan berfungsi denganprintf
seperti logging.
Pergi ke Atas
Anda dapat mengirim pesan Anda ke jaringan. Namun Anda harus menerapkan cara Anda sendiri menggunakan API operator log. Kami telah menulis sampel yang berfungsi sepenuhnya untuk tujuan ini. Silakan lihat contoh Kirim ke Jaringan
Pergi ke Atas
Verbose logging berguna di setiap perangkat lunak untuk mencatat lebih banyak informasi dari biasanya. Sangat berguna untuk pemecahan masalah. Berikut adalah makro spesifik logging verbose;
VLOG(verbose-level)
CVLOG(verbose-level, logger ID)
Pergi ke Atas
Verbose logging juga memiliki aspek logging bersyarat dan sesekali, yaitu,
VLOG_IF(condition, verbose-level)
CVLOG_IF(condition, verbose-level, loggerID)
VLOG_EVERY_N(n, verbose-level)
CVLOG_EVERY_N(n, verbose-level, loggerID)
VLOG_AFTER_N(n, verbose-level)
CVLOG_AFTER_N(n, verbose-level, loggerID)
VLOG_N_TIMES(n, verbose-level)
CVLOG_N_TIMES(n, verbose-level, loggerID)
Pergi ke Atas
Tingkat verbose merupakan tingkat verbositas yang dapat berkisar antara 1-9. Tingkat verbose tidak akan aktif kecuali Anda menetapkan argumen aplikasi untuk itu. Silakan baca seluruh bagian Argumen Aplikasi untuk memahami lebih lanjut tentang logging verbose.
Untuk mengubah level verbose dengan cepat, silakan gunakan fungsi Loggers::setVerboseLevel(base::type::VerboseLevel)
alias Loggers::setVerboseLevel(int)
. (Anda dapat memeriksa level verbose saat ini dengan Loggers::verboseLevel()
Pergi ke Atas
Anda dapat menggunakan makro VLOG_IS_ON(verbose-level)
untuk memeriksa apakah pencatatan tertentu aktif untuk file sumber untuk tingkat verbose tertentu. Ini mengembalikan boolean yang dapat Anda sematkan ke dalam kondisi if.
if (VLOG_IS_ON( 2 )) {
// Verbosity level 2 is on for this file
}
Pergi ke Atas
VModule adalah fungsionalitas untuk logging verbose (seperti yang disebutkan dalam tabel di atas) di mana Anda dapat menentukan verbositas berdasarkan modul/file sumber. Berikut beberapa contoh beserta penjelasannya; Salah satu vmodule di bawah ini dimulai dengan -vmodule=
dan tanda LoggingFlag::DisableVModulesExtensions
tidak disetel. Vmodule dapat dinonaktifkan sepenuhnya dengan menambahkan flag LoggingFlag::DisableVModules
Contoh dengan bendera LoggingFlag::AllowVerboseIfModuleNotSpecified
;
main=3,parser*=4
:
main{.h, .c, .cpp, .cc, .cxx, -inl.h, .hxx, .hpp}
parser{.h, .c, .cpp, .cc, .cxx, -inl.h, .hxx, .hpp}