2010-05-30 18 views
20

यदि आपके पास लंबे समय तक चलने वाला एसपी है, तो क्या आप किसी भी तरह से अपने कार्यों को लॉग करते हैं या बस इस संदेश का इंतजार करते हैं?सर्वोत्तम व्यवहार - संग्रहीत प्रक्रिया लॉगिंग

"कमांड सफलतापूर्वक पूरा हो गया।"

मुझे लगता है कि इस विषय पर बहुत सारे समाधान हो सकते हैं, लेकिन क्या कोई सर्वोत्तम अभ्यास है - एक साधारण समाधान जिसे अक्सर उपयोग किया जाता है?

संपादित

मैं इस विषय

http://weblogs.sqlteam.com/brettk/archive/2006/09/21/12391.aspx

अनुच्छेद एक लॉग तालिका का उपयोग का वर्णन करता है पर एक दिलचस्प लिंक मिल गया है, लेकिन एक समस्या है

प्रवेश प्रक्रिया है किसी लेनदेन के बाहर निष्पादित किया जाना चाहिए

मैं उस कर्सर की वजह से उस सम्मिलन को बाहर नहीं बुला सकता, जिसका उपयोग मैं करता हूं और प्रत्येक पंक्ति पर उस तालिका में एक पंक्ति डालता हूं।

कोई विचार?

संपादित 2

खुदाई ..

एसक्यूएल सर्वर में एक xp_logevent नहीं है। क्या तुमने कोशिश की?

एसक्यूएल सर्वर प्रोफाइलर के बारे में क्या?

हम आम तौर पर प्रवेश तालिकाओं का उपयोग और लेन-देन के आसपास देखभाल भी नहीं है Creating Log file for Stored Procedure

+0

लंबे समय तक चलने को परिभाषित करता है? –

+0

कोई भी स्पा, जो कि कुछ चयन और अपडेट से अधिक है। उदाहरण के लिए, यदि आप कर्सर का उपयोग करते हैं और आपको प्रगति देखने की आवश्यकता है। क्या मेरे प्रश्न में कुछ गलत है? – hgulyan

उत्तर

22

आप संग्रहीत प्रक्रिया का आविष्कार कैसे कर रहे हैं? यदि यह प्रबंधन स्टूडियो के माध्यम से है तो आप आसानी से संदेश का प्रिंट आउट के रूप में

RAISERROR ('Some debugging info', 0, 1) WITH NOWAIT 

यह PRINT उपयोग करने के लिए बेहतर है के रूप में संदेश तुरंत दिखाई देंगे इस प्रकार कर सकते हैं। Connection.InfoMessage ईवेंट के लिए हैंडलर को तारों से तारों से इन संदेशों को एडीओ.NET में भी पकड़ा जा सकता है।

मुझे लगता है कि आप पहले ही एसक्यूएल प्रोफाइलर को एक संभावना के रूप में सूचीबद्ध कर चुके हैं। आपको यह जानने में रुचि हो सकती है कि आप log your own user configurable events कर सकते हैं जिसे SQL प्रोफाइलर में देखा जा सकता है।

+1

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

+1

नाम से भ्रमित न हों RAISERROR केवल त्रुटियों के लिए नहीं है। 10 से कम की गंभीरता वाला कुछ भी जानकारी संदेशों के लिए है। स्पष्ट रूप से जो भी लॉगिंग फ्रेमवर्क आप उपयोग करते हैं, उसे आपको इस तरह डिजाइन करने की आवश्यकता है कि उचित मात्रा में जानकारी लॉग की जा रही है। –

+0

रायसर आतंक को रोक नहीं पाएगा? पी। और प्रोफाइलर में कस्टम उपयोगकर्ता विन्यास के लिए धन्यवाद। इस विषय पर सबसे दिलचस्प लिंक धन्यवाद। – hgulyan

3

। हम एसक्यूएल सर्वर से बाहर जाने में कुछ भी शामिल हैं (उदाहरण के लिए फाइल सिस्टम को लिखना, बाहरी सेवाओं को कॉल करना, .NET असेंबली आदि)

हम कर्सर से बचने की भी कोशिश करते हैं - क्या यह संभव है कि आपकी proc लंबी चल रही हो क्योंकि यह अक्षम है?

+0

