→ รุ่นล่าสุด
→ บันทึกการเปลี่ยนแปลง
→ ตัวอย่าง
ภาพรวม ทำไมถึงมีห้องสมุดอีกแห่ง คุณสมบัติโดยสรุป เริ่มต้นใช้งาน ดาวน์โหลด เริ่มต้นอย่างรวดเร็ว ติดตั้ง (ไม่บังคับ) การตั้งค่าอาร์กิวเมนต์ของแอปพลิเคชัน การกำหนดค่า ระดับ กำหนดค่า การใช้ไฟล์กำหนดค่า การใช้ el::Configurations Class การใช้การกำหนดค่าแบบอินไลน์ การกำหนดค่าเริ่มต้น การกำหนดค่าทั่วโลก ตัวระบุรูปแบบการบันทึก ตัวระบุรูปแบบวันที่/เวลา ตัวระบุรูปแบบที่กำหนดเอง การบันทึกแฟล็ก อาร์กิวเมนต์ของแอปพลิเคชัน มาโครการกำหนดค่า การกำหนดค่าการอ่าน การบันทึก ขั้นพื้นฐาน การบันทึกแบบมีเงื่อนไข การบันทึกเป็นครั้งคราว printf ชอบการบันทึก การบันทึกเครือข่าย การบันทึกแบบละเอียด ขั้นพื้นฐาน แบบมีเงื่อนไขและเป็นครั้งคราว ระดับรายละเอียด ตรวจสอบว่าการบันทึกแบบ Verbose เปิดอยู่หรือไม่ วีโมดูล การลงทะเบียนผู้บันทึกใหม่ ยกเลิกการลงทะเบียน Loggers การเติมรหัส Logger ที่มีอยู่ การแชร์พื้นที่เก็บข้อมูลการบันทึก คุณสมบัติพิเศษ การติดตามประสิทธิภาพ การติดตามประสิทธิภาพตามเงื่อนไข ใช้ประโยชน์จากข้อมูลการติดตามประสิทธิภาพ การหมุนไฟล์บันทึก การจัดการความผิดพลาด การติดตั้งตัวจัดการข้อขัดข้องแบบกำหนดเอง สแต็คเทรซ มัลติเธรด ตรวจสอบมาโคร การบันทึกข้อผิดพลาด () การใช้ Syslog การบันทึก STL เทมเพลตที่รองรับ การบันทึก Qt เพิ่มการบันทึก การบันทึก wxWidgets การขยายห้องสมุด การบันทึกชั้นเรียนของคุณเอง การบันทึกคลาสของบุคคลที่สาม ฟลัชชิ่งและโรลลิ่งไฟล์บันทึกด้วยตนเอง บันทึกการโทรกลับการจัดส่ง การโทรกลับการลงทะเบียนคนตัดไม้ การบันทึกแบบอะซิงโครนัส ชั้นเรียนผู้ช่วย ผลงาน การส่งแพทช์ การรายงานข้อผิดพลาด ความเข้ากันได้ สร้างเมทริกซ์ ใบอนุญาต ข้อสงวนสิทธิ์
Easylogging++ เป็นไลบรารีการบันทึกที่มีประสิทธิภาพส่วนหัวเดียวสำหรับแอปพลิเคชัน C++ มีประสิทธิภาพอย่างยิ่ง สามารถขยายได้สูง และกำหนดค่าได้ตามความต้องการของผู้ใช้ ให้ความสามารถในการเขียน sinks ของคุณเอง (ผ่านฟีเจอร์ที่เรียกว่า LogDispatchCallback
) ปัจจุบันไลบรารีนี้ใช้งานโดยโครงการโอเพ่นซอร์สหลายร้อยโครงการบน GitHub และไซต์การจัดการการควบคุมโอเพ่นซอร์สอื่นๆ
คู่มือนี้มีไว้สำหรับ Easylogging++ v9.97.1 สำหรับเวอร์ชันอื่น โปรดดูรุ่นที่เกี่ยวข้องบน GitHub
คุณอาจสนใจเซิร์ฟเวอร์บันทึกสารตกค้าง
ไปที่ด้านบน
หากคุณกำลังทำงานกับยูทิลิตี้ขนาดเล็กหรือโปรเจ็กต์ขนาดใหญ่ใน C ++ ไลบรารีนี้จะมีประโยชน์ มันขึ้นอยู่กับส่วนหัวเดียวและต้องการเพียงลิงก์ไปยังไฟล์ต้นฉบับเดียวเท่านั้น (เดิมทีเป็นส่วนหัวเท่านั้นและได้เปลี่ยนไปใช้ไฟล์ต้นฉบับในฉบับที่ #445 คุณยังคงสามารถใช้ส่วนหัวเท่านั้นในเวอร์ชัน 9.89)
ไลบรารีนี้ได้รับการออกแบบโดยคำนึงถึงแนวคิดต่างๆ มากมาย (เช่น ความสะดวกในการพกพา ประสิทธิภาพ การใช้งาน คุณสมบัติ และติดตั้งง่าย)
ทำไมต้องมีห้องสมุดอีกแห่ง? คำตอบค่อนข้างตรงไปตรงมา ใช้ตามที่คุณเขียนเพื่อให้คุณสามารถแก้ไขปัญหา (ถ้ามี) ในขณะที่คุณดำเนินการหรือยกระดับบน GitHub นอกจากนี้ โดยส่วนตัวแล้วฉันยังไม่เห็นไลบรารีการบันทึกที่ใช้ส่วนหัวเดียวด้วยการออกแบบที่คุณสามารถกำหนดค่าได้ทุกที่ ขยายตามความต้องการของคุณ และรับประสิทธิภาพที่รวดเร็ว ฉันเคยเห็นไลบรารีการบันทึกแบบส่วนหัวเดียวอื่นๆ สำหรับ C++ แต่ไลบรารีเหล่านี้ใช้ไลบรารีภายนอก เช่น บูสต์หรือ Qt เพื่อรองรับคุณสมบัติบางอย่าง เช่น เธรด นิพจน์ทั่วไป หรือวันที่ เป็นต้น ไลบรารีนี้มีทุกอย่างในตัวเพื่อป้องกันการใช้งานไลบรารีภายนอก ไม่ใช่ว่าฉันไม่ชอบห้องสมุดเหล่านั้น จริงๆ แล้วฉันรักพวกเขา แต่เนื่องจากไม่ใช่ทุกโครงการที่ใช้ห้องสมุดเหล่านี้ ฉันจึงไม่สามารถเสี่ยงที่จะพึ่งพาห้องสมุดเหล่านี้ได้
ไปที่ด้านบน
Easylogging++ เป็นคุณสมบัติที่อัดแน่นไปด้วยคุณสมบัติมากมายที่นักพัฒนาทั่วไปและนักพัฒนาขั้นสูงจำเป็นต้องใช้ในขณะที่เขียนซอฟต์แวร์
ไปที่ด้านบน
ดาวน์โหลดเวอร์ชันล่าสุดจากรุ่นล่าสุด
สำหรับรุ่นอื่นๆ โปรดไปที่หน้าการเผยแพร่ หากแอปพลิเคชันของคุณไม่รองรับ C++11 โปรดพิจารณาใช้เวอร์ชัน 8.91 นี่เป็นเวอร์ชันเสถียรสำหรับ C++98 และ C++03 เพียงแต่ขาดคุณสมบัติบางอย่าง
ไปที่ด้านบน
เพื่อเริ่มต้นใช้งาน Easylogging++ คุณสามารถปฏิบัติตามสามขั้นตอนง่ายๆ:
easylogging++.h
และ easylogging++.cc
)# include " easylogging++.h "
INITIALIZE_EASYLOGGINGPP
int main ( int argc, char * argv[]) {
LOG (INFO) << " My first info log using default logger " ;
return 0 ;
}
ตอนนี้คอมไพล์โดยใช้
g++ main.cc easylogging++.cc -o prog -std=c++11
ง่ายๆ เลย! โปรดทราบว่าควรใช้ INITIALIZE_EASYLOGGINGPP
เพียงครั้งเดียว มิฉะนั้นคุณจะพบข้อผิดพลาดในการคอมไพล์ นี่คือคำจำกัดความของตัวแปร extern
หลายตัว ซึ่งหมายความว่าสามารถกำหนดได้เพียงครั้งเดียวต่อแอปพลิเคชัน ตำแหน่งที่ดีที่สุดในการใส่คำสั่งเริ่มต้นนี้อยู่ในไฟล์ที่มีการกำหนดฟังก์ชัน int main(int, char**)
ไว้หลังจากคำสั่ง include สุดท้าย
หากคุณต้องการติดตั้งส่วนหัวนี้ทั้งระบบ คุณสามารถทำได้ผ่านทาง:
mkdir build
cd build
cmake -Dtest=ON ../
make
make test
make install
ตัวเลือกต่อไปนี้ได้รับการสนับสนุนโดย Easylogging++ cmake และคุณสามารถเปิดตัวเลือกเหล่านี้ได้โดยใช้ -D<option>=ON
lib_utc_datetime
- กำหนด ELPP_UTC_DATETIME
build_static_lib
- สร้างไลบรารีแบบคงที่สำหรับ Easylogging ++ ด้วยเหตุนี้ คุณยังคงต้องใช้ไฟล์ easylogging++.cc
เพื่อที่จะคอมไพล์ สำหรับส่วนหัวเท่านั้น โปรดตรวจสอบเวอร์ชัน 9.89 และต่ำกว่า
หรือคุณสามารถดาวน์โหลดและติดตั้ง easyloggingpp โดยใช้ตัวจัดการการพึ่งพา vcpkg:
git clone https://github.com/Microsoft/vcpkg.git
cd vcpkg
./bootstrap-vcpkg.sh
./vcpkg integrate install
./vcpkg install easyloggingpp
พอร์ต easyloggingpp ใน vcpkg ได้รับการปรับปรุงให้ทันสมัยโดยสมาชิกทีม Microsoft และผู้ร่วมให้ข้อมูลในชุมชน หากเวอร์ชันล้าสมัย โปรดสร้างปัญหาหรือดึงคำขอบนที่เก็บ vcpkg
ไปที่ด้านบน
ขอแนะนำให้ส่งอาร์กิวเมนต์ของแอปพลิเคชันไปที่ Easylogging++ เสมอ คุณสมบัติบางอย่างของ Easylogging++ ต้องการให้คุณตั้งค่าอาร์กิวเมนต์ของแอปพลิเคชัน เช่น การบันทึกแบบละเอียดเพื่อตั้งค่าระดับรายละเอียดหรือ vmodules (อธิบายในภายหลัง) ในการทำเช่นนั้นคุณสามารถใช้แมโครตัวช่วยหรือคลาสตัวช่วย
int main ( int argc, char * argv[]) {
START_EASYLOGGINGPP (argc, argv);
...
}
ไปที่ด้านบน
ในการเริ่มกำหนดค่าไลบรารีการบันทึก คุณต้องเข้าใจระดับความรุนแรง Easylogging++ จงใจไม่ใช้การบันทึกแบบลำดับชั้นเพื่อควบคุมสิ่งที่เปิดใช้งานและสิ่งที่ไม่ได้เปิดใช้งานอย่างสมบูรณ์ ดังที่กล่าวไปแล้ว ยังคงมีตัวเลือกในการใช้การบันทึกแบบลำดับชั้นโดยใช้ LoggingFlag::HierarchicalLogging
Easylogging++ มีระดับดังต่อไปนี้ (สั่งสำหรับระดับลำดับชั้น)
ระดับ | คำอธิบาย |
---|---|
ทั่วโลก | ระดับทั่วไปที่แสดงถึงทุกระดับ มีประโยชน์เมื่อตั้งค่าการกำหนดค่าส่วนกลางสำหรับทุกระดับ |
ติดตาม | ข้อมูลที่เป็นประโยชน์ในการติดตามย้อนกลับเหตุการณ์บางอย่าง ซึ่งส่วนใหญ่มีประโยชน์มากกว่าบันทึกการแก้ไขข้อบกพร่อง |
ดีบัก | เหตุการณ์ที่ให้ข้อมูลมีประโยชน์มากที่สุดสำหรับนักพัฒนาในการดีบักแอปพลิเคชัน ใช้ได้เฉพาะในกรณีที่ไม่ได้กำหนด NDEBUG (สำหรับไม่ใช่ VC++) หรือ _DEBUG ถูกกำหนดไว้ (สำหรับ VC++) |
ร้ายแรง | เหตุการณ์ข้อผิดพลาดร้ายแรงมากที่อาจส่งผลให้แอปพลิเคชันถูกยกเลิก |
ข้อผิดพลาด | ข้อมูลข้อผิดพลาดแต่จะดำเนินการแอปพลิเคชันต่อไปเพื่อให้ทำงานต่อไป |
คำเตือน | ข้อมูลที่แสดงถึงข้อผิดพลาดในแอปพลิเคชัน แต่แอปพลิเคชันจะยังคงทำงานต่อไป |
ข้อมูล | มีประโยชน์อย่างยิ่งในการแสดงความคืบหน้าของการสมัครในปัจจุบัน |
ละเอียด | ข้อมูลที่เป็นประโยชน์อย่างมากและแตกต่างกันไปตามระดับการบันทึกโดยละเอียด การบันทึกแบบละเอียดไม่สามารถใช้ได้กับการบันทึกแบบลำดับชั้น |
ไม่ทราบ | ใช้ได้กับการบันทึกแบบลำดับชั้นเท่านั้น และใช้เพื่อปิดการบันทึกโดยสมบูรณ์ |
ไปที่ด้านบน
Easylogging++ นั้นง่ายต่อการกำหนดค่า มีสามวิธีที่เป็นไปได้คือ
การกำหนดค่าสามารถทำได้โดยไฟล์ที่โหลดเมื่อรันไทม์โดยคลาส Configurations
ไฟล์นี้มีรูปแบบดังต่อไปนี้
* LEVEL:
CONFIGURATION NAME = "VALUE" ## Comment
ANOTHER CONFIG NAME = "VALUE"
ชื่อระดับขึ้นต้นด้วยดาว (*) และลงท้ายด้วยเครื่องหมายทวิภาค (:) ขอแนะนำอย่างยิ่งให้เริ่มต้นไฟล์การกำหนดค่าของคุณด้วยระดับ Global
เพื่อให้การกำหนดค่าใด ๆ ที่ไม่ได้ระบุไว้ในไฟล์จะใช้การกำหนดค่าจาก Global
โดยอัตโนมัติ ตัวอย่างเช่น หากคุณตั้ง Filename
เป็น Global
และคุณต้องการให้ทุกระดับใช้ชื่อไฟล์เดียวกัน อย่าตั้งค่าอย่างชัดเจนสำหรับแต่ละระดับ ไลบรารีจะใช้ค่าการกำหนดค่าจาก Global
โดยอัตโนมัติ ตารางต่อไปนี้ประกอบด้วยการกำหนดค่าที่รองรับโดยไฟล์การกำหนดค่า
ชื่อการกำหนดค่า | พิมพ์ | คำอธิบาย |
---|---|---|
Enabled | บูล | กำหนดว่าระดับที่สอดคล้องกันสำหรับตัวบันทึกถูกเปิดใช้งานหรือไม่ คุณสามารถปิดการใช้งานบันทึกทั้งหมดได้โดยใช้ el::Level::Global |
To_File | บูล | ไม่ว่าจะเขียนบันทึกที่เกี่ยวข้องลงในไฟล์บันทึกหรือไม่ |
To_Standard_Output | บูล | ว่าจะเขียนบันทึกไปยังเอาต์พุตมาตรฐาน เช่น เทอร์มินัลหรือพรอมต์คำสั่งหรือไม่ |
Format | ถ่าน* | กำหนดรูปแบบ/รูปแบบของการบันทึกสำหรับระดับและตัวบันทึกที่เกี่ยวข้อง |
Filename | ถ่าน* | กำหนดไฟล์บันทึก (เส้นทางแบบเต็ม) เพื่อเขียนบันทึกสำหรับระดับและตัวบันทึกที่เกี่ยวข้อง |
Subsecond_Precision | ไม่ได้ | ระบุความแม่นยำของเสี้ยววินาที (ก่อนหน้านี้เรียกว่า 'ความกว้างมิลลิวินาที') ความกว้างสามารถอยู่ในช่วง (1-6) |
Performance_Tracking | บูล | กำหนดว่าจะเปิดใช้งานการติดตามประสิทธิภาพหรือไม่ สิ่งนี้ไม่ได้ขึ้นอยู่กับคนตัดไม้หรือระดับ การติดตามประสิทธิภาพจะใช้ตัวบันทึก 'ประสิทธิภาพ' เสมอ เว้นแต่จะระบุไว้ |
Max_Log_File_Size | ขนาด_t | หากขนาดไฟล์บันทึกของระดับที่สอดคล้องกันคือ >= ขนาดที่ระบุ ไฟล์บันทึกจะถูกตัดทอน |
Log_Flush_Threshold | ขนาด_t | ระบุจำนวนรายการบันทึกที่จะเก็บไว้จนกว่าเราจะล้างข้อมูลบันทึกที่รอดำเนินการ |
กรุณาอย่าใช้เครื่องหมายคำพูดคู่ในความคิดเห็น เพราะคุณอาจเกิดพฤติกรรมที่ไม่คาดคิดได้
ตัวอย่างไฟล์การกำหนดค่า
* 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"
เนื้อหาไฟล์การกำหนดค่าในตัวอย่างด้านบนนั้นตรงไปตรงมา เราเริ่มต้นด้วยระดับ GLOBAL
เพื่อแทนที่ระดับทั้งหมด ระดับต่อมาที่กำหนดไว้อย่างชัดเจนจะแทนที่การกำหนดค่าจาก GLOBAL
ตัวอย่างเช่น ทุกระดับยกเว้น DEBUG
จะมีรูปแบบเดียวกัน เช่น วันที่เวลา และข้อความบันทึก สำหรับระดับ DEBUG
เรามีเฉพาะวันที่ (พร้อมวันและเดือน) ฟังก์ชันต้นทาง และข้อความบันทึก การกำหนดค่าที่เหลือสำหรับ DEBUG
จะใช้จาก GLOBAL
นอกจากนี้ โปรดสังเกต {%d/%M}
ในรูปแบบ DEBUG
ด้านบน หากคุณไม่ได้ระบุรูปแบบวันที่ ระบบจะใช้รูปแบบเริ่มต้น ค่าเริ่มต้นของวันที่/เวลาคือ %d/%M/%Y %h:%m:%s,%g
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับตัวระบุรูปแบบเหล่านี้ โปรดดูส่วนตัวระบุรูปแบบวันที่/เวลาด้านล่าง
# 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
}
ไฟล์การกำหนดค่าของคุณสามารถแปลงเป็นวัตถุ
el::Configurations
(โดยใช้ตัวสร้าง) ที่สามารถใช้งานได้ทุกที่ที่จำเป็น (เช่นในตัวอย่างด้านบน)
ไปที่ด้านบน
คุณสามารถตั้งค่าหรือรีเซ็ตการกำหนดค่าได้
# 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 ;
}
ต้องตั้งค่าการกำหนดค่าเพียงครั้งเดียว หากคุณพอใจกับการกำหนดค่าเริ่มต้น คุณก็สามารถใช้งานได้เช่นกัน
ไปที่ด้านบน
การกำหนดค่าแบบอินไลน์หมายความว่าคุณสามารถตั้งค่าการกำหนดค่าใน std::string
แต่ต้องแน่ใจว่าคุณเพิ่มอักขระบรรทัดใหม่ทั้งหมด ฯลฯ ไม่แนะนำให้ทำเช่นนี้เนื่องจากจะยุ่งอยู่เสมอ
el::Configurations c;
c.setToDefault();
c.parseFromText( " *GLOBAL: n FORMAT = %level %msg " );
โค้ดด้านบนตั้งค่าเฉพาะออบเจ็กต์การกำหนดค่า คุณยังคงต้องกำหนดค่าตัวบันทึกใหม่โดยใช้การกำหนดค่านี้
ไปที่ด้านบน
หากคุณต้องการที่จะมีการกำหนดค่าสำหรับตัวบันทึกที่มีอยู่และในอนาคต คุณสามารถใช้ el::Loggers::setDefaultConfigurations(el::Configurations& configurations, bool configureExistingLoggers = false)
สิ่งนี้มีประโยชน์เมื่อคุณทำงานในระดับที่ค่อนข้างใหญ่ หรือใช้ไลบรารีของบริษัทอื่นที่ใช้ Easylogging++ อยู่แล้ว ตัวบันทึกที่สร้างขึ้นใหม่จะใช้การกำหนดค่าเริ่มต้น หากคุณต้องการกำหนดค่าตัวบันทึกที่มีอยู่ด้วย คุณสามารถตั้งค่าอาร์กิวเมนต์ที่สองเป็น true
(โดยค่าเริ่มต้นจะเป็น false
)
ไปที่ด้านบน
Level::Global
ไม่เกี่ยวข้องกับการกำหนดค่าส่วนกลาง แต่เป็นแนวคิดที่คุณสามารถลงทะเบียนการกำหนดค่าสำหรับตัวบันทึกทั้งหมด/หรือบางตัว และแม้แต่การลงทะเบียนตัวบันทึกใหม่โดยใช้ไฟล์การกำหนดค่า ไวยากรณ์ของไฟล์กำหนดค่าคือ:
-- LOGGER ID ## Case sensitive
## Everything else is same as configuration file
-- ANOTHER LOGGER ID
## Configuration for this logger
Logger ID เริ่มต้นด้วยขีดกลางสองขีด เมื่อคุณเขียนไฟล์การกำหนดค่าส่วนกลางแล้ว คุณสามารถกำหนดค่าตัวบันทึกทั้งหมดของคุณ (และลงทะเบียนใหม่) โดยใช้ฟังก์ชันเดียว
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 ;
}
โปรดทราบว่า ไม่สามารถลงทะเบียนตัวบันทึกใหม่โดยใช้การกำหนดค่าส่วนกลางโดยไม่กำหนดการกำหนดค่าได้ คุณต้องกำหนดคอนฟิกูเรชันอย่างน้อยเดียว วิธีอื่นๆ ในการลงทะเบียนผู้บันทึกจะกล่าวถึงในส่วนการบันทึกด้านล่าง
ไปที่ด้านบน
คุณสามารถปรับแต่งรูปแบบของการบันทึกได้โดยใช้ตัวระบุต่อไปนี้:
ตัวระบุ | แทนที่โดย |
---|---|
%logger | รหัสคนตัดไม้ |
%thread | Thread ID - ใช้ std::thread หากมี มิฉะนั้น GetCurrentThreadId() บน windows |
%thread_name | ใช้ Helpers::setThreadName เพื่อตั้งชื่อเธรดปัจจุบัน (จากที่คุณเรียกใช้ setThreadName ) ดูตัวอย่างชื่อเธรด |
%level | ระดับความรุนแรง (ข้อมูล ดีบัก ข้อผิดพลาด คำเตือน ร้ายแรง ละเอียด การติดตาม) |
%levshort | ระดับความรุนแรง (ฉบับย่อ เช่น I สำหรับข้อมูล และ D, E, W, F, V, T ตามลำดับ) |
%vlevel | ระดับการใช้คำฟุ่มเฟือย (ใช้ได้กับการบันทึกแบบละเอียด) |
%datetime | วันที่และ/หรือเวลา - ปรับแต่งรูปแบบได้ - ดูตัวระบุรูปแบบวันที่/เวลาด้านล่าง |
%user | ผู้ใช้ที่กำลังใช้งานแอปพลิเคชันอยู่ |
%host | แอปพลิเคชันชื่อคอมพิวเตอร์กำลังทำงานอยู่ |
%file * | ชื่อไฟล์ของไฟล์ต้นฉบับ (เส้นทางแบบเต็ม) - คุณลักษณะนี้ขึ้นอยู่กับความพร้อมใช้งานของมาโคร __FILE__ ของคอมไพเลอร์ |
%fbase * | ชื่อไฟล์ของไฟล์ต้นฉบับ (เฉพาะชื่อฐานเท่านั้น) |
%line * | หมายเลขบรรทัดต้นทาง - คุณลักษณะนี้ขึ้นอยู่กับความพร้อมใช้งานของมาโคร __LINE__ ของการคอมไพล์ |
%func * | ฟังก์ชั่นการบันทึก |
%loc * | ชื่อไฟล์ต้นฉบับและหมายเลขบรรทัดของการบันทึก (คั่นด้วยเครื่องหมายทวิภาค) |
%msg | ข้อความบันทึกจริง |
% | อักขระหลีก (เช่น %%level จะเขียน %level) |
__LINE__
, __FILE__
เป็นต้น ไปที่ด้านบน
คุณสามารถปรับแต่งรูปแบบวันที่/เวลาได้โดยใช้ตัวระบุต่อไปนี้
ตัวระบุ | แทนที่ด้วย |
---|---|
%d | วันของเดือน (เบาะศูนย์) |
%a | วันในสัปดาห์ - สั้น (จันทร์ อังคาร พุธ พฤหัสบดี ศุกร์ เสาร์ อาทิตย์) |
%A | วันในสัปดาห์ - ยาว (วันจันทร์ วันอังคาร วันพุธ วันพฤหัสบดี วันศุกร์ วันเสาร์ วันอาทิตย์) |
%M | เดือน (เบาะศูนย์) |
%b | เดือน - สั้น (ม.ค. ก.พ. มี.ค. เม.ย. พ.ค. มิ.ย. ก.ค. ส.ค. ก.ย. ต.ค. พ.ย. ธ.ค.) |
%B | เดือน - ยาว (มกราคม, กุมภาพันธ์, มีนาคม, เมษายน, พฤษภาคม, มิถุนายน, กรกฎาคม, สิงหาคม, กันยายน, ตุลาคม, พฤศจิกายน, ธันวาคม) |
%y | ปี - สองหลัก (13, 14 ฯลฯ) |
%Y | ปี - สี่หลัก (2013, 2014 ฯลฯ) |
%h | ชั่วโมง (รูปแบบ 12 ชั่วโมง) |
%H | ชั่วโมง (รูปแบบ 24 ชั่วโมง) |
%m | นาที (เบาะศูนย์) |
%s | ที่สอง (เบาะศูนย์) |
%g | ส่วนรองวินาที (ความแม่นยำถูกกำหนดค่าโดย ConfigurationType::SubsecondPrecision) |
%F | การกำหนด AM/PM |
% | ตัวละครหลบหนี |
โปรดทราบว่าวันที่/เวลาจำกัดไม่เกิน 30
ตัวอักษร
ไปที่ด้านบน
คุณยังสามารถระบุตัวระบุรูปแบบของคุณเองได้ ในการทำเช่นนั้นคุณสามารถใช้ el::Helpers::installCustomFormatSpecifier
ตัวอย่างที่สมบูรณ์แบบคือ %ip_addr
สำหรับแอปพลิเคชันเซิร์ฟเวอร์ 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 ;
}
ไปที่ด้านบน
จากบางส่วนของการบันทึกคุณสามารถตั้งค่าสถานะการบันทึกได้ นี่คือแฟล็กที่รองรับ:
ธง | คำอธิบาย |
---|---|
NewLineForContainer (1) | ตรวจสอบให้แน่ใจว่าเรามีบรรทัดใหม่สำหรับแต่ละรายการบันทึกคอนเทนเนอร์ |
AllowVerboseIfModuleNotSpecified (2) | ตรวจสอบให้แน่ใจว่ามีการใช้ -vmodule และไม่ได้ระบุโมดูล ดังนั้นการบันทึกแบบละเอียดจะได้รับอนุญาตผ่านโมดูลนั้น สมมติว่าพารามิเตอร์คือ -vmodule=main*=3 และบันทึกแบบละเอียดกำลังถูกเขียนจากไฟล์ชื่อ Something.cpp ดังนั้นหากเปิดใช้งานแฟล็กนี้ บันทึกจะถูกเขียน มิฉะนั้นจะไม่ได้รับอนุญาต หมายเหตุ: การเอาชนะวัตถุประสงค์ของ -vmodule |
LogDetailedCrashReason (4) | เมื่อจัดการข้อขัดข้องตามค่าเริ่มต้น เหตุผลข้อขัดข้องโดยละเอียดจะถูกบันทึกไว้เช่นกัน (ปิดใช้งานโดยค่าเริ่มต้น) (ฉบับที่ #90) |
DisableApplicationAbortOnFatalLog (8) | อนุญาตให้ปิดใช้งานการทำแท้งแอปพลิเคชันเมื่อเข้าสู่ระบบโดยใช้ระดับ FATAL โปรดทราบว่าสิ่งนี้ใช้ไม่ได้กับตัวจัดการข้อขัดข้องเริ่มต้น เนื่องจากแอปพลิเคชันควรถูกยกเลิกหลังจากจัดการสัญญาณข้อขัดข้องแล้ว (ไม่ได้เพิ่มไว้ตามค่าเริ่มต้น) (ฉบับที่ 119) |
ImmediateFlush (16) | ล้างบันทึกพร้อมกับทุกรายการบันทึก (คำนึงถึงประสิทธิภาพ) - ปิดใช้งานตามค่าเริ่มต้น |
StrictLogFileSizeCheck (32) | ตรวจสอบให้แน่ใจว่าขนาดไฟล์บันทึกได้รับการตรวจสอบกับทุกบันทึก |
ColoredTerminalOutput (64) | เอาต์พุตของเทอร์มินัลจะมีสีสันหากเทอร์มินัลรองรับ |
MultiLoggerSupport (128) | เปิดใช้งานการสนับสนุนการใช้ตัวบันทึกหลายตัวเพื่อบันทึกข้อความเดียว (เช่น CLOG(INFO, "default", "network") << This will be logged using default and network loggers; ) |
DisablePerformanceTrackingCheckpointComparison (256) | ปิดใช้งานการเปรียบเทียบจุดตรวจ |
DisableVModules (512) | ปิดการใช้งาน vmodules |
DisableVModulesExtensions (1024) | ปิดใช้งานส่วนขยาย vmodules ซึ่งหมายความว่าหากคุณมี vmodule -vmodule=main*=4 มันจะครอบคลุมทุกอย่างที่ขึ้นต้นด้วย main โดยที่หากคุณไม่ได้กำหนดไว้ คุณจะได้รับการคุ้มครองสำหรับไฟล์ใดๆ ที่ขึ้นต้นด้วย main และลงท้ายด้วยส่วนขยายอย่างใดอย่างหนึ่งต่อไปนี้ .h .c .cpp .cc .cxx .-inl-.h .hxx .hpp โปรดทราบว่าการติดตาม vmodule ไม่ถูกต้อง -vmodule=main.=4 โดยไม่ได้กำหนดมาโครนี้ เนื่องจากจะตรวจสอบ main..c โดยสังเกตจุดสองจุด หากคุณต้องการให้สิ่งนี้ถูกต้อง โปรดดูที่แฟล็กการบันทึกด้านบน: AllowVerboseIfModuleNotSpecified '?' และ '' รองรับไวด์การ์ด |
HierarchicalLogging (2048) | เปิดใช้งานการบันทึกแบบลำดับชั้น สิ่งนี้ใช้ไม่ได้กับการบันทึกแบบละเอียด |
CreateLoggerAutomatically (4096) | สร้างตัวบันทึกโดยอัตโนมัติเมื่อไม่พร้อมใช้งาน |
AutoSpacing (8192) | เพิ่มช่องว่างโดยอัตโนมัติ เช่น LOG(INFO) << "DODGE" << "THIS!"; จะส่งออก "DODGE This!" |
FixedTimeFormat (16384) | ใช้ได้กับการติดตามประสิทธิภาพเท่านั้น - เพื่อป้องกันเวลาในการจัดรูปแบบ เช่น 1001 ms จะถูกบันทึกเหมือนเดิม แทนที่จะจัดรูปแบบเป็น 1.01 sec |
IgnoreSigInt (32768) | เมื่อแอปพลิเคชันขัดข้องจะเพิกเฉยต่อสัญญาณขัดจังหวะ |
คุณสามารถตั้งค่า/ยกเลิกการตั้งค่าสถานะเหล่านี้ได้โดยใช้ el::Loggers::addFlag
และ el::Loggers::removeFlag
แบบคงที่ คุณสามารถตรวจสอบเพื่อดูว่ามีการตั้งค่าสถานะบางอย่างหรือไม่โดยใช้ el::Loggers::hasFlag
ฟังก์ชั่นทั้งหมดเหล่านี้ใช้ enum ที่พิมพ์อย่างยิ่ง el::LoggingFlag
คุณสามารถตั้งค่าสถานะเหล่านี้ได้โดยใช้บรรทัดคำสั่ง
--logging-flags
arg คุณต้องเปิดใช้งานฟังก์ชันนี้โดยกำหนดมาโครELPP_LOGGING_FLAGS_FROM_ARG
(คุณจะต้องแน่ใจว่าใช้START_EASYLOGGINGPP(argc, argv)
เพื่อกำหนดค่าอาร์กิวเมนต์)
คุณยังสามารถตั้งค่าสถานะเริ่มต้น (เริ่มต้น) โดยใช้
ELPP_DEFAULT_LOGGING_FLAGS
และตั้งค่าตัวเลขสำหรับการตั้งค่าสถานะเริ่มต้น
ไปที่ด้านบน
ตารางต่อไปนี้จะอธิบายอาร์กิวเมนต์บรรทัดคำสั่งทั้งหมดที่คุณอาจใช้เพื่อกำหนดพฤติกรรมบางอย่าง คุณจะต้องเริ่มต้นอาร์กิวเมนต์ของแอปพลิเคชันโดยใช้ START_EASYLOGGINGPP(argc, argv)
ในฟังก์ชัน main(int, char**)
การโต้แย้ง | คำอธิบาย |
---|---|
-v | เปิดใช้งานการใช้คำฟุ่มเฟือยสูงสุด |
--v=2 | เปิดใช้งานการใช้คำฟุ่มเฟือยจนถึงระดับรายละเอียด 2 (ช่วงที่ถูกต้อง: 0-9) |
--verbose | เปิดใช้งานการใช้คำฟุ่มเฟือยสูงสุด |
-vmodule=MODULE_NAME | เปิดใช้งานการใช้คำฟุ่มเฟือยสำหรับไฟล์ที่เริ่มต้นด้วยหลักถึงระดับ 1 ไฟล์ที่เหลือจะขึ้นอยู่กับแฟล็กการบันทึก AllowVerboseIfModuleNotSpecified โปรดดูส่วนแฟล็กการบันทึกด้านบน สองโมดูลสามารถคั่นด้วยเครื่องหมายจุลภาค โปรดทราบว่า vmodules จะอยู่ในลำดับสุดท้ายก่อนการตรวจสอบอาร์กิวเมนต์สำหรับการบันทึกแบบละเอียด เช่น หากเรามี -v ในอาร์กิวเมนต์ของแอปพลิเคชันก่อน vmodules vmodules จะถูกละเว้น |
--logging-flags=3 | ตั้งค่าสถานะการบันทึก ตัวอย่าง ie, 3 จะตั้งค่าสถานะการบันทึกเป็น NewLineForContainer และ AllowVerboseIfModuleNotSpecified ดูส่วนธงการบันทึกด้านบนสำหรับรายละเอียดและค่าเพิ่มเติม ดูส่วนมาโครเพื่อปิดใช้งานฟังก์ชันนี้ |
--default-log-file=FILE | ตั้งค่าไฟล์บันทึกเริ่มต้นสำหรับตัวบันทึกที่มีอยู่และในอนาคต คุณอาจต้องการพิจารณากำหนด ELPP_NO_DEFAULT_LOG_FILE เพื่อป้องกันการสร้างไฟล์บันทึกว่างเปล่าเริ่มต้นในระหว่างการประมวลผลล่วงหน้า ดูส่วนมาโครเพื่อปิดใช้งานฟังก์ชันนี้ |
ไปที่ด้านบน
ตัวเลือกการบันทึกบางส่วนสามารถตั้งค่าได้ด้วยมาโคร นี่เป็นการตัดสินใจที่รอบคอบ เช่น หากเรากำหนด ELPP_THREAD_SAFE
ไว้ ฟังก์ชันการทำงานของเธรดที่ปลอดภัยทั้งหมดจะถูกเปิดใช้งาน ไม่เช่นนั้นจะปิดใช้งาน (ทำให้แน่ใจว่าโอเวอร์เฮดของความปลอดภัยของเธรดจะไปด้วย) เพื่อให้ง่ายต่อการจดจำและป้องกันข้อขัดแย้งที่อาจเกิดขึ้น แมโครทั้งหมดจะขึ้นต้นด้วย ELPP_
หมายเหตุ: แมโครทั้งหมดสามารถกำหนดได้ด้วยวิธีใดวิธีหนึ่งต่อไปนี้:
กำหนดมาโครโดยใช้ตัวเลือก -D
ของคอมไพเลอร์ เช่น ในกรณีของ g++
คุณจะต้องทำ g++ source.cpp ... -DELPP_SYSLOG -DELPP_THREAD_SAFE ...
( วิธีที่แนะนำ )
กำหนดมาโครภายใน "easylogging++.h"
(การกำหนดมาโครในไฟล์อื่นจะไม่ทำงาน)
ชื่อมาโคร | คำอธิบาย |
---|---|
ELPP_DEBUG_ASSERT_FAILURE | ยกเลิกแอปพลิเคชันเมื่อการยืนยันครั้งแรกล้มเหลว การยืนยันนี้เกิดจากการป้อนข้อมูลที่ไม่ถูกต้อง เช่น ไฟล์การกำหนดค่าที่ไม่ถูกต้อง เป็นต้น |
ELPP_UNICODE | เปิดใช้งานการสนับสนุน Unicode เมื่อเข้าสู่ระบบ ต้องใช้ START_EASYLOGGINGPP |
ELPP_THREAD_SAFE | เปิดใช้งานความปลอดภัยของเธรด - ตรวจสอบให้แน่ใจว่า -lpthread เชื่อมโยงสำหรับ linux |
ELPP_FORCE_USE_STD_THREAD | บังคับให้ใช้ไลบรารีมาตรฐาน C++ สำหรับเธรด (มีประโยชน์เฉพาะเมื่อใช้ ELPP_THREAD_SAFE |
ELPP_FEATURE_CRASH_LOG | ใช้ได้กับ GCC เท่านั้น เปิดใช้งาน Stacktrace เมื่อแอปพลิเคชันขัดข้อง |
ELPP_DISABLE_DEFAULT_CRASH_HANDLING | ปิดใช้งานการจัดการข้อขัดข้องเริ่มต้น คุณสามารถใช้ el::Helpers::setCrashHandler เพื่อใช้ตัวจัดการของคุณเอง |
ELPP_DISABLE_LOGS | ปิดการใช้งานบันทึกทั้งหมด - (กำลังประมวลผลล่วงหน้า) |
ELPP_DISABLE_DEBUG_LOGS | ปิดใช้งานบันทึกการแก้ไขข้อบกพร่อง - (กำลังประมวลผลล่วงหน้า) |
ELPP_DISABLE_INFO_LOGS | ปิดการใช้งานบันทึกข้อมูล - (กำลังประมวลผลล่วงหน้า) |
ELPP_DISABLE_WARNING_LOGS | ปิดใช้งานบันทึกคำเตือน - (กำลังประมวลผลล่วงหน้า) |
ELPP_DISABLE_ERROR_LOGS | ปิดใช้งานบันทึกข้อผิดพลาด - (กำลังประมวลผลล่วงหน้า) |
ELPP_DISABLE_FATAL_LOGS | ปิดการใช้งานบันทึกร้ายแรง - (กำลังประมวลผลล่วงหน้า) |
ELPP_DISABLE_VERBOSE_LOGS | ปิดใช้งานบันทึกรายละเอียด - (กำลังประมวลผลล่วงหน้า) |
ELPP_DISABLE_TRACE_LOGS | ปิดใช้งานบันทึกการติดตาม - (กำลังประมวลผลล่วงหน้า) |
ELPP_FORCE_ENV_VAR_FROM_BASH | หากไม่พบตัวแปรสภาพแวดล้อม ให้บังคับโดยใช้คำสั่ง bash ทางเลือกเพื่อค้นหาค่า เช่น whoami สำหรับชื่อผู้ใช้ (อย่าใช้มาโครนี้กับ LD_PRELOAD สำหรับไลบรารีที่ใช้งาน Easylogging++ อยู่แล้ว ไม่เช่นนั้นคุณจะจบลงที่ STACK OVERFLOW สำหรับกระบวนการ ( popen ) (ดูปัญหา #87 สำหรับรายละเอียด)) |
ELPP_DEFAULT_LOG_FILE | ชื่อไฟล์แบบเต็มที่คุณต้องการให้สร้างไฟล์เริ่มต้น คุณต้องฝังค่าของมาโครนี้ด้วยเครื่องหมายคำพูด เช่น -DELPP_DEFAULT_LOG_FILE='"logs/el.gtest.log"' สังเกตเครื่องหมายคำพูดคู่ภายในเครื่องหมายคำพูดเดี่ยว เครื่องหมายคำพูดคู่คือค่าสำหรับ const char* และเครื่องหมายคำพูดเดี่ยวระบุค่าของ มาโคร |
ELPP_NO_LOG_TO_FILE | ปิดใช้งานการบันทึกไฟล์ตั้งแต่แรก |
ELPP_NO_DEFAULT_LOG_FILE | หากคุณไม่ต้องการเริ่มต้นไลบรารีด้วยไฟล์บันทึกเริ่มต้น ให้กำหนดมาโครนี้ สิ่งนี้จะบันทึกลงในอุปกรณ์ null สำหรับยูนิกซ์และ windows ในแพลตฟอร์มอื่น คุณอาจได้รับข้อผิดพลาด และคุณจะต้องใช้ ELPP_DEFAULT_LOG_FILE (ยินดีรับ PR สำหรับอุปกรณ์ว่างของแพลตฟอร์มอื่นมากที่สุด) |
ELPP_FRESH_LOG_FILE | ไม่ต้องต่อท้ายไฟล์บันทึกทุกครั้งที่สร้างไฟล์บันทึก (ใช้ด้วยความระมัดระวังเนื่องจากอาจทำให้เกิดผลลัพธ์ที่ไม่คาดคิดสำหรับผู้ใช้บางราย) |
ELPP_DEBUG_ERRORS | หากคุณต้องการค้นหาข้อผิดพลาดภายในที่เกิดจาก Easylogging++ ซึ่งอาจเป็นเพราะการกำหนดค่าหรืออย่างอื่น คุณสามารถเปิดใช้งานได้โดยการกำหนดมาโครนี้ คุณจะได้รับข้อผิดพลาดในเอาต์พุตมาตรฐาน เช่น เทอร์มินัลหรือพรอมต์คำสั่ง |
ELPP_DISABLE_CUSTOM_FORMAT_SPECIFIERS | บังคับให้ปิดใช้งานตัวระบุรูปแบบที่กำหนดเอง |
ELPP_DISABLE_LOGGING_FLAGS_FROM_ARG | บังคับให้ปิดการใช้งานความสามารถในการตั้งค่าสถานะการบันทึกโดยใช้อาร์กิวเมนต์บรรทัดคำสั่ง |
ELPP_DISABLE_LOG_FILE_FROM_ARG | บังคับให้ปิดการใช้งานความสามารถในการตั้งค่าไฟล์บันทึกเริ่มต้นจากอาร์กิวเมนต์บรรทัดคำสั่ง |
ELPP_WINSOCK2 | บนระบบ windows บังคับให้ใช้ winsock2.h แทน winsock.h เมื่อกำหนด WIN32_LEAN_AND_MEAN |
ELPP_CUSTOM_COUT (ขั้นสูง) | แก้ไขเป็นค่า เช่น #define ELPP_CUSTOM_COUT qDebug() หรือ #define ELPP_CUSTOM_COUT std::cerr สิ่งนี้จะใช้ค่าสำหรับเอาต์พุตมาตรฐาน (แทนที่จะใช้ std::cout |
ELPP_CUSTOM_COUT_LINE (ขั้นสูง) | ใช้กับ ELPP_CUSTOM_COUT เพื่อกำหนดวิธีเขียนบรรทัดบันทึกด้วย cout แบบกำหนดเอง เช่น #define ELPP_CUSTOM_COUT_LINE(msg) QString::fromStdString(msg).trimmed() |
ELPP_NO_CHECK_MACROS | อย่ากำหนดแมโคร CHECK |
ELPP_NO_DEBUG_MACROS | อย่ากำหนดแมโคร DEBUG |
ELPP_UTC_DATETIME | ใช้เวลา UTC แทนเวลาท้องถิ่น (โดยพื้นฐานแล้วใช้ gmtime แทน localtime และฟังก์ชันครอบครัว) |
ELPP_NO_GLOBAL_LOCK | อย่าล็อคที่เก็บข้อมูลทั้งหมดเมื่อจัดส่ง ควรใช้ด้วยความระมัดระวัง ดูฉบับที่ #580 |
ไปที่ด้านบน
หากคุณต้องการอ่านการกำหนดค่าของตัวบันทึกบางตัว คุณสามารถทำได้โดยใช้ฟังก์ชัน typedConfigurations()
ในคลาส 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();
ไปที่ด้านบน
การเข้าสู่ระบบ easylogging++ ทำได้โดยใช้การรวบรวมมาโคร นี่คือการช่วยให้ผู้ใช้ง่ายขึ้น และเพื่อป้องกันไม่ให้พวกเขาทราบรายละเอียดเพิ่มเติมที่ไม่จำเป็นเกี่ยวกับวิธีการทำงานต่างๆ
คุณได้รับมาโครพื้นฐานสองมาโครที่คุณสามารถใช้เพื่อเขียนบันทึก:
LOG(LEVEL)
CLOG(LEVEL, logger ID)
LOG
ใช้ตัวบันทึก 'เริ่มต้น' ในขณะที่อยู่ใน CLOG (บันทึกแบบกำหนดเอง) คุณระบุ ID ตัวบันทึก สำหรับระดับ โปรดดูที่การกำหนดค่า - ส่วนระดับด้านบน ตัวบันทึกที่แตกต่างกันอาจมีการกำหนดค่าที่แตกต่างกัน ขึ้นอยู่กับความต้องการของคุณ คุณยังสามารถเขียนมาโครแบบกำหนดเองเพื่อเข้าถึงตัวบันทึกแบบกำหนดเองได้เช่นกัน คุณยังมีมาโครที่แตกต่างกันสำหรับการบันทึกแบบละเอียดซึ่งอธิบายไว้ในส่วนด้านล่าง นี่เป็นตัวอย่างง่ายๆ ของการใช้มาโครเหล่านี้หลังจากที่คุณเริ่มต้น easylogging++ แล้ว
LOG (INFO) << "This is info log";
CLOG (ERROR, " performance " ) << "This is info log using performance logger";
มีอีกวิธีหนึ่งในการใช้มาโครเดียวกัน เช่น LOG
(และมาโครที่เกี่ยวข้อง) นี่คือที่คุณกำหนดแมโคร ELPP_DEFAULT_LOGGER
และ ELPP_DEFAULT_PERFORMANCE_LOGGER
ด้วย ID คนตัดไม้ที่ลงทะเบียนไว้แล้ว และตอนนี้เมื่อคุณใช้แมโคร LOG
แมโครจะใช้ตัวบันทึกที่ระบุแทนตัวบันทึก default
โดยอัตโนมัติ โปรดทราบว่าควรกำหนดสิ่งนี้ในไฟล์ต้นฉบับแทนที่จะเป็นไฟล์ส่วนหัว ทั้งนี้เพื่อที่ว่าเมื่อเรารวมส่วนหัว เราจะได้ไม่ใช้ตัวบันทึกที่ไม่ถูกต้องโดยไม่ตั้งใจ
ตัวอย่างสั้นๆ อยู่ที่นี่
# 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
}
คุณยังสามารถเขียนบันทึกได้โดยใช้คลาส
Logger
โดยตรง คุณลักษณะนี้มีอยู่ในคอมไพเลอร์ที่รองรับเทมเพลตที่หลากหลาย คุณสามารถสำรวจเพิ่มเติมได้โดยดูที่samples/STL/logger-log-functions.cpp
ไปที่ด้านบน
Easylogging++ ให้บางแง่มุมของการบันทึก หนึ่งในแง่มุมเหล่านี้คือการบันทึกแบบมีเงื่อนไข กล่าวคือ บันทึกจะถูกเขียนก็ต่อเมื่อเงื่อนไขบางประการเป็นไปตามนั้น สิ่งนี้มีประโยชน์มากในบางสถานการณ์ มาโครตัวช่วยลงท้ายด้วย _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)"
มาโครเดียวกันนี้พร้อมใช้งานสำหรับการบันทึกแบบละเอียดด้วย V
ในตอนเริ่มต้น เช่น VLOG_IF
และ CVLOG_IF
ดูส่วนการบันทึกแบบละเอียดด้านล่างสำหรับข้อมูลเพิ่มเติม คุณอาจมีเงื่อนไขที่ซับซ้อนได้ตามที่คุณต้องการ ขึ้นอยู่กับความต้องการของคุณ
ไปที่ด้านบน
การบันทึกเป็นครั้งคราวเป็นอีกแง่มุมที่มีประโยชน์ของการบันทึกด้วย Easylogging++ ซึ่งหมายความว่าจะมีการเขียนบันทึกหากถูกโจมตีในช่วงเวลาใดเวลาหนึ่งหรือบางส่วนของช่วงเวลาหนึ่ง เช่น ทุกๆ การโจมตีครั้งที่ 10 หรือครั้งที่ 100 หรือการโจมตีครั้งที่ 2 มาโครตัวช่วยลงท้ายด้วย _EVERY_N
;
LOG_EVERY_N(n, LEVEL)
CLOG_EVERY_N(n, LEVEL, logger ID)
มีวิธีอื่นในการบันทึกเช่นกัน โดยขึ้นอยู่กับจำนวนการเข้าชม มาโครที่มีประโยชน์เหล่านี้ได้แก่
LOG_AFTER_N(n, LEVEL)
; บันทึกเฉพาะเมื่อเรามีจำนวนการเข้าชมถึง n
เท่านั้นLOG_N_TIMES(n, LEVEL)
; บันทึก n ครั้ง 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
แมโครเวอร์ชันเดียวกันพร้อมใช้งานสำหรับโหมด
DEBUG
เท่านั้น แมโครเหล่านี้ขึ้นต้นด้วยD
(สำหรับการดีบัก) ตามด้วยชื่อเดียวกัน เช่นDLOG
เพื่อบันทึกเฉพาะในโหมดแก้ไขข้อบกพร่อง (เช่น เมื่อกำหนด_DEBUG
หรือไม่ได้กำหนดNDEBUG
)
ไปที่ด้านบน
printf
ชอบการบันทึก สำหรับคอมไพเลอร์ที่รองรับเทมเพลต variadic ของ C++11 ความสามารถในการบันทึกเช่น "printf" จะพร้อมใช้งาน ทำได้โดยใช้คลาส Logger
คุณลักษณะนี้เป็นเธรดและประเภทที่ปลอดภัย (เนื่องจากเราไม่ได้ใช้มาโครใด ๆ เช่น LOG(INFO)
ฯลฯ )
ทำได้สองขั้นตอน:
el::Loggers::getLogger(<logger_id>);
ข้อแตกต่างเพียงอย่างเดียวจาก printf
คือการบันทึกโดยใช้ฟังก์ชันเหล่านี้ต้องใช้ %v
สำหรับแต่ละ arg (นี่เป็นเพื่อความปลอดภัยของประเภท) แทนตัวระบุรูปแบบที่กำหนดเอง คุณสามารถหลีกเลี่ยงสิ่งนี้ได้ %%v
ต่อไปนี้เป็นลายเซ็นฟังก์ชันต่างๆ:
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 );
%file
,%func
%line
และ%loc
ตัวระบุรูปแบบจะไม่ทำงานกับprintf
เช่นการบันทึก
ไปที่ด้านบน
คุณสามารถส่งข้อความของคุณไปยังเครือข่าย แต่คุณจะต้องดำเนินการตามวิธีของคุณเองโดยใช้ Log Dispatcher API เราได้เขียนตัวอย่างการทำงานเต็มรูปแบบเพื่อจุดประสงค์นี้ โปรดดูตัวอย่างการส่งไปยังเครือข่าย
ไปที่ด้านบน
การบันทึกแบบละเอียดมีประโยชน์ในทุกซอฟต์แวร์เพื่อบันทึกข้อมูลมากกว่าปกติ มีประโยชน์มากสำหรับการแก้ไขปัญหา ต่อไปนี้เป็นมาโครเฉพาะการบันทึกแบบละเอียด
VLOG(verbose-level)
CVLOG(verbose-level, logger ID)
ไปที่ด้านบน
การบันทึกแบบละเอียดยังมีลักษณะการบันทึกแบบมีเงื่อนไขและเป็นครั้งคราวด้วย เช่น
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)
ไปที่ด้านบน
ระดับรายละเอียดคือระดับรายละเอียดที่สามารถมีได้ตั้งแต่ 1-9 ระดับรายละเอียดจะไม่ทำงานเว้นแต่คุณจะตั้งค่าอาร์กิวเมนต์ของแอปพลิเคชันไว้ โปรดอ่านส่วนข้อโต้แย้งของแอปพลิเคชันเพื่อทำความเข้าใจเพิ่มเติมเกี่ยวกับการบันทึกแบบละเอียด
หากต้องการเปลี่ยนระดับรายละเอียดอย่างรวดเร็ว โปรดใช้ Loggers::setVerboseLevel(base::type::VerboseLevel)
หรือที่เรียกว่าฟังก์ชัน Loggers::setVerboseLevel(int)
(คุณสามารถตรวจสอบระดับ verbose ปัจจุบันได้โดย Loggers::verboseLevel()
ไปที่ด้านบน
คุณสามารถใช้มาโคร VLOG_IS_ON(verbose-level)
เพื่อตรวจสอบว่ามีการบันทึกบางอย่างเปิดอยู่สำหรับไฟล์ต้นฉบับสำหรับระดับรายละเอียดที่ระบุหรือไม่ สิ่งนี้จะคืนค่าบูลีนที่คุณสามารถฝังลงในเงื่อนไขได้
if (VLOG_IS_ON( 2 )) {
// Verbosity level 2 is on for this file
}
ไปที่ด้านบน
VModule เป็นฟังก์ชันสำหรับการบันทึกแบบละเอียด (ดังที่กล่าวไว้ในตารางด้านบน) ซึ่งคุณสามารถระบุความละเอียดด้วยโมดูล/ไฟล์ต้นฉบับ ต่อไปนี้เป็นตัวอย่างพร้อมคำอธิบาย vmodule ใดๆ ด้านล่างเริ่มต้นด้วย -vmodule=
และ LoggingFlag::DisableVModulesExtensions
ไม่ได้ตั้งค่าสถานะ Vmodule สามารถปิดการใช้งานได้อย่างสมบูรณ์โดยเพิ่มแฟล็ก LoggingFlag::DisableVModules
ตัวอย่างด้วยการตั้งค่าสถานะ 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}