2012-11-15 12 views
9

मुझे यह समस्या है कि मुझे अपनी परियोजनाओं में से किसी एक के लिए हल करने की आवश्यकता है। मुझे 3 अलग-अलग सेवाओं के लिए एक लॉग फ़ाइल बनाने की आवश्यकता है (पूछें नहीं, क्यों मेरे मालिक ने इसे इस तरह से अनुरोध किया)। प्रत्येक सेवा में फ़ाइल में जानकारी लॉग करने का प्रयास करने वाले एकाधिक थ्रेड हो सकते हैं, इसलिए मेरा सवाल यह है कि ऐसा करने का सबसे अच्छा तरीका क्या है?एकाधिक सेवाओं (एकाधिक थ्रेड के साथ प्रत्येक सेवा) के बीच एक लॉगफाइल साझा करें, कैसे करें?

क्या मुझे वैश्विक म्यूटेक्स का उपयोग करना चाहिए? कुछ ऐसा:

procedure LogToFile(fn, str: string); 
var 
    F: TextFile; 
begin 
    logMutex.Acquire; 
    try 
{$I+} 
    try 
     AssignFile(F, fn); 
     if FileExists(fn) then 
     Append(F) 
     else 
     Rewrite(F); 
     Writeln(F, DateTimeToStr(Now) + ': ' + str); 
     CloseFile(F); 
    except 
    end; 
{$I-} 
    finally 
     logMutex.Release; 
    end; 
end; 

initialization 
    logMutex := SyncObjs.TMutex.Create(nil, False,'some_global_mutex'); 

finalization 
    logMutex.Free; 

कोई बेहतर विचार?

संपादित करें: मैं एक सेवा, एक लकड़हारा सेवा, कि संदेशों की जरूरत है कि अन्य सेवाओं से लॉग इन करने की और उसके बाद केवल एक ही सेवा लॉग फ़ाइलों से निपटने के लिए है के लिए इंतजार कर रहा है का निर्माण करना चाहिए? यदि यह एक अच्छा समाधान है, तो सेवाओं के बीच संवाद करने का सबसे अच्छा तरीका क्या है? मैं इंडी का उपयोग कर सकता था ...

+3

http://www.raize.com/DevTools/CodeSite/Default.asp –

+1

से कोडसाइट का प्रयास करें मेरी कंपनी ने अपनी स्वयं की लॉगिंग सेवा लिखी है। हम एक फ्री-थ्रेडेड COM ऑब्जेक्ट का उपयोग करते हैं ताकि ऐप को सेवा में लॉग संदेशों को धक्का दे सके, फिर यह आवश्यकतानुसार लॉग फ़ाइल में संदेशों को कतार और फ़्लश करता है। आप एक सादा पाठ फ़ाइल के बजाय एक विंडोज सिस्टम इवेंट लॉग का उपयोग करने पर भी विचार कर सकते हैं। फिर आपके ऐप्स 'ReportEvent()' के माध्यम से उस लॉग पर संदेश भेज सकते हैं और ओएस को आपके लिए वास्तविक लॉग फ़ाइल को संभालने दें। –

+1

मैं एक अलग लॉगर सेवा लिखूंगा, फिर अपनी तीन सेवाओं को संदेश भेजने के लिए विंडो WM_COPYDATA संदेश का उपयोग करें। विशेष रूप से जब से लॉग सेवा फ़ाइल को संलग्न करने के लिए खुली रख सकती है। फाइल को लगातार खोलना धीमा हो जाता है। क्षमा करें, मैं उस स्थान पर नहीं हूं जहां इस समय मेरे पास नमूना कोड तक पहुंच है। –

उत्तर

3

नामित म्यूटेक्स का उपयोग करके आपका समाधान काम करेगा और यह सुनिश्चित करने के लिए सबसे सरल दृष्टिकोण है।

2

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

ऐप्स ओपन स्रोत Log4D framework और इंटरनेट डायरेक्ट (इंडी) का उपयोग करते हुए यूडीपी पर एक एप्लिकेशन सर्वर पर लॉग आउटपुट लिखते हैं। एप्लिकेशन सर्वर में एक यूडीपी सर्वर ऐप चल रहा है जो लॉग संदेश प्राप्त करता है और उन्हें एक फ़ाइल में लिखता है।

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