ตัวบันทึก C ++ ที่ปลอดภัยที่สุดสำหรับเธรดคืออะไร? [ปิด]


85

ฉันกำลังทำงานกับแอปพลิเคชันมัลติเธรดที่สำคัญด้านประสิทธิภาพ ฉันดูการบันทึก rlog, Ace และ Boost ฉันเลือก rlog เพราะฉันอ่านว่าเร็วที่สุด (เมื่อปิดใช้งานการบันทึกจะมีค่าใช้จ่ายน้อยที่สุด)

ปัญหาที่ฉันมีคือมันแสดงชื่อไฟล์หมายเลขบรรทัด ฯลฯ แม้ในโหมดรีลีส หากคุณสามารถบอกวิธีปิดข้อมูลนั้นได้ปัญหาของฉันอาจได้รับการแก้ไข ไม่ว่าในกรณีใดตัวบันทึกที่มีประสิทธิภาพสูงสุดใน C ++ สำหรับสถานการณ์ของฉันคืออะไร?


23
ฉันสรุปได้อย่างรวดเร็วว่าการเพิ่มมีทุกอย่าง แม้ว่ามันจะไม่ปรากฏเมื่อคุณมองอีกครั้งก็ตาม!
Martin Beckett

21
ฉันไม่เห็นว่าทำไมถึงปิด เขาถามคำถามที่เจาะจงและสามารถวัดผลได้ หากเราละเลยคอมไพเลอร์ที่ใช้อยู่อาจมี "ตัวบันทึก C ++ ที่ปลอดภัยต่อเธรดที่มีประสิทธิภาพสูงสุด" เพียงตัวเดียว Stackoverflow วันนี้ ....
JohnJohn


1
ดูที่github.com/gabime/spdlog
maxik

คำตอบ:


35

น่าเสียดายที่ฉันไม่สามารถลงคะแนนได้ในขณะนี้ เท่าที่ฉันสามารถพูดได้ไม่เคยใช้อึเช่น Apache log4cxx มันมีข้อบกพร่องร้ายแรง

  1. 0.9 สาขาสุดท้ายคือ 0.9.7 และยังคงมีการรั่วไหลของหน่วยความจำเนื่องจากทุกคลาสที่มีสมาชิกเสมือนไม่มี dtor เสมือน
  2. รุ่นใหม่ล่าสุด 0.10.x สูญเสียฟังก์ชันการทำงานจำนวนมากจาก 0.9.x และไม่สามารถใช้งานร่วมกันได้ คุณถูกบังคับให้เขียนโค้ดของคุณเองจำนวนมาก
  3. ดูเหมือนว่าโครงการทั้งหมดจะไม่ได้รับการดูแล ประกาศเปิดตัว 0.11.xx มา 2 ปีแล้ว

ในความคิดของฉันคุณควรไปด้วยการเพิ่ม


10
"ทุกคลาสที่มีสมาชิกเสมือนไม่มี virtual dtor" ไม่เชื่อก็ต้องตรวจสอบ Apache ที่ไม่น่ารักเลย
ManuelSchneid3r

6
คุณสามารถลงคะแนนได้เลย :)
คดีฟ้องร้องของ Fund Monica

5
>> "ทุกชั้นเรียนที่มีสมาชิกเสมือนไม่มี dtor เสมือน" แม้ว่าสิ่งนี้จะไม่ยอดเยี่ยม แต่ก็ไม่ได้หมายความว่าจะทำให้เกิดปัญหา จะเป็นเพียงปัญหาเท่านั้นหากคลาสถูกลบโดยไดนามิกแทนที่จะเป็นประเภทคงที่ สิ่งนี้เพียงอย่างเดียวไม่ได้เป็นปัญหาในตัวเองและไม่ได้หมายความว่าหน่วยความจำรั่วไหล
evilrix

2
@evilrix ชั้นเรียนมีสมาชิกเสมือน แต่ไม่มี dtor เสมือน ชั้นเรียนไม่มีตัวดำเนินการใหม่ที่ได้รับการป้องกัน / ส่วนตัว อันที่จริงนี่เป็นรหัสที่น่าสงสารและไม่ดีที่ไม่ควรได้รับการเผยแพร่ แล้วประเด็นของคุณคืออะไร?
kirsche40

@ kirsche40 ฉันคิดว่าประเด็นของฉันค่อนข้างชัดเจน คุณไม่เข้าใจคำอธิบายของคำว่ามาตรฐานอย่างไร อนุญาตให้ฉันเปลี่ยนวลี: เป็นปัญหาหากคุณพยายามลบผ่านตัวชี้คลาสพื้นฐาน ในกรณีนั้นหากตัวทำลายไม่ใช่เสมือนพฤติกรรมจะไม่ได้กำหนดไว้ มาตรฐานมีความชัดเจนผิดปกติในประเด็นนี้ ฉันค่อนข้างแน่ใจว่าไม่มีสิ่งที่ฉันพูดหมายความว่าฉันสนับสนุนให้ OP ใช้สิ่งนี้เป็นการนำไปใช้
evilrix

19

Pantheiosถือเป็นไลบรารีบันทึก C ++ที่มีประสิทธิภาพดีที่สุดและอ้างว่าเป็นไลบรารีเดียวที่ปลอดภัย 100% (ดูบทความนี้เกี่ยวกับไลบรารีที่เกี่ยวข้องซึ่งอธิบายว่าเหตุใดไลบรารีที่ใช้ printf () / iostream จึงไม่เป็นประเภท - ปลอดภัย)


