اهمیت لاگ‌ها - در کدهای TSQL چه طور اطلاعات مورد نظر رو به SQL Server Profiler بفرستیم؟

جمعه 10 شهریور 1396 توسط Ziaa

هر گُلی، علت و عیبی دارد گُل بی علت و بی عیب، خداست

بعضی وقت‌ها برنامه‌هایی که نوشتیم دچار اشکال می‌شن یا بهتره بگم نوشتن نرم‌افزار بدون باگ تقریبا نشدنی است. البته مشخصه که اینجا منظورم از نرم افزار، برنامه‌ای با یکی-دو خط کد نیست! مهم اینه که باگ‌ها رو در زمان مناسب تشخیص داد و به درستی رفع و مدیریت کرد. یکی از مواردی که شناسایی باگ‌ها رو راحت‌تر می‌کنه لاگ‌ها هستن. جمله معروفی هست که می‌گه:

Log early, log often

در لایه دیتابیس ابزاری که برای شناسایی خطاها و بررسی کارایی کد و پایگاه داده استفاده می‌شه SQL Server Profiler هست. برای اینکه بتونیم در رویه‌ها1 و تابع‌ها2 اطلاعات مورد نظر رو به پروفایلر بفرستیم؛ می‌تونیم از sp_trace_generateevent استفاده کنیم.

این SP سه تا ورودی داره. @eventid و @userinfo و @userdata که از بین اونها فقط @eventid ضروریه. این پارامتر به دلخواه خودمون می‌تونه یکی از اعداد ۸۲ تا ۹۱ باشه و برای شناسایی نوع رویداد و فیلتر کردن اونها استفاده میشه. میشه برای خودمون قرارداد کنیم که هر کدوم از این اعداد نشون دهنده یکی از سطح‌های لاگ‌گیری3 است.

  • DEBUG
  • ERROR
  • FATAL
  • WARN
  • INFO
  • TRACE

از اونجایی که لاگ‌ها بدون پیغام مناسب کاربرد کمی دارن؛ برای فرستادن متن پیام‌ها از @userinfo کمک می‌گیریم.

پس در نهایت توی کدهامون چیزی شبیه کد زیر داریم:

CREATE PROCEDURE [dbo].[usp_TraceSandbox] @Param AS NVARCHAR(128)
AS
    BEGIN TRY

        DECLARE @info NVARCHAR(128);
        SET @info = N'Info: @param = ' + @Param;

        -- Log اطلاعات
        EXEC master..sp_trace_generateevent @eventid = 82, @userinfo = @info;

        THROW 51010, N'مثلا یه خطایی اتفاق افتاده!',1;
    END TRY
    BEGIN CATCH

        DECLARE @error NVARCHAR(128);
        SET @error = N'Error: ' + ERROR_MESSAGE();

        -- Log خطاها
        EXEC master..sp_trace_generateevent @eventid = 83, @userinfo = @error;
    END CATCH;
GO

برای اینکه بتونیم این اطلاعات رو در پروفایلر ببینیم، رویدادهای مورد نظرمون رو از بخش User configurable انتخاب می‌کنیم. همتای هر کدوم از پارامترها در جدول زیر مشخص شدن.

sp_trace_generateevent SQL Server Profiler
@eventid 82-91 User configurable 0-9
@userinfo TextData
@userdata BinaryData

SQL Server Profiler configs

و در نهایت وقتی که مشغول ردگیری خطاها شدیم و پروفایلر رو اجرا کردیم داده‌های مورد نظرمون رو می‌بینیم. Trace


  1. Stored procedure 

  2. Function 

  3. Logging levels