반응형
Event Log를 활용해보자. (이론 편)


백도훈

에이디컨설팅 선임 컨설턴트
 


스크립트
변환에서 오류 처리하기
강좌를 읽다가

이벤트 로그에 오류를 기록해보는 어떨까? 라는 생각이 들었습니다.

 

날은 생각만 하고 지나갔는데

원격에서 패키지 호출하기 강좌를 읽다가 호출된 패키지 내에서는

중간에 어떤 값이 넘어가고 있는지 궁금했지만 메시지 박스도 뜨지 않아서

체크하는 것이 어려웠습니다.

 

어떤 오류나 정보를 테이블에 기록하고 오류를 관리하는 체계적인 방법임에 틀림없습니다.

하지만 패키지 개발 중에 어떤 값이 넘어가는지 어떤 오류가 뜨는 잠깐 확인할

이벤트 로그(뷰어) 활용하면 좋을 같습니다.

 

스크립트 작업에서 이벤트 로그를 남기는 방법에 대해서 함께 생각했으면 합니다.

 

1.       Int32 데이터 형식의 Value라는 변수를 추가합니다. (기본 값은 0)

2.       SQL 실행 작업을 추가합니다.

3.       Connection 속성으로 아무 DB 연결합니다.

4.       SQLStatement 속성에 다음의 쿼리를 입력합니다.

SELECT ? = CONVERT(INT, RAND() * 100)

5.       매개 변수 매핑 메뉴에서 추가 버튼을 클릭하고
변수 이름은 Value, 방향은 OutPut, 데이터 형식은 LONG, 매개 변수는 0 입력합니다.

 

이제 변수 Value안에는 어떤 정수가 들어갈 텐데 어떤 값이 들어가는지 아무도 모릅니다.

 

6.       스크립트 작업을 추가하고 SQL 실행 작업과 연결합니다.

7.       ReadOnlyVariables 속성에 Value, PackageName, TaskName 입력합니다.

8.       스크립트 디자인 버튼을 클릭해서 VS for App 엽니다.
우리가 사용할 클래스는 System.Diagnostics.EventLog이고 로그를 남기는 함수는 WriteEntry()입니다.
아래의 소스를 입력합니다.

Imports System

Imports System.Data

Imports System.Math

Imports Microsoft.SqlServer.Dts.Runtime

Imports System.Diagnostics

 

Public Class ScriptMain

    Public Sub Main()

        Dim PackageName As String = Dts.Variables("PackageName").Value.ToString

        Dim TaskName As String = Dts.Variables("TaskName").Value.ToString

        Dim Value As String = Dts.Variables("Value").Value.ToString

 

        EventLog.WriteEntry(PackageName, _

            "TaskName: " + TaskName + System.Environment.NewLine + ": " + Value)

 

        Dts.TaskResult = Dts.Results.Success

    End Sub

End Class

Imports 줄에 함수 의외로 간단한가요? -_-;;;
WriteEntry
함수의 번째 변수는 이벤트 로그의 소스(원본) 기록될 내용이고
번째 변수는 설명 부분에 기록될 메시지입니다.

9.       ~ 실행 해보겠습니다. F5 디버깅 버튼을 살포시 눌러주세용~
그리고, 관리 도구로 달려가서 우리를 기다리는 이벤트 뷰어를 열어보겠습니다.


응용 프로그램 이라는 로그 파일에 패키지 이름이 원본으로 들어간 이벤트가 등록되었습니다.
설명 부분에 보니깐 작업 이름과 넘어온 값이 기록되었군요.

정도만 되더라도 만족할만하군요.
하지만 여기서 조금 응용을 해보도록 하겠습니다.

이벤트 뷰어를 보면 응용 프로그램, 보안, 시스템 등의 로그가 있습니다.
응용 프로그램 로그에 남기지 말고 SSIS 패키지 전용 로그를 만들어서 SSIS 패키지에서 남기는
이벤트는 모두 로그에 남기도록 해보겠습니다.

 

10.    스크립트 작업의 내용을 조금 변경하겠습니다. VS for App 열어주세요.
소스를 다음과 같이 바꿔줍니다. (Copy & Paste 하는 것이 정신 건강에 이로울지도… -_-;;)

Imports System

Imports System.Data

Imports System.Math

Imports Microsoft.SqlServer.Dts.Runtime

Imports System.Diagnostics

 

Public Class ScriptMain

    Public Sub Main()

        Dim PackageName As String = "P_" + Dts.Variables("PackageName").Value.ToString

        Dim TaskName As String = Dts.Variables("TaskName").Value.ToString

        Dim Value As String = Dts.Variables("Value").Value.ToString

 

        If Not EventLog.SourceExists(PackageName) Then

            EventLog.CreateEventSource(PackageName, "SSIS Log")

        End If

 

        EventLog.WriteEntry(PackageName, _

            "TaskName: " + TaskName + System.Environment.NewLine + ": " + Value)

 

        Dts.TaskResult = Dts.Results.Success

    End Sub

End Class

 

 

달라진 것은 무어냐?

If Not EventLog.SourceExists(PackageName) Then

        EventLog.CreateEventSource(PackageName, "SSIS Log")

End If

이것입니다.

영어 시간은 아니지만 위의 지문을 해석하자면
“PackageName
이라는 변수 안에 들어있는 문자열을 원본으로 하는 로그가 있냐?
없으면 앞으로 원본은 SSIS Log라는 이름의 로그에 기록하겠다.”
라는 뜻으로 의역할 있습니다.

그러면 우리의 친절한 닷넷씨는 만약 SSIS Log라는 로그 파일이 없으면 파일을 만들어서 거기에
기록하고 파일이 있으면 그냥 로그 파일에 기록을 합니다.

그런데 우리는 조금 전에 패키지 이름으로 이벤트 로그에 남기도록 한번 실행을 했었습니다.
따라서 PackageName 변수 안의 문자열을 원본으로 하는 이벤트 로그가 응용 프로그램이라는
로그 파일에 저장이 됐었습니다.

 

따라서 새로운 이름으로 원본을 던져 필요가 있었는데 그래서

Dim PackageName As String = "P_" + Dts.Variables("PackageName").Value.ToString

패키지 이름 앞에 “P_” 붙여주었습니다.

이제 한번 실행해보겠습니다.

이벤트 뷰어를 보니 좌측 로그 파일 폴더에 아무것도 생기지 않았습니다.
제가 구라를 모양이 돼버렸습니다. -_-;;;

좌측 로그 파일 폴더는 새로 고침이 되질 않습니다.

따라서 이벤트 뷰어를 닫고 새로 열어보겠습니다.


SSIS Log라는 로그 파일이 생겼고 이벤트가 새로 등록되었습니다.

 

이렇게 이벤트 로그를 남기는 방법을 이용해서

에러 핸들링을 때는 물론이고 스크립트 작업을 하면서도 이벤트 로그를 남길 수가 있습니다.

남은 응용뿐
반응형

+ Recent posts