4
และแม้ว่าพวกเขาจะไม่ชอบ Pantheios แต่รายชื่อ 'คู่แข่ง' ในหน้าที่คุณเชื่อมโยงก็เป็นข้อมูล
jwd

10

ผมเคยประสบความสำเร็จกับ log4cxx ที่http://logging.apache.org/log4cxx/index.html เป็น Log4j Logger รุ่น C ++ ที่เป็นที่นิยมและง่ายต่อการกำหนดค่าผ่านไฟล์ conf หรือในรหัส ค่าโสหุ้ยเมื่อปิดใช้งานมีน้อยที่สุด (การเรียกวิธีการและการเปรียบเทียบจำนวนเต็ม)

รูปแบบสำหรับเอาต์พุตไปยังบันทึกถูกกำหนดโดยรูปแบบการแปลงที่สามารถทำได้ง่าย ๆ เช่นวันที่ / เวลาและข้อความ นอกจากนี้ยังจัดการการ จำกัด ขนาดไฟล์โรลโอเวอร์ ฯลฯ คุณยังสามารถกำหนดค่ารูปแบบต่างๆสำหรับข้อผิดพลาดและแหล่งที่มาต่างๆ


9

นี่คือวิธีที่คุณสามารถปิดข้อมูลเพิ่มเติมที่ rlog ให้ (เช่นชื่อไฟล์หมายเลขบรรทัด ฯลฯ ) เมื่อคุณเริ่มต้น rlog ในmain()ฟังก์ชันของคุณ(หรือที่ใดก็ตาม) คุณอาจทำสิ่งต่อไปนี้:

rlog::RLogInit(argc, argv);
rlog::StdioNode slog (2, rlog::StdioNode::OutputColor);
slog.subscribeTo( RLOG_CHANNEL("error") );

อาร์กิวเมนต์ที่สองใช้StdioNodeสำหรับแฟล็กเพื่อควบคุมเอาต์พุต ตรวจสอบเอกสาร rlog (สามารถสร้างด้วย Doxygen) สำหรับรายการแฟล็กที่เป็นไปได้ทั้งหมด ตัวอย่างในตัวอย่างนี้ทำให้ rlog เป็นสีของผลลัพธ์ตามความรุนแรงเท่านั้นโดยไม่ต้องเพิ่มข้อมูลอื่น ๆ


9

คุณอาจต้องการพิจารณาระบบ Logog Logog มีฟังก์ชันประเภทนี้ แต่ไม่มีการอ้างอิงรหัสโดยนัยที่ Pantheios มี logog เป็นเธรดที่ปลอดภัยและช่วยให้สามารถควบคุมประเภทของข้อความที่บันทึก ณ จุดใดก็ได้

ฉันเป็นผู้เขียนและผู้ดูแล Logog ดังนั้นความคิดเห็นของฉันจึงค่อนข้างเอนเอียง แต่ฉันได้ตรวจสอบ rlog, Pantheios และระบบบันทึกอื่น ๆ ก่อนที่จะใช้ระบบนี้

https://github.com/johnwbyrd/logog


อัปเดตลิงค์ขอบคุณสำหรับบันทึก
johnwbyrd

4

ค่าใช้จ่ายบางส่วนอาจเกิดขึ้นในมาโคร / สตรีมของคุณ คุณต้องระมัดระวังอย่างมากที่จะไม่เขียนสตริงที่กำลังบันทึกเมื่อปิดใช้งานการบันทึก

การใช้สตรีมและตัวดำเนินการ?: อย่างชาญฉลาดช่วยให้คุณทำเช่นนั้นได้เช่นเดียวกับมาโคร



2

อาจจะเป็นpantheios
แม้ว่าฉันจะไม่รู้ว่ามันปลอดภัยหรือไม่ ...


8
ปลอดภัยต่อเกลียว
dcw

2

ลองใช้ c-log lib https://github.com/0xmalloc/c-logซึ่งเป็นlog lib ที่รวดเร็วเสถียรและปลอดภัยสำหรับภาษา C / C ++


9
น่าเสียดายที่ c-log อยู่ภายใต้ GPL ซึ่งหมายความว่าคุณไม่สามารถใช้กับซอฟต์แวร์ที่ไม่ใช่ GPL ที่เข้ากันได้ (เช่นซอฟต์แวร์เชิงพาณิชย์ที่เป็นกรรมสิทธิ์) ทำให้ไม่สามารถใช้งานได้สำหรับผู้ใช้จำนวนมาก
chris

ตอนนี้ไม่มี LICENSE ในgithub.com/0xmalloc/c-log ฟรีสำหรับการใช้งานเชิงพาณิชย์และส่วนตัว
user2538508

3
คุณเป็นผู้เขียน c-log หรือไม่? ถ้าเป็นเช่นนั้นฉันขอแนะนำให้คุณระบุอย่างชัดเจน (ในหน้า Github ไฟล์ readme และความคิดเห็นในซอร์สโค้ด) ที่อนุญาตให้ใช้งานซอฟต์แวร์ของคุณ แม้ว่าจะเป็นสาธารณสมบัติ (ซึ่งฉันไม่แนะนำ!) คุณควรระบุอย่างชัดเจน ดังที่กล่าวมามีใบอนุญาตโอเพนซอร์สที่ "เป็นมิตรกับการค้า" (เช่นอนุญาต) ให้เลือกมากมายซึ่งเป็นที่นิยมมากที่สุด ได้แก่ Apache, BSD หรือ MIT
chris

ลินุกซ์เท่านั้น? ( #include <pthread.h>... )
rustyx
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.