2011-09-13 37 views
6

में लॉग फ़ाइल लिखना मैं सी ++ में एक लॉग फ़ाइल लिखना चाहता हूं। मैं कुछ चीजों को संसाधित कर रहा हूं और इस प्रकार मुझे उन चीज़ों के गुणों का लॉग बनाए रखने की आवश्यकता है जिन्हें मैं संसाधित करता हूं ताकि मैं इस लॉग फ़ाइल पर वापस लौट सकूं जो विशेष रूप से मेरे लिए रूचि रखता है .. कोई मदद कर सकता है मुझे यह प्राप्त करने में?सी/सी ++

+0

आप पूर्ववत करें/फिर प्रणाली के कुछ प्रकार की चर्चा करते हुए कर रहे हैं? – cyco130

+1

एक नज़र डालें [इस पर] (http://stackoverflow.com/questions/696321/best-logging-framework-for-native-c) – StevieG

+0

@ cyco130 मुझे लगता है कि ओपी का मतलब है "वापस" के बजाय "वापस देखें" वापस ", कुछ प्रकार के पूर्ववत/फिर से सिस्टम के बजाय। (शब्द "रिवर्ट" संभवतः गिट के साथ बहुत अधिक समय व्यतीत करने से लिया गया है!) – RoG

उत्तर

-4

सभी प्रतिक्रियाओं के लिए धन्यवाद ... मुझे लगता है कि मैं जिस उत्तर की तलाश कर रहा था वह यह था कि यूटीएफ 8 में एक लॉग फ़ाइल के लिए प्रारूप भी एक txt फ़ाइल की तरह है, इसलिए सी को उस तरह के लिखने में कोई समस्या नहीं होगी सरल फ़ाइल लेखन के साथ फ़ाइल जो यह प्रदान करता है।

2

Apache log4cxx जैसे कई लॉगिंग फ्रेमवर्कों में से एक का उपयोग क्यों न करें? मैं खुद को रोल करने की कोशिश करने के बजाए इसका सुझाव दूंगा - पहिया का फिर से आविष्कार क्यों करें?

24

लॉगिंग की मानक विधि (मेरे अनुभव में) या तो stdout या stderr धाराओं का उपयोग करना है। C++ में इन उपयोग करने के लिए आप iostream शामिल करने की जरूरत है, और नीचे के रूप में प्रयोग करेंगे:

#include <iostream> 

int main(int argc, char* argv[]) 
{ 
    using std::cout; 
    using std::cerr; 
    using std::endl; 

    cout << "Output message" << endl; 
    cerr << "Error message" << endl; 
} 

लेकिन यह केवल उन लोगों के आउटपुट, जो आमतौर पर एक टर्मिनल पर खत्म करने के लिए मुद्रण प्राप्त होता है। यदि आप फ़ाइल में आउटपुट करने के लिए इन मानक स्ट्रीम विधियों (जो काफी पठनीय हैं) का उपयोग करना चाहते हैं, तो आपको किसी भी तरह अपने आउटपुट को रीडायरेक्ट करना होगा। ऐसा करने का एक तरीका है cstdio द्वारा प्रदत्त freopen फ़ंक्शन का उपयोग करना। यह एक फ़ाइल खोलता है, और उस फ़ाइल को दिए गए स्ट्रीम को ले जाता है। दस्तावेज के लिए here देखें। एक उदाहरण होगा:

#include <iostream> 
#include <cstdio> 

int main(int argc, char* argv[]) 
{ 
    using namespace std; 
    freopen("output.txt", "w", stdout); 
    freopen("error.txt", "w", stderr); 

    cout << "Output message" << endl; 
    cerr << "Error message" << endl; 
} 

(मैं सिर्फ संक्षिप्तता के लिए वहाँ using namespace std; को बदल दिया है।)

आप output.txt को मानक आउटपुट धारा stdout (जो cout द्वारा प्रयोग किया जाता है) जा रहे हैं (लिखने के तरीके में), और आप stderr (जिसे cerr द्वारा उपयोग किया जाता है) को लिखने के तरीके में error.txt पर भी ले जा रहे हैं।

उम्मीद है कि यह चाल है।

+1

मैं std :: cout और std :: cerr पर std :: clog की अनुशंसा करता हूं। –

+1

मैंने इसका उल्लेख करने से पहले वास्तव में कभी भी क्लोग के बारे में कभी नहीं सुना होगा। मैं देख सकता हूं कि stderr का एक buffered संस्करण उपयोगी क्यों हो सकता है - लेकिन इसे cout के स्थान पर क्यों उपयोग करें? दोनों के साथ क्या गलत है? – VolatileStorm

+1

तकनीकी रूप से? कुछ भी तो नहीं। लेकिन यह सामान्य लॉगिंग करने का मानक तरीका है। त्रुटि लॉगिंग के लिए सीर का उपयोग किया जाना चाहिए, और कंसोल आउटपुट के लिए cout। और ईमानदारी से? मैंने केवल एक सप्ताह पहले इसके बारे में सुना था। –

5

आप जिस चीज को करने की कोशिश कर रहे हैं, वह इस साइट पर एक संकल्प समाधान प्रदान करने के लिए बहुत अधिक है। आप क्या कर सकते हैं अपनी पसंद की लॉगिंग लाइब्रेरी के लिए प्रलेखन देखें। मेरे मामले में, यह Boost.Log है, Boost C++ libraries के लिए एक लॉगिंग लाइब्रेरी जिसके लिए here पाया जा सकता है।

यह पृष्ठ के नीचे मैं सिर्फ इतना है कि

इस पुस्तकालय बूस्ट के एक अधिकारी हिस्सा नहीं है से लिंक किया है पर कहा है संग्रह पुस्तकालयों हालांकि यह समीक्षा बीत चुका है और अस्थायी रूप से स्वीकार किया गया है। समीक्षा परिणाम here उपलब्ध है।

तो आप जो करेंगे उसे बना लें।

0

आप भी http://www.logog.org पर विचार करना चाहेंगे। यह एक प्रदर्शन उन्मुख सी ++ लॉगिंग सिस्टम है। हालांकि, अगर यह आपके प्रोजेक्ट के लिए बहुत गहन है, तो इसके लिए अच्छा पुराना सीर और कॉउट ठीक काम करता है।

2

यह काफी आसान है, बस प्लग करेंकुछ सामान्य हेडर फाइल कार्यक्रम में कहीं से भी कहा जा

inline string getCurrentDateTime(string s){ 
    time_t now = time(0); 
    struct tm tstruct; 
    char buf[80]; 
    tstruct = *localtime(&now); 
    if(s=="now") 
     strftime(buf, sizeof(buf), "%Y-%m-%d %X", &tstruct); 
    else if(s=="date") 
     strftime(buf, sizeof(buf), "%Y-%m-%d", &tstruct); 
    return string(buf); 
}; 
inline void Logger(string logMsg){ 

    string filePath = "/somedir/log_"+getCurrentDateTime("date")+".txt"; 
    string now = getCurrentDateTime("now"); 
    ofstream ofs(filePath.c_str(), std::ios_base::out | std::ios_base::app); 
    ofs << now << '\t' << logMsg << '\n'; 
    ofs.close(); 
} 

उपयोग (बेहतर दृष्टिकोण इन कार्यों के साथ एक वर्ग के रूप में किया जाएगा): लॉगर ("यह लॉग संदेश है"); एक फ़ाइल लिखता है (या मौजूदा फ़ाइल संलग्न कर देता है)

/somedir/log_2017-10-20.txt 
सामग्री के साथ

:

2017-10-20 09:50:59 This is log message 
संबंधित मुद्दे