(C ++) गेम के लिए लॉगिंग लाइब्रेरी [बंद]


15

मुझे पता है कि बहुत सारे लॉगिंग लाइब्रेरी हैं लेकिन उनमें से बहुतों का परीक्षण नहीं किया। (GoogleLog, Pantheios, आने वाला बढ़ावा :: लॉग लाइब्रेरी ...)

खेलों में, विशेष रूप से दूरस्थ मल्टीप्लेयर और मल्टीथ्रेड गेम्स में, लॉगिंग डीबगिंग के लिए महत्वपूर्ण है, भले ही आप अंत में सभी लॉग हटा दें।

मान लीजिए कि मैं एक पीसी गेम बना रहा हूं (कंसोल नहीं) जिसकी लॉग की जरूरत है (मल्टीप्लेयर और मल्टीथ्रेड और / या मल्टीप्रोसेस) और मेरे पास लॉगिंग के लिए लाइब्रेरी तलाशने के अच्छे कारण हैं (जैसे, मेरे पास समय नहीं है या मैं नहीं हूं मेरे मामले के लिए सही ढंग से लिखने की मेरी क्षमता में विश्वास नहीं)।

यह मानते हुए कि मुझे ज़रूरत है:

  1. प्रदर्शन
  2. उपयोग में आसानी (स्ट्रीमिंग या फ़ॉर्मेटिंग या ऐसा कुछ करने की अनुमति दें)
  3. विश्वसनीय (रिसाव या दुर्घटना नहीं!)
  4. क्रॉस-प्लेटफ़ॉर्म (कम से कम विंडोज, मैकओएसएक्स, लिनक्स / उबंटू)

Wich लॉगिंग पुस्तकालय आप की सिफारिश करेंगे?

वर्तमान में, मुझे लगता है कि बढ़ावा :: लॉग सबसे लचीला है (आप दूरस्थ रूप से भी लॉग इन कर सकते हैं!), लेकिन अच्छा प्रदर्शन अपडेट नहीं किया है: उच्च प्रदर्शन के लिए है, लेकिन अभी तक जारी नहीं किया गया है। पैंथियोस का अक्सर उल्लेख किया जाता है, लेकिन मेरे पास प्रदर्शन और उपयोग पर तुलना बिंदु नहीं हैं। मैंने लंबे समय से अपने स्वयं के परिवाद का उपयोग किया है, लेकिन मुझे पता है कि यह मल्टीथ्रेडिंग का प्रबंधन नहीं करता है, इसलिए यह एक बड़ी समस्या है, भले ही यह काफी तेज हो। Google लॉग दिलचस्प लगता है, मुझे बस इसका परीक्षण करने की आवश्यकता है लेकिन अगर आपने पहले से ही उन कामों और अधिक की तुलना की है, तो आपकी सलाह अच्छे उपयोग की हो सकती है।

खेल अक्सर प्रदर्शन की मांग करते हैं, जबकि जटिल डिबग करने के लिए ताकि लॉगिंग लाइब्रेरी को जानना अच्छा होगा, जो हमारे विशिष्ट मामले में, स्पष्ट फायदे हैं।


3
एक आवश्यकता जो आपके लिए उल्लेखित नहीं है वह वह है जिसके लिए आप लॉग का उपयोग करने का इरादा रखते हैं। लॉगिंग, कहते हैं, डिबग संदेश, डिजाइनरों के लिए मैट्रिक्स, ग्राहक सहायता के लिए चरित्र स्थिति और क्रेडिट कार्ड लेनदेन की आवश्यकताएं अलग-अलग हैं। सामान्य तौर पर आप प्रदर्शन के लिए व्यापार करते हैं, प्रोग्रामर के लिए उपयोग में आसानी, ऑफ़लाइन पार्सिंग की आसानी / गति और स्थिति के आधार पर स्थायित्व।

यह सही है, लेकिन मैं यह मान रहा था कि "पूर्ण" लॉगिंग समाधान उपयोगकर्ताओं को आपके द्वारा वर्णित विभिन्न प्रकार के लॉग को सेटअप करने की अनुमति देगा। यदि आपको प्रश्न में यह सटीकता महत्वपूर्ण लगती है, तो कृपया मेरे अतिथि बनें और इसे प्रश्न में जोड़ें।
18'11

