반응형

2. 성능 로그 파일을 이동시켜오자.


 

백도훈

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

로그 파일을 읽어오는 패키지의 흐름은 다음과 같습니다.

1.       대상 서버의 로그 폴더에서 파일들을 모두 이동해서 로컬로 가져온다.

2.       로컬 폴더의 모든 파일들을 모두 DB 입력하고 삭제한다.

입니다.

 

먼저 DB 준비하겠습니다.

create database PerfMonDB

go

use PerfMonDB

 

create table PerfData (

                  PerfTime datetime,

                  ProcessorTime float,

                  UserConnections float,

                  BatchRequests float,

                  SqlCompilations float,

                  ProcessorQueueLength float

)

 

create table number (

                  num int

)

 

create table Member (

                  seq int identity(1, 1),

                  name varchar(10),

                  mail varchar(100)

)

 

declare @i int

set @i = 0

while (@i <24)

begin

                  insert number values(@i)

                  set @i = @i + 1

end

 

--insert Member values ('관리자1', '메일 주소1')

--insert Member values ('관리자2', '메일 주소2')

 

PerfData 테이블의 컬럼 이름은 각자 수집하기로 결정한 카운터의 이름에 따라 조금씩 변경해주셔도 상관없습니다만 이후 진행할 이름에 맞춰서 쿼리를 수정하셔야 합니다.

 

마지막 주석 줄은 테스트 하시는 분의 이름과 메일 주소를 넣어서 입력해주세요.

테이블 내의 관리자에게 모두 메일을 발송하는 방식으로 구현할 생각이라 다른 메일 주소로 이상 넣어주시면 좋을 같습니다.

 

다음은 관리 대상 서버에서 설정한 공유 폴더가 제대로 열리는 확인해보겠습니다.

실행 창에서 대상 폴더를 입력해서 확인해보겠습니다. 각자의 환경에 따라서 네트워크 이름이 다르겠지요? 저의 경우는 아래와 같았습니다. 전에 Agent 작업 걸고 글도 쓰고 점심도 먹으러 다녀 사이에 로그 파일이 증가했네요.


 

, 이제 본격적으로 패키지를 만들어보겠습니다.

 

1.       InsertPerfData.dtsx라는 이름의 패키지를 생성하겠습니다.

 

2.       패키지 범위의 SourceDir이라는 이름의 String 변수 생성합니다.
그리고 로그 파일이 남겨지는 폴더 경로를 값으로 입력합니다.
저의 경우는 \\adc1\PerfMon\ 이라고 입력했습니다. (마지막에 슬래시도 넣어주세요.)

 

3.       패키지 범위의 FileName이라는 이름의 String 변수 추가합니다.
그리고 PerfMon_000001.csv 기본 값으로 입력합니다.

 

4.       Foreach 루프 컨테이너 추가하고 이름을 PerfLog파일 이동이라고 변경하겠습니다.
더블 클릭해서 컬렉션 메뉴의 Expressions 속성 Directory 속성을 SourceDir 변수와 매핑시켜줍니다.
열거자 구성의 폴더 입력란에 로그 폴더를 입력해주고 *.csv 파일이라고 입력합니다.
파일 이름 검색은 이름 확장명을 선택합니다.


변수 매핑 메뉴에서 FileName 변수를 인덱스 0으로 매핑시킵니다.
이제 Foreach 루프 컨테이너는 로그 폴더의 *.csv 파일들의 파일명을 FileName 변수에 할당하면서 루프를 돌게 입니다.

5.       패키지 범위의 Canuse라는 이름의 Boolean 변수 추가합니다. 기본 값은 False

6.       로그 파일 중에서 기록 중이어서 잠긴 파일을 이동하려고 하면 에러가 발생합니다. 따라서 파일을 제외하기 위한 파일 잠김을 체크하는 작업을 추가하겠습니다.
스크립트 작업 PerfLog파일 이동 작업 안에 추가하고 파일 잠김 검사라고 이름을 변경합니다. 더블 클릭해서 편집기를 열고 스크립트 메뉴의
ReadOnlyVariables
속성에 SourceDir, FileName 라고 입력합니다.
ReadWriteVariables
속성에 Canuse 라고 입력합니다.

