การบันทึกไลบรารีสำหรับเกม (c ++) [ปิด]


15

ฉันรู้ไลบรารีการบันทึกจำนวนมาก แต่ไม่ได้ทดสอบมากนัก (GoogleLog, Pantheios, บูสเตอร์ที่กำลังจะมาถึง :: log library ... )

ในเกมโดยเฉพาะในเกมมัลติเพลเยอร์ระยะไกลและเกมมัลติเธรดการบันทึกมีความสำคัญต่อการดีบั๊กแม้ว่าคุณจะลบบันทึกทั้งหมดในตอนท้าย

สมมติว่าฉันกำลังสร้างเกมบนพีซี (ไม่ใช่คอนโซล) ที่ต้องการบันทึก (หลายคนและหลายเธรดและ / หรือมัลติโพรเซส) และฉันมีเหตุผลที่ดีในการค้นหาไลบรารีสำหรับการบันทึก (เช่นฉันไม่มีเวลาหรือ ไม่มั่นใจในความสามารถในการเขียนอย่างถูกต้องสำหรับกรณีของฉัน)

สมมติว่าฉันต้องการ:

  1. ประสิทธิภาพ
  2. ใช้งานง่าย (อนุญาตให้สตรีมมิ่งหรือจัดรูปแบบหรืออะไรทำนองนั้น)
  3. ความน่าเชื่อถือ (ไม่รั่วไหลหรือผิดพลาด!)
  4. ข้ามแพลตฟอร์ม (อย่างน้อย Windows, MacOSX, Linux / Ubuntu)

ห้องสมุดบันทึกข้อมูลใดที่คุณอยากจะแนะนำ?

ขณะนี้ฉันคิดว่า boost :: log เป็นไฟล์ที่ยืดหยุ่นที่สุด (คุณสามารถเข้าสู่ระบบจากระยะไกลได้!) แต่ยังไม่มีการอัปเดตประสิทธิภาพที่ดี : มีประสิทธิภาพสูง แต่ยังไม่ออก Pantheios มักถูกอ้างถึง แต่ฉันไม่มีคะแนนเปรียบเทียบประสิทธิภาพและการใช้งาน ฉันใช้ lib ของตัวเองมานาน แต่ฉันรู้ว่ามันไม่ได้จัดการมัลติเธรดดังนั้นมันจึงเป็นปัญหาใหญ่แม้ว่ามันจะเร็วพอ Google Log ดูน่าสนใจฉันแค่ต้องทดสอบมัน แต่ถ้าคุณเปรียบเทียบ libs เหล่านั้นแล้วและอีกมากมายคำแนะนำของคุณอาจใช้งานได้ดี

เกมมักเรียกร้องประสิทธิภาพในขณะที่ซับซ้อนในการดีบักดังนั้นจึงเป็นการดีที่จะทราบว่าไลบรารีการบันทึกที่ในกรณีเฉพาะของเรานั้นมีข้อดีที่ชัดเจน


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

ถูกต้อง แต่ฉันสมมติว่าโซลูชันการบันทึกแบบ "สมบูรณ์" จะช่วยให้ผู้ใช้สามารถตั้งค่าบันทึกประเภทต่างๆได้ตามที่คุณอธิบาย หากคุณพบว่าความแม่นยำนี้สำคัญในคำถามโปรดเป็นแขกของฉันและเพิ่มลงในคำถาม
Klaim

คำตอบ:


8

เข้าสู่ระบบโดยใช้ซ็อกเก็ต (ใด ๆ ที่ห่อหุ้มซ็อกเก็ตสามารถพอ) + เว็บเบราว์เซอร์websocket => เครื่องมือการเข้าสู่ระบบที่หลากหลายมากที่สุดที่เป็นไปได้ไม่สร้างความรำคาญจะได้รับชั่วโมงของการแก้จุดบกพร่องและหลีกเลี่ยงการเจ็บตา

  • asyncrhonous (ความเร็วตามที่กำหนดงานทั้งหมดบนเบราว์เซอร์)
  • ฟอร์แมตแล้ว (สี, ขนาด, ฯลฯ .. )
  • เชื่อถือได้ (ซ็อกเก็ต ... )
  • ข้ามแพลตฟอร์ม (เบราว์เซอร์)