जवाबों:


8

सॉकेट का उपयोग करके लॉग करें (कोई भी सॉकेट रैपर पर्याप्त हो सकता है) + वेब ब्राउज़र वेबसोकेट => सबसे बहुमुखी, विनीत लॉगिंग उपकरण संभव है, डिबगिंग के घंटे हासिल करेगा और आंखों के घाव से बचेंगे

  • Asyncrhonous (गति के रूप में यह ब्राउज़र पर सभी काम को रोकता है)
  • स्वरूपित (रंग, आकार आदि ..)
  • विश्वसनीय (सॉकेट ...)
  • क्रॉस-प्लेटफ़ॉर्म (ब्राउज़र)

अब, बोनस:

  • डायनामिक फ़िल्टरिंग बहुत आसानी से की जाती है (यदि आवश्यकता हो तो जावास्क्रिप्ट रेगेक्स का उपयोग करना)
  • लॉग इतिहास, मेमोरी और तुलना (HTML5 कल्पना "इन-ब्राउज़र" डेटाबेस पर)
  • किसी भी डेटा के कुछ ग्राफ (SVG, या कैनवास या कुछ का उपयोग करके) बनाने के लिए आसान तरीका जैसे मेमोरी , मेमोरी विखंडन , आदि ...
  • किसी भी डेटा ( kd- पेड़ उपखंड ? संभावित क्षेत्र? या यहां तक ​​कि सिर्फ एक चर मान भिन्नता? आदि ...) के कुछ 2D ग्राफ बनाने का आसान तरीका ?
  • दूरस्थ लॉगिंग (ब्राउज़र अन्य कंप्यूटर का उपयोग करके) की अनुमति देता है
  • ब्राउज़र स्टोरेज में एचटीएमएल 5 का उपयोग करके, आप लॉग सत्र पैरामीटर (वर्तमान लॉग फिल्टर, आदि .. और यहां तक ​​कि प्रत्येक पर नोट्स) स्टोर कर सकते हैं
  • बग रिपोर्ट या बस एक क्लिक से trac टिकट लिंक करना बहुत आसान है
  • समयरेखा गुई के साथ आसानी से लॉगिंग को रिवाइंड करने की क्षमता

और लॉगिंग के बाहर कई और कार्य:

  • प्रोफाइलर जानकारी की अनुमति देता है (रेखांकन ...)
  • यहां तक ​​कि कंसोल के रूप में भी काम कर सकते हैं (ब्राउज़र से कमांड भेजें) या यहां तक ​​कि कुछ HTML या यहां तक ​​कि फ्लैश यूआई का उपयोग करके त्वरित जीयूआई के साथ
  • ब्राउज़र में छवि भिन्न होती है (सॉकेट का उपयोग करके छवि भेजें, और कैनवास छवि पिक्सेल क्षमताओं का उपयोग करके ब्राउज़र में तुलना करें)
  • आदि...

(फ्लैश सॉकेट्स का उपयोग करके उपरोक्त लगभग सभी किया जा सकता है, डेटाबेस क्षमताओं को बचाएं)

अब मुझे पता है कि बात को स्थापित करने में थोड़ा लंबा समय लगता है। लेकिन यह वास्तव में लंबी परियोजना पर कठिन डिबगिंग स्थिति के साथ समय का लाभ है (जैसे कि खेलों में।) यह सबसे शक्तिशाली चीज है जिसका उपयोग मैंने डिबगर्स के बाद से किया है ...

नोट 1: केवल नकारात्मक पहलू => डबल-चेक साइड इफेक्ट जब डिबगिंग गेम नेटवर्किंग कोड (सॉकेट बफर आकार, विलंबता, बैंडविड्थ, आदि पर प्रभाव ...)