스크립트 디자인 버튼을 클릭해서 VSA(Visual Studio for Application) 엽니다. 아래의 소스를 입력합니다.

Imports System

Imports System.Data

Imports System.Math

Imports Microsoft.SqlServer.Dts.Runtime

Imports System.IO

 

Public Class ScriptMain

    Public Sub Main()

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

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

 

        Try

            Dim SR As StreamReader = File.OpenText(DirName + FileName)

            SR.Dispose()

            Dts.Variables("Canuse").Value = True

        Catch ex As Exception

            Dts.Variables("Canuse").Value = False

        End Try

 

        Dts.TaskResult = Dts.Results.Success

    End Sub

 

End Class

 

파일을 OpenText함수를 이용해서 열려고 잠겨서 열리지 않으면 에러가 발생하는데 이것을 Try ~ Catch 문으로 잡아내서 Canuse 변수의 값을 각각 설정해준다는 내용입니다.

7.       연결 관리자에서 파일 연결 추가합니다.
사용 유형은 기존 파일을 선택하고
찾아보기 버튼을 클릭해서 파일 선택 창을 엽니다.
파일 이름 입력란에 로그 폴더(저의 경우에는 \\adc1\PerfMon\) 입력하면 파일 찾기가 수월합니다. PerfMon_000001.csv 파일을 선택합니다. 만약 같은 이름의 파일이 없다면 아무 csv파일이나 상관없습니다.
파일 연결 관리자 이름을 SourceFile이라고 변경하겠습니다.

SoucrFile
Expressions 속성 중에서 ConnectionString 속성의 값을
@[
사용자::SourceDir] + @[사용자::FileName]
라고 입력합니다.


캡쳐 이미지가 복잡해 보이지만 화살표를 따라가보면 창이 뜨는 순서를 파악할 수가 있습니다. 이렇게 해야지 Foreach 루프 작업 안에서 파일 명을 동적으로 가져오면서 모든 파일을 이동할 있습니다.

8.       패키지 범위의 TargetDir이라는 이름의 String 변수 추가합니다.
그리고 로그 파일을 이동시켜올 폴더의 이름을 값으로 입력합니다. 존재하지 않는 폴더를 지정하면 안되요~ ;; (저의 경우는 D:\LogFiles\ 라고 입력하였습니다.)
그리고 뒤에 반드시 슬래시를 입력해주세요.

9.       연결 관리자에서 파일 연결 추가합니다.
이번에는 사용 유형을 기존 폴더로 선택하고 8번에서 지정한 폴더를 선택해주세요.
파일 연결 관리자 이름을 TargetDir이라고 변경하겠습니다.
TargetDir
Expressions 속성 중에서 ConnectionString 속성의 값을
@[
사용자:: TargetDir]이라고 입력합니다. ( 7번과 비슷한 작업이므로 캡쳐는 생략하겠습니다.)

10.    파일 시스템 작업을 PerfLog파일 이동 작업 안에 추가하고 파일 잠김 검사 작업과 연결합니다. 이름은 로그 파일 이동이라고 변경하겠습니다.
더블 클릭해서 편집기를 열고
DestinationConnection
속성의 값으로 TargetDir 선택해주시고
SourceConnection
속성의 값으로 SourceFile 선택합니다.
Operation
속성은 파일 이동으로 변경합니다.

11.    파일 잠김 검사 작업과 로그 파일 이동 작업 사이의 작업 선을 더블 클릭해서 선행 제약 조건 편집기를 엽니다.
평가 작업을 식으로 변경하고 식에는 @Canuse 입력합니다. Canuse 변수가 Boolean타입이라 자체로 True/False 식으로 사용할 있습니다.


지금까지 작업한 패키지의 캡쳐입니다.


여기까지 작업하고 패키지를 실행해보겠습니다.
어떤 일이 일어날까요? 아마도 로그 저장 폴더에서 현재 잠겨있는 파일 하나를 제외하고 모두 로컬의 폴더로 이동이 되야 정상일 것입니다.


저는 현재 기록 중인 로그 파일을 제외한 모든 파일이 정상적으로 이동되었는데 다들 실행이 되었는지 모르겠네요.

반응형

+ Recent posts