ตอนนี้โบนัส:

  • การกรองแบบไดนามิกทำได้ง่ายมาก (ใช้ javascript regex หากจำเป็น)
  • พร้อมประวัติบันทึกหน่วยความจำและการเปรียบเทียบ (ข้อมูลจำเพาะ HTML5 ในฐานข้อมูล "ในเบราว์เซอร์")
  • วิธีที่ง่ายต่อการทำกราฟของข้อมูลใด ๆ บางคน (โดยใช้ SVG หรือผ้าใบหรืออะไร) เช่นหน่วยความจำ , การกระจายตัวของหน่วยความจำฯลฯ ...
  • วิธีง่ายๆในการสร้างกราฟ 2D ของข้อมูลใด ๆ ( เขตข้อมูลkd-tree เขตข้อมูลที่มีศักยภาพหรือแม้กระทั่งเพียงแค่การแปรผันของค่าตัวแปรหรือไม่ ฯลฯ )
  • อนุญาตการบันทึกระยะไกล (ใช้เบราว์เซอร์คอมพิวเตอร์เครื่องอื่น)
  • ใช้ html5 ในที่เก็บข้อมูลเบราว์เซอร์คุณสามารถจัดเก็บพารามิเตอร์เซสชันการบันทึก (ตัวกรองบันทึกปัจจุบัน ฯลฯ และแม้กระทั่งบันทึกในแต่ละรายการ)
  • ง่ายมากในการสร้างรายงานข้อผิดพลาดหรือลิงค์ตั๋ว trac เพียงแค่คลิกเดียว
  • ความสามารถในการย้อนกลับการบันทึกได้อย่างง่ายดายด้วยไทม์ไลน์กุย

และงานอื่น ๆ อีกมากมายนอกการบันทึก:

  • อนุญาตข้อมูล profiler (กราฟ ... )
  • ยังสามารถทำหน้าที่เป็นคอนโซล (ส่งคำสั่งจากเบราว์เซอร์) หรือแม้กระทั่งกับ GUI อย่างรวดเร็วโดยใช้ HTML หรือแม้แต่แฟลช UI
  • ภาพที่แตกต่างในเบราว์เซอร์ (ส่งภาพโดยใช้ซ็อกเก็ตและเปรียบเทียบในเบราว์เซอร์ที่ใช้ความสามารถพิกเซลภาพแคนวาส)
  • ฯลฯ ...

(เกือบทั้งหมดข้างต้นสามารถทำได้โดยใช้ซ็อกเก็ตแฟลชบันทึกความสามารถของฐานข้อมูล)

ตอนนี้ฉันรู้ว่ามันค่อนข้างนานในการตั้งค่าสิ่ง แต่มันเป็นช่วงเวลาที่ยาวนานของโปรเจ็กต์ด้วยสถานการณ์การดีบักอย่างหนัก (เช่นในเกม) มันเป็นสิ่งที่ทรงพลังที่สุดที่ฉันใช้ตั้งแต่ผู้ใช้ debuggers ...

หมายเหตุ 1: ข้อเสียเพียงอย่างเดียว => ตรวจสอบผลข้างเคียงอีกครั้งเมื่อทำการดีบั๊กเครือข่ายเกม (ส่งผลกระทบต่อขนาดบัฟเฟอร์ซ็อกเก็ตเวลาแฝงแบนด์วิดท์ ฯลฯ ... )

หมายเหตุ 2: broswer บางส่วนถูกปิดการใช้งานโดย websocket เริ่มต้นเนื่องจากเหตุผลด้านความปลอดภัยให้ตรวจสอบเกี่ยวกับ: ตั้งค่าสิ่งต่าง ๆ เพื่อให้แน่ใจว่าเปิดใช้งานแล้ว


