2009-08-05 6 views
18

मैं डीबीएमएस_ओयूटीयूटीयूटी के उपयोग को प्रतिस्थापित करने के लिए हमारे मौजूदा ओरेकल एप्लिकेशन में लॉगिंग फ्रेमवर्क पेश करना चाहता हूं।पीएल/एसक्यूएल लॉगिंग - कैसे नियंत्रित करें?

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

इन आवश्यकताओं को लागू करना अपेक्षाकृत सरल होना चाहिए, हालांकि जहां मैं आपकी सहायता चाहूंगा कि इस कार्यक्षमता को बंद करने के लिए सबसे अच्छा तरीका है। जो मैं प्राप्त करने की कोशिश कर रहा हूं वह सबसे छोटा संभव प्रदर्शन है जब ट्रेस बंद हो जाता है। जो उम्मीद है कि ज्यादातर समय होना चाहिए!

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

मैं प्रेरणा के लिए एक कई मौजूदा खुला स्रोत और दूसरे चौखटे \ कार्यक्षमता लग पड़ा है: विशेष रूप से स्वीकार्य प्रभाव के तहत

log4plsql (http://log4plsql.sourceforge.net/)

एपीसी की समीक्षा here मुझे चिंताओं देता है।

OraLog परियोजना (http://oralog.sourceforge.net)

नहीं के बाद से 2007

पी एल/विजन (here)

काफी पुराना लग रहा है, के बाद से Oracle 8i कोई बदलाव नहीं अद्यतन?

पूछो टॉम इंस्ट्रुमेंटेशन (here)

अद्यतन 01/04/2014 Tom Kyte अब सिफारिश की गई है टायलर Muth के Logger

मैं वास्तव में अपने अनुभवों को सुनने के लिए दिलचस्पी होगी अगर आप किसी न किसी रूप पेश किया है अपने ओरेकल एप्लिकेशन में लॉग इन करने के तरीके, आपने इसे कैसे कार्यान्वित किया और विशेष रूप से आप इसे कैसे नियंत्रित करते हैं।

+1

पूछो टॉम instrumention लिंक टूटी हुई है, आप कृपया इसे ठीक कर सकते हैं पाया? – Sathya

+0

हाय सत्य, यह इंगित करने के लिए धन्यवाद कि - अभी ठीक होना चाहिए। –

+0

धन्यवाद, वह प्रस्तुति दिलचस्प थी। – Sathya

उत्तर

5

आप क्योंकि संभावित व्यापक invalidations की सशर्त संकलन के विचार त्यागकर उल्लेख किया - वहाँ एक दृष्टिकोण है कि कुछ इसी तरह है अगर आप PL/SQL स्रोत जहां प्रवेश/ट्रेसिंग की जरूरत है कि रखता शामिल नहीं करता है स्पर्श करना चाहते हैं सक्षम करने के लिए।

आप अभी भी PLSQL_CCFLAGS को चुनने का अपना नाम/मूल्य जोड़ी जोड़ सकते हैं और यह निर्धारित करने के लिए कि आपका लॉगिंग "चालू" है या नहीं, यह निर्धारित करने के लिए आपका एप्लिकेशन कोड वी $ पैरामीटर की अपेक्षाकृत हल्के क्वेरी करता है। सबसे खराब कार्यान्वयन एक नाम/मूल्य जोड़ी होगा, लेकिन आप इसे अलग-अलग जोड़ों के लिए विस्तारित कर सकते हैं जो मॉड्यूल-विशिष्ट होंगे इसलिए लॉगिंग को एक बेहतर ग्रैन्युलरिटी के साथ चालू किया जा सकता है।

[संपादित करें] आपकी टिप्पणी/अनुरोध के जवाब में यहां एक बहुत ही सरल उदाहरण है - यदि आप अन्य मौजूदा जानकारी, शायद एक फ़ंक्शन में लपेटें, तो आप स्पष्ट रूप से PLSQL_CCFLAGS स्ट्रिंग को पार्स करने में अधिक परिष्कृत होना चाहते हैं। ।:

create or replace procedure ianc_cc 
is 
cc_flag_val varchar2(4000); 
begin 
-- need direct select grant on v_$parameter for this... 
select value into cc_flag_val 
    from v$parameter where name = 'plsql_ccflags'; 
if (cc_flag_val = 'custom_logging:true') then 
    dbms_output.put_line('custom logging is on'); 
else 
    dbms_output.put_line('custom logging is off'); 
end if; 
end; 
/

अब, एक उपयोगकर्ता विशेषाधिकार प्राप्त ALTER प्रणाली जारी करने के लिए के रूप में:

ALTER प्रणाली सेट PLSQL_CCFLAGS = 'custom_logging: सच';

और वापस द्वारा टॉगल:

ALTER प्रणाली सेट PLSQL_CCFLAGS = '';

+0

+1 उत्तर के लिए धन्यवाद - क्या आपके विचार को खराब करने के लिए एक छोटे से डेमो का कोई मौका है? मैं यह देखने के लिए संघर्ष कर रहा हूं कि मैं पुनर्मूल्यांकन मुद्दे से कैसे बच सकता हूं। यहां प्रक्रिया है जिसके साथ मैं काम कर रहा हूं (मुझे अंतरिक्ष कारणों से इसे "फ़्लैटन" करना पड़ा है: प्रक्रिया बनाएं या स्थानांतरित करें IANC_CC $ $ IF $$ $ $ डीबग करें DBMS_OUTPUT.PUT_LINE ('सीसी कोड जगह में है'); $ END DBMS_OUTPUT।PUT_LINE ('सामान्य निष्पादन'); अंत; - plsql झंडे को पर बदलें प्रक्रिया ianc_cc संकलन plsql_ccflags = 'डीबग: सत्य' पुन: उपयोग सेटिंग्स; धन्यवाद इयान –

+0

उदाहरण देने के लिए समय निकालने के लिए धन्यवाद, अगर मैं कर सकता तो मैं प्रतिक्रिया को और भी आगे बढ़ा देता! धन्यवाद फिर से –

3

हमारे आवेदन में, हम Ask Tom के debug.f instrumentation का भारी उपयोग करते हैं। एक चीज जिसे मैंने तुरंत देखा था कि 'डीबगटाब' यह देखने के लिए बहुत अधिक पूछ रहा था कि प्रत्येक लॉग संदेश के लिए लॉगिंग चालू है या नहीं। मैंने प्रत्येक 100 लॉग संदेशों में एक बार तालिका की जांच करने के लिए इसमें बदलाव किया है और अब यह बहुत अच्छी तरह से काम करता है।

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

+0

+1 धन्यवाद स्टीफन, विशेष रूप से टीके वाद्ययंत्र के कुछ वास्तविक विश्व उपयोग के साथ-साथ इसे अनुकूलित करने की युक्ति पर प्रतिक्रिया के लिए। –

+0

अरे @StephenODonnell आप फ़ंक्शन कैशिंग करने के लिए डेटाबेस को संकेत दे सकते हैं जो परिणाम को तब तक कैश कर सकता है जब तक डीबगेटैब तालिका कैश को अमान्य कर देती है। –

+0

@AndrewRussell - यह एक बहुत अच्छा विचार हो सकता है, मैंने इस उपकरण का उपयोग नहीं किया था (जो कुछ समय पहले था), लेकिन मैं इसे अगली बार कोशिश करूंगा। –

1

क्या कोई संदर्भ स्थापित करना आसान नहीं होगा और इसमें नाम मूल्य जोड़ना आसान होगा? आप अपनी डीबगेटैब तालिका पर ट्रिगर का उपयोग करके संदर्भ में मान बदल सकते हैं।

5

एक ही समस्या की समीक्षा की और अगले परियोजना है जो अभी भी सक्रिय होने जा रहा है, https://github.com/tmuth/Logger---A-PL-SQL-Logging-Utility

+0

धन्यवाद मैं टायलर को गीथब पर रखने के लिए इंतजार कर रहा हूं। –

संबंधित मुद्दे