नोट 2: सुरक्षा कारणों से डिफ़ॉल्ट वेबसैट द्वारा निष्क्रिय किए गए कुछ ब्रोसवर्कर, इसके बारे में जांचें: यह सुनिश्चित करने के लिए कि इसे सक्षम किया जाना चाहिए।


1
अगर मैं गलत हूं तो मुझे सुधारें, लेकिन यह केवल यह बताता है कि लॉगिंग आउटपुट को कहां निर्देशित करना है, नहीं? एक वास्तविक लॉगिंग लाइब्रेरी भी संकलन-समय पर फ़िल्टरिंग की अनुमति देगा (जो कि यदि प्रदर्शन एक समस्या है), स्वरूपण, और लॉग संदेश बनाने के लिए एक आसान-से-सिंटैक्स प्रदान करें।
sbi

@ एसएसबी यह एप्लीकेशन साइड पर एक ग्लोबल ऑन या ऑफ चीज है। "ब्राउज़र लॉग क्लाइंट" फ़िल्टरिंग, सिंटैक्स करता है, लेकिन यह हमेशा सभी लॉग प्राप्त करता है। यह कट्टरपंथी है, लेकिन यह इस अनुभव पर आधारित है कि देव के दौरान, आपको हमेशा सब कुछ लॉग इन करना चाहिए ताकि आप आसानी से किसी भी कीड़े को पकड़ सकें / पुन: उत्पन्न कर सकें। आप का अनुकूलन करने के लिए है, तो यह के ब्राउज़र पक्ष फिर से: सॉकेट का उपयोग करके आप स्ट्रिंग का उपयोग लॉग इन करने के लिए बाध्य नहीं कर रहे हैं, तो आप सीधे बाइनरी डेटा (आईडी + तैरता) है, जो है लॉग इन कर सकते बोल्ड तेजी से किसी अन्य स्ट्रिंग आधारित लॉग lib से ... ( मिलान आईडी टू स्ट्रिंग ब्राउज़र साइड ...)
टुआन कुर्नेस

1
जबकि मैं देख सकता हूं कि यह बहुत व्यावहारिक है, यह वास्तव में सिर्फ एक लकड़हारा बैकएंड है (जिसे टेम्पलॉग "लॉग सिंक", IIRC कहता है)। प्रदर्शन सूचीबद्ध आवश्यकताओं में से एक है। मैंने पाया है कि मुझे इसे डीबग करते समय लॉग स्टेटमेंट को कोड के एक टुकड़े में जोड़ने की आवश्यकता है, लेकिन एक बार यह हो जाने पर और कोड के इस टुकड़े को चलाना बहुत बातूनी हो जाएगा और इसके शोर में जो भी मैं काम कर रहा हूं उसे डुबो दूंगा, और खर्च भी होगा बहुत अधिक प्रदर्शन। इसलिए मैं कोड के कुछ लाइनों को बदलने के साथ कोड के पूरे टुकड़ों पर लॉग स्तर को ऊपर और नीचे करने में सक्षम होना चाहता हूं। यही कारण है कि लॉग लिब की मध्य परत आपके लिए है।
एसबीआइ

@sbi: को बेंचमार्क की आवश्यकता हो सकती है, लेकिन इस बात की संभावना है कि सबसे अच्छा लॉगिंग लाइब्रेरी, यहां तक ​​कि सबसे कम लॉगिंग स्तर पर, अभी भी आपको बाइनरी लकड़हारा से अधिक लागत आती है जो सब कुछ लॉग करता है। CPU Cycle बर्बाद करने के लिए एक भी "बाइनरी नहीं है ... तो यह वास्तव में अधिक सुविधा और अधिक प्रदर्शन है।
टुआन कुर्नेस

इससे पहले कि हम वास्तव में टेम्पलॉग का उपयोग करने का फैसला करते, हमने कुछ परीक्षण किए। यदि लॉगिंग को एक विशिष्ट लॉग संदेश की गंभीरता, उत्पत्ति या व्हाट्सएप के लिए बंद कर दिया जाता है, और यदि कंपाइलर यह पता लगाने में सक्षम है कि मापदंडों का मूल्यांकन करने में कोई दुष्प्रभाव नहीं हैं, तो वीसी वास्तव में एक पूर्ण विकसित का अनुकूलन करने में सक्षम है। कुछ भी नहीं में लॉग स्टेटमेंट। और जब गति की बात आती है, तो आप उस कोड को नहीं हराएंगे जो पहले स्थान पर निष्पादित नहीं होता है।
sbi