1
แก้ไขให้ถูกต้องหากฉันผิด แต่สิ่งนี้ชี้ให้เห็นว่าจะส่งสัญญาณการบันทึกโดยตรงไปที่ใด ไลบรารีการบันทึกจริงจะอนุญาตให้ทำการกรองในเวลารวบรวม (ซึ่งเป็นสิ่งสำคัญหากประสิทธิภาพเป็นปัญหา) การจัดรูปแบบและจัดเตรียมไวยากรณ์ที่ใช้งานง่ายสำหรับการสร้างข้อความบันทึก
sbi

@sbi มันเป็นเรื่องทั่วโลกในการเปิดหรือปิดในด้านการใช้งาน "ไคลเอนต์บันทึกเบราว์เซอร์" ทำการกรองไวยากรณ์ แต่จะได้รับบันทึกทั้งหมดเสมอ มันรุนแรง แต่ขึ้นอยู่กับประสบการณ์ที่ในช่วง dev คุณควรบันทึกทุกอย่างเพื่อให้คุณสามารถจับ / ทำซ้ำข้อผิดพลาดที่คุณสะดุด หากคุณต้องปรับให้เหมาะสมมันเป็นเบราว์เซอร์ด้านอีกครั้ง: การใช้ซ็อกเก็ตที่คุณไม่ได้ผูกไว้กับการบันทึกโดยใช้สตริงคุณสามารถบันทึกข้อมูลไบนารี่ (Id + floats) ได้โดยตรงซึ่งเป็นตัวหนาเร็วกว่าสตริงอื่น ๆ ... การจับคู่ Id กับสตริงเบราว์เซอร์ด้าน ... )
Tuan Kuranes

1
ในขณะที่ฉันเห็นว่านี่เป็นจริงมากมันเป็นเพียงแบ็กเอนด์ของคนตัดไม้ (สิ่งที่ templog เรียกว่า "log sink", IIRC) ประสิทธิภาพเป็นหนึ่งในข้อกำหนดที่ระบุไว้ ฉันได้พบว่าฉันต้องเพิ่มคำสั่งบันทึกลงในชิ้นส่วนของรหัสในขณะที่ตรวจแก้จุดบกพร่อง แต่เมื่อมันขึ้นและใช้งานชิ้นส่วนของรหัสนี้จะช่างพูดเกินไปและจมน้ำตายสิ่งที่ฉันกำลังทำงานอยู่ในเสียงรบกวนและจะเสียค่าใช้จ่าย ประสิทธิภาพมากเกินไป ดังนั้นฉันต้องการที่จะสามารถลดระดับการบันทึกลงบนชิ้นส่วนของรหัสทั้งหมดด้วยการเปลี่ยนรหัสไม่กี่บรรทัด นั่นคือสิ่งที่เลเยอร์กลางของล็อก lib ทำเพื่อคุณ
sbi

@sbi: อาจต้องมีการวัดประสิทธิภาพ แต่มีโอกาสที่ไลบรารีการบันทึกที่ดีที่สุดแม้ในระดับการบันทึกต่ำสุดยังคงมีค่าใช้จ่ายมากกว่าไบนารีตัวบันทึกที่บันทึกทุกอย่าง ไม่มีแม้แต่ซีพียู "ไบนารีเพื่อถ่าน" เดียวที่สิ้นเปลือง ... ดังนั้นมันจึงเป็นคุณสมบัติที่มากกว่าและมีประสิทธิภาพมากกว่า
Tuan Kuranes

ก่อนที่เราจะตัดสินใจใช้ templog เราทำการทดสอบบางอย่าง หากการบันทึกถูกปิดใช้งานสำหรับความรุนแรงต้นกำเนิดหรือข้อความบันทึกเฉพาะใด ๆ และหากคอมไพเลอร์สามารถพบว่าไม่มีผลข้างเคียงในการประเมินพารามิเตอร์ VC จะสามารถเพิ่มประสิทธิภาพของการระเบิดได้อย่างสมบูรณ์ บันทึกคำสั่งลงในความว่างเปล่า และเมื่อพูดถึงความเร็วคุณจะไม่เอาชนะรหัสที่ไม่มีในตอนแรก
sbi