क्या आप अधिक विशिष्ट हो सकते हैं? क्या होगा यदि आप लेनदेन के बाहर अपनी लॉग तालिका में सम्मिलित नहीं कर सकते हैं? मुझे पता है, कि कर्सर की अनुशंसा नहीं की जाती है, लेकिन यह एक बार स्क्रिप्ट का उपयोग किया जाता है और कोई अन्य तरीका नहीं है, इसलिए यह एक ऐसा मामला है जब कर्सर आवश्यक हैं। – hgulyan

7

यह देखने के लिए कि कितनी देर तक चीजें चल रही हैं, और पिछली क्रिया में कितनी पंक्तियां संशोधित हुईं, मैं वर्तमान दिनांक + समय और अंतिम प्रविष्टि को प्रत्येक प्रविष्टि में जोड़ता हूं।मैं इस प्रक्रिया का उपयोग करें:

CREATE PROCEDURE dbo.[Log] 
    @Message NVARCHAR(512), 
    @RowCount INT = null OUTPUT, 
    @Delimiter NCHAR(1) = N' ', 
    @PadChar NCHAR(1) = N'-' 
AS 
    BEGIN 
     SET @RowCount = @@ROWCOUNT; 

     DECLARE @LogDate AS NVARCHAR(50); 
     DECLARE @RowCountPadded AS NCHAR(8); 

     SET @LogDate = CONVERT(NVARCHAR(50),GETDATE(),121); 
     SELECT @RowCountPadded = CASE @RowCount WHEN 0 THEN REPLICATE(@PadChar,8) ELSE REPLACE(STR(@RowCount, 8), SPACE(1), @PadChar) END; 

     SET @Message = @LogDate + @Delimiter + @RowCountPadded + @Delimiter + @Message; 
     RAISERROR (@Message, 0, 1) WITH NOWAIT; 
    END 

तो, अपने प्रक्रियाओं में, इस तरह लॉग उत्पादन जोड़ें:

EXEC dbo.[Log] 'the message'; 

यह इस का उत्पादन:

2012-12-28 11:28:25.197 -------- the message 

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

अद्यतन: यदि आप इस प्रक्रिया को एक बार बनाना चाहते हैं और हर जगह इसका उपयोग करना चाहते हैं तो gist का उपयोग करें।

0

मैं इस प्रक्रिया

CREATE PROCEDURE dbo.PrintLog (
    @Msg VARCHAR(2048) 
    , @Option VARCHAR(100) = '' 
    , @Separator VARCHAR(10) = '-' 
    ) 
/* 
@Option is a string containing possible values as B,A,D,T 
if you want to print separator before message, include B 
if you want to print separator after message, include A 
if you want to print date, include D 
if you want to print time, include T 
Sample: 'BAD' 

The order of characters does not matter. it is not case sensitive 

Usage: 
    exec dbo.PrintLog 'Timed Log', 'T' 
    exec dbo.PrintLog 'Dated Log', 'D' 
    exec dbo.PrintLog 'With Separator and Time', 'BT', '><' 
    exec dbo.PrintLog 'With Separator and Date', 'BAD', '*' 
    exec dbo.PrintLog 'With Separator and DateTime', 'BADT', 'x' 
*/ 
AS 
BEGIN 
    declare @tempStr varchar(100) 
    set @tempStr = replicate(@Separator, 50) 
    IF charindex('B', upper(@Option)) > 0 
     raiserror (@tempStr, 10, 1) with nowait 

    DECLARE @prompt VARCHAR(max) = '' 

    IF charindex('D', upper(@Option)) > 0 
     SET @prompt = convert(VARCHAR, SysDatetime(), 101) + ' ' 

    IF charindex('T', upper(@Option)) > 0 
     SET @prompt = @prompt + convert(VARCHAR, SysDatetime(), 108) + ' ' 
    SET @prompt = @prompt + @Msg 

    raiserror (@prompt, 10, 1) with nowait 

    set @tempStr = replicate(@Separator, 50) 
    IF charindex('A', upper(@Option)) > 0 
     raiserror (@tempStr, 10, 1) with nowait 

    RETURN 
END 

GO 

प्रयोग

exec dbo.PrintLog 'Date and Timed Log', 'DT' 
    exec dbo.PrintLog 'Dated Log', 'D' 
    exec dbo.PrintLog 'With Separator and Time', 'BT', '><' 
    exec dbo.PrintLog 'With Separator and Date', 'BAD', '*' 
    exec dbo.PrintLog 'With Separator and DateTime', 'BADT', 'x' 

आप पैरामीटर चूक बदल सकते हैं आप मूल्यों वांछित करने के लिए इस्तेमाल करते हैं।

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