8

जब प्रदर्शन की बात आती है, तो मैंने टेम्पलॉग को बहुत अधिक नाबाद पाया है । यह लॉगिंग स्टेटमेंट के मूल्यांकन को स्थगित करने के लिए एक्सप्रेशन टेम्प्लेट का उपयोग करता है जब तक कि यह स्थापित न हो जाए कि जानकारी बिल्कुल लॉग इन होगी। चूंकि आप आंशिक रूप से लॉगिंग (गंभीरता, उत्पत्ति, और लॉग संदेश के लक्षित दर्शकों के आधार पर) को बंद कर सकते हैं, इनमें से कुछ लॉगिंग स्टेटमेंट को रिलीज़ बिल्डरों के लिए कंपाइलर द्वारा शून्य कोड तक समाप्त किया जा सकता है। (मैंने वास्तव में वीसी के साथ ऐसा होते देखा है।)

हाल ही में पुस्तकालय के लिए बहुत कुछ नहीं किया गया था, और एसओ पर अन्य लोगों को कुछ संबंध में ट्रंक की कमी का पता चला है, लेकिन एक कंपनी में मैं काम करता था हमने उस लड़के को काफी संवेदनशील पाया है, और मेरे एक तत्कालीन गौ-कार्यकर्ता भी कमिटेड एक्सेस मिला और इसमें कुछ कोड जोड़े गए, जिससे आप इसे शॉट के लायक समझ सकते हैं।

अपनी आवश्यकताओं को पूरा करने के लिए:

प्रदर्शन

सबसे अच्छा मैंने पाया है। विशेष रूप से संकलन-समय पर लॉग संदेशों को बाहर करने की इसकी क्षमता और कंपाइलर को पूरी तरह से खत्म करना बहुत आकर्षक था।

उपयोग में आसानी (स्ट्रीमिंग या फ़ॉर्मेटिंग या ऐसा कुछ करने की अनुमति दें)

जब आप कुछ गलत करते हैं, तो टेम्प्लेट-मेटा सामान की शास्त्रीय भयानक संकलक त्रुटि संदेश होते हैं, लेकिन जब उपयोग में आसानी होती है, तो

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