8

เมื่อพูดถึงประสิทธิภาพฉันพบว่าtemplogไม่แพ้ใครเลย มันใช้เทมเพลตนิพจน์เพื่อเลื่อนการประเมินผลการบันทึกคำสั่งจนกว่าจะได้รับการยอมรับว่าข้อมูลจะถูกบันทึกไว้ทั้งหมด เนื่องจากคุณสามารถปิดการบันทึกบางส่วนได้ (ขึ้นอยู่กับความรุนแรงต้นกำเนิดและผู้ชมเป้าหมายของข้อความบันทึก) คำสั่งการบันทึกเหล่านี้บางส่วนจึงสามารถตัดทิ้งเป็นรหัสศูนย์โดยคอมไพเลอร์สำหรับการสร้างรีลีส (ฉันได้เห็นสิ่งนี้เกิดขึ้นจริงกับ VC)

เมื่อไม่นานมานี้มีห้องสมุดไม่มากนักและคนอื่น ๆ ใน SO พบว่าลำตัวขาดในบางเรื่อง แต่ใน บริษัท ที่ฉันเคยทำงานให้กับเราเราพบว่าผู้ชายคนนั้นตอบสนองได้ค่อนข้างมาก ได้รับสิทธิ์ในการเข้าถึงและเพิ่มรหัสบางส่วนเพื่อให้คุณอาจพบว่ามันคุ้มค่ากับการยิง

ในการระบุความต้องการของคุณ:

ประสิทธิภาพ

ดีที่สุดที่ฉันได้พบ โดยเฉพาะอย่างยิ่งความสามารถในการแยกข้อความบันทึกที่รวบรวมเวลาและให้คอมไพเลอร์สมบูรณ์กำจัดเหล่านั้นน่าสนใจมาก

ใช้งานง่าย (อนุญาตให้สตรีมมิ่งหรือจัดรูปแบบหรืออะไรทำนองนั้น)

มีข้อความข้อผิดพลาดคอมไพเลอร์ที่น่ากลัวคลาสสิกของสิ่งที่แม่แบบเมตาเมื่อคุณทำสิ่งผิดปกติ แต่เมื่อมันมาถึงความสะดวกในการใช้งานนี้

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

ยากที่จะเอาชนะ
อย่างไรก็ตามคุณอาจต้องสร้าง sink บันทึกของคุณเอง (ซึ่งเป็นที่ที่ข้อความบันทึกการทำงาน) นั้นเป็นไฟล์ที่ได้รับการจัดทำแพคเกจไว้ล่วงหน้า (stderr, file, Windows log เป็นต้น) ไม่ซับซ้อนเท่านี้ เนื่องจากประสิทธิภาพเป็นเป้าหมายหลักสิ่งที่อยู่ภายในทั้งหมดค่อนข้างซับซ้อน (เช่นตัวจัดรูปแบบข้อความบันทึกที่ค่อนข้างยุ่งเหยิงกับอ่างเก็บบันทึก) แต่เราก็เข้าใจได้ว่า เข้าใจว่าไม่ใช่เรื่องยากที่จะเขียนตัวจัดรูปแบบข้อความของคุณเองหรือเก็บบันทึก

ความน่าเชื่อถือ (ไม่รั่วไหลหรือผิดพลาด!)

เราใช้มันโดยไม่พบปัญหาที่ร้ายแรงเช่นนี้ ไม่มีการจัดสรรหน่วยความจำแบบไดนามิกอยู่ในนั้นดังนั้นจึงยากที่จะจินตนาการว่าทำสิ่งผิดปกติ แน่นอนเราเคยทดสอบกับโลกแห่งความจริงในผลิตภัณฑ์เดียว

ข้ามแพลตฟอร์ม (อย่างน้อย Windows, MacOSX, Linux / Ubuntu)

