Sunday, September 16, 2018

Pulling Data From A Error Log




/*************************************************
PULLING DATA FROM THE ERROR LOG
**************************************************/

IF OBJECT_ID('IOErrorLog') IS NULL
    CREATE TABLE IOErrorLog (
            ServerName nvarchar(256),
            LogFileName nvarchar(4000),
            Occurances int,
            LogDate datetime,
            ProcessInfo nvarchar(50),
            ErrorText nvarchar(max),
        CONSTRAINT pk_IOErrorLog PRIMARY KEY (ServerName, LogDate, LogFileName)
    )

----------------------------------------------------------------------
-- This part of the code was found here:
-- https://ask.sqlservercentral.com/questions/99484/number-of-error-log-files.html

DECLARE @FileList AS TABLE (
    subdirectory NVARCHAR(4000) NOT NULL
    ,DEPTH BIGINT NOT NULL
    ,[FILE] BIGINT NOT NULL
);

DECLARE @ErrorLog NVARCHAR(4000), @ErrorLogPath NVARCHAR(4000);
SELECT @ErrorLog = CAST(SERVERPROPERTY(N'errorlogfilename') AS NVARCHAR(4000));
SELECT @ErrorLogPath = SUBSTRING(@ErrorLog, 1, LEN(@ErrorLog) - CHARINDEX(N'\', REVERSE(@ErrorLog))) + N'\';

INSERT INTO @FileList
EXEC xp_dirtree @ErrorLogPath, 0, 1;

DECLARE @NumberOfLogfiles INT;
SET @NumberOfLogfiles = (SELECT COUNT(*) FROM @FileList WHERE [@FileList].subdirectory LIKE N'ERRORLOG%');
-- SELECT @NumberOfLogfiles;
----------------------------------------------------------------------

CREATE TABLE #temp (
    LogDate datetime,
    ProcessInfo nvarchar(500),
    ErrorText nvarchar(max))

DECLARE @p1 INT = 0

WHILE @p1 < @NumberOfLogfiles
BEGIN
    -- P1 is the file number starting at 0
    DECLARE
    @p2 INT = 1,
    -- P2 1 for SQL logs, 2 for SQL Agent logs
    @p3 NVARCHAR(255) = 'occurrence',
    -- P3 is a value to search on
    @p4 NVARCHAR(255) = 'i/o'
    -- P4 is another search value

BEGIN TRY
    INSERT INTO #temp
    EXEC sys.xp_readerrorlog @p1,@p2,@p3,@p4
END TRY
BEGIN CATCH
    PRINT 'Error occurred processing file ' + cast(@p1 as varchar(10))
END CATCH

SET @p1 = @p1 + 1
END

INSERT INTO IOErrorLog
    SELECT DISTINCT @@SERVERNAME,
        SUBSTRING(ErrorText,charindex('[',ErrorText)+1,
            charindex(']',ErrorText)-charindex('[',ErrorText)-1),
        SUBSTRING(ErrorText, 27, patindex('%occurrence%',ErrorText)-28),
        LogDate, ProcessInfo, ErrorText
    FROM #temp
    WHERE #temp.LogDate NOT IN (
        SELECT LogDate
        FROM IOErrorLog
        WHERE ServerName = @@SERVERNAME)

DROP TABLE #temp

SELECT * FROM IOErrorLog



No comments:

Post a Comment