हराना कठिन है।
हालाँकि, आपको अपने स्वयं के लॉग सिंक बनाने होंगे (जहां लॉग संदेश चलते हैं), जैसा कि कुछ पूर्व-पैक वाले (stderr, फ़ाइल, विंडोज लॉगिंग, आदि) सभी परिष्कृत नहीं हैं। प्रदर्शन एक मुख्य लक्ष्य होने के कारण, पूरी चीज़ की आंतरिकता कुछ जटिल है (जैसे लॉग संदेश फ़ॉर्मेटर्स लॉग सिंक के साथ काफी पेचीदा होते हैं), लेकिन हमने मास्टर किया था (मुझे याद है कि एक डीबगर में इसके माध्यम से कदम उठाना और एक बार मदद करना यह समझ में नहीं आया कि अपने स्वयं के संदेश फ़ॉर्मेटर्स या लॉग सिंक को लिखना मुश्किल है।

विश्वसनीय (रिसाव या दुर्घटना नहीं!)

हमने इस तरह के गंभीर मुद्दों का पता लगाए बिना इसका इस्तेमाल किया है। वस्तुतः वहाँ कोई डायनेमिक मेमोरी एलोकेशन नहीं है, इसलिए कुछ गलत करने की कल्पना करना भी मुश्किल है। बेशक, हम केवल एक उत्पाद में वास्तविक-विश्व परीक्षणों के लिए इसे डालते हैं।

क्रॉस-प्लेटफ़ॉर्म (कम से कम विंडोज, मैकओएसएक्स, लिनक्स / उबंटू)

जब हमने इसका उपयोग किया, तो हमने इसे Win32, OSX, और कई अलग-अलग लिनक्स वितरणों, उबंटू में इस्तेमाल किया।

मल्टी-थ्रेडिंग के रूप में: हमने इसका उपयोग नहीं किया है, लेकिन मुझे लगता है कि लिब की वास्तुकला के बारे में मुझे लगता है कि आपको केवल लॉग सिंक में इसे संभालने की आवश्यकता होगी। ICBWT।


धन्यवाद, मुझे यह नहीं पता था। यह बढ़ावा देने का एक सरलीकृत (और प्रदर्शन करने वाला) संस्करण लगता है :: लॉग, कम से कम मूल विचार में।
Kलेम

@ अस्वीकरण: मुझे नहीं लगता कि जब मैं अंतिम बार C ++ लॉगिंग पुस्तकालयों में देखा गया था, तो मुझे बढ़ावा देने के लिए कुछ भी नहीं मिला था, इसलिए मुझे बढ़ावा देने के बारे में नहीं पता है: लॉग।
sbi

1
@ जो: क्या आप "अभिव्यक्ति टेम्पलेट्स" शब्द को समझते हैं ??
sbi

1
मुझे लगा कि मैंने किया है, लेकिन अब मैंने टेम्पलॉग स्रोत कोड पढ़ना और डाउनलोड करना शुरू कर दिया है, और ऐसा प्रतीत होता है कि C ++ ने मुझे फिर से पीछे छोड़ दिया है।

1
@ एसबीआई: मेरी उलझन का एक हिस्सा आपका बयान "कई परतों के माध्यम से एक बार में पारित किया गया" - अंग्रेजी में एक बार में या तो तुरंत या एक साथ मतलब हो सकता है , जो इस मामले में विरोध कर रहे हैं। मैंने इसे पहले के रूप में पढ़ा, और आप (अब स्पष्ट रूप से मेरे लिए) का मतलब दूसरा था। इसे समझाने के लिए समय निकालने के लिए धन्यवाद।

1

आप http://www.logog.org पर लॉगोग लाइब्रेरी पर विचार करना चाह सकते हैं , जो मुझे लगता है कि आपकी आवश्यकताओं को पूरा कर सकता है। कैविएट: मैंने इसे लिखा था।

Https://stackoverflow.com/questions/696321/best-log-framework-for-native-c पर अन्य लोगों के उत्तर भी देखें ।


0

आप Baical उपकरण सेट में रुचि हो सकती है :

  • ओपन सोर्स और क्रॉस प्लेटफॉर्म (लॉग, ट्रेस और टेलीमेट्री - P7 के लिए विन, लिनक्स, x86 / x64) लाइब्रेरी
  • अविश्वसनीय रूप से तेज़ (एम्बेडेड उपकरणों के लिए डिज़ाइन किया गया) - नेटवर्क पर प्रति सेकंड 3 मिलियन लॉग, आधुनिक सीपीयू पर फाइल करने के लिए 5 मिलियन। मुझे लॉगिंग के लिए कोई अन्य पुस्तकालय नहीं पता है जो हर लॉग संदेश के लिए इतनी गति और इतनी विस्तृत जानकारी प्रदान करता है।
  • सुरक्षित धागा
  • हर ट्रेस संदेश में शामिल हैं:
    • पाठ संदेश
    • स्तर
    • सटीक समय (100ns)
    • स्रोत फ़ाइल, फ़ंक्शन नाम और लाइन
    • मॉड्यूल आईडी और मॉड्यूल का नाम
    • थ्रेड आईडी और थ्रेड नाम
    • प्रोसेसर कोर इंडेक्स
  • लॉग और टेलीमेट्री प्राप्त करने और देखने के लिए सर्वर अनुप्रयोग
  • आप वास्तविक समय में कई स्रोतों से एकत्र, विश्लेषण, खोज, फ़िल्टर लॉग कर सकते हैं

स्ट्रिंग प्रारूपण में 06/2017% s के रूप में अभी तक समर्थित नहीं है।
रोमेनो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.