เมื่อเราใช้มันเราใช้มันใน Win32, OSX และการกระจาย Linux ที่แตกต่างกันหลายอย่าง Ubuntu ในหมู่พวกเขา

สำหรับมัลติเธรด: เราไม่ได้ใช้สิ่งนี้ แต่จากสิ่งที่ฉันจำเกี่ยวกับสถาปัตยกรรมของ lib ดูเหมือนว่าคุณจะต้องจัดการสิ่งนี้ในอ่างเก็บบันทึกเท่านั้น ICBWT


ขอบคุณฉันไม่รู้จักอันนี้ ดูเหมือนว่า Boost :: log แบบง่าย ๆ (และนักแสดง) อย่างน้อยก็ในความคิดดั้งเดิม
Klaim

@ คำติชม: ฉันไม่คิดว่าบูสต์จะมีอะไรให้เมื่อฉันดูไลบรารีการบันทึก C ++ ครั้งสุดท้ายดังนั้นฉันจึงไม่รู้เกี่ยวกับการเพิ่ม :: log
sbi

1
@Joe: คุณเข้าใจคำว่า"เทมเพลตการแสดงออก" หรือไม่?
sbi

1
ฉันคิดว่าฉันทำ แต่ตอนนี้ฉันได้ดาวน์โหลดและเริ่มอ่านซอร์สโค้ด templog และปรากฏว่า C ++ ทำให้ฉันโกรธอีกครั้ง

1
@sbi: ส่วนหนึ่งของความสับสนของฉันคือคำสั่งของคุณ "ส่งผ่านหลายชั้น" - ในภาษาอังกฤษในเวลาเดียวกันอาจหมายถึงทันทีหรือร่วมกันซึ่งในกรณีนี้เป็นตรงกันข้าม ฉันอ่านมันเป็นครั้งแรกและคุณ (ตอนนี้ชัดเจนสำหรับฉัน) หมายถึงที่สอง ขอบคุณที่สละเวลาอธิบาย

1

คุณอาจต้องการพิจารณาไลบรารี logog ที่http://www.logog.orgซึ่งฉันคิดว่าอาจตอบสนองความต้องการของคุณ Caveat: ฉันเขียนมัน

ดูเพิ่มเติมคำตอบของคนอื่น ๆ ที่/programming/696321/best-logging-framework-for-native-c


0

คุณอาจสนใจชุดเครื่องมือBaical :

  • โอเพ่นซอร์สและข้ามแพลตฟอร์ม (Win, Linux, x86 / x64) ไลบรารี่สำหรับบันทึก, ร่องรอย & telemetry - P7
  • รวดเร็วอย่างไม่น่าเชื่อ (ออกแบบมาสำหรับอุปกรณ์ฝังตัว) - บันทึก 3 ล้านต่อวินาทีสู่เครือข่าย, 5 ล้านไฟล์สำหรับ CPU สมัยใหม่ ฉันไม่ทราบว่ามีไลบรารีอื่นใดสำหรับการบันทึกซึ่งให้ความเร็วและข้อมูลรายละเอียดสำหรับข้อความบันทึกทุกรายการ
  • ด้ายปลอดภัย
  • ทุกข้อความการติดตามประกอบด้วย:
    • ข้อความ
    • ชั้น
    • เวลาที่แม่นยำ (100ns)
    • ไฟล์ต้นฉบับชื่อฟังก์ชั่นและสาย
    • ID โมดูลและชื่อโมดูล
    • ID เธรดและชื่อเธรด
    • ดัชนีแกนประมวลผล
  • แอปพลิเคชันเซิร์ฟเวอร์เพื่อรับและดูบันทึกและระบบตรวจสอบและบันทึกข้อมูล
  • คุณสามารถรวบรวมวิเคราะห์ค้นหากรองบันทึกจากหลายแหล่งในเวลาจริง

ตั้งแต่ 06/2017% s ในการจัดรูปแบบสตริงยังไม่รองรับ
Romeno
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.