사용자 지정 로그 공급자 코딩Coding a Custom Log Provider

LogProviderBase 기본 클래스에서 상속된 클래스를 만들고 이 클래스에 DtsLogProviderAttribute 특성을 적용한 후에는 기본 클래스의 속성 및 메서드 구현을 재정의하여 사용자 지정 기능을 제공해야 합니다.After you have created a class that inherits from the LogProviderBase base class, and applied the DtsLogProviderAttribute attribute to the class, you must override the implementation of the properties and methods of the base class to provide your custom functionality.

사용자 지정 로그 공급자의 작업 예제를 참조 하십시오. 사용자 인터페이스 사용자 지정 로그 공급자에 대 한 개발합니다.For working samples of custom log providers, see Developing a User Interface for a Custom Log Provider.

로그 공급자 구성Configuring the Log Provider

로그 공급자 초기화Initializing the Log Provider

InitializeLogProvider 메서드를 재정의하여 연결 컬렉션 및 이벤트 인터페이스에 대한 참조를 캐시할 수 있습니다.You override the InitializeLogProvider method to cache references to the connections collection and the events interface. 이렇게 캐시된 참조는 나중에 로그 공급자의 다른 메서드에서 사용할 수 있습니다.You can use these cached references later in other methods of the log provider.

ConfigString 속성 사용Using the ConfigString Property

디자인 타임에 로그 공급자에서 구성 정보를 받는 구성 열입니다.At design time, a log provider receives configuration information from the Configuration column. 구성 정보는 로그 공급자의 ConfigString 속성에 해당합니다.This configuration information corresponds to the ConfigString property of the log provider. 기본적으로 이 열에는 문자열 정보를 검색할 수 있는 입력란이 들어 있습니다.By default, this column contains a text box from which you can retrieve any string information. Integration ServicesIntegration Services에 포함된 대부분의 로그 공급자는 이 속성을 사용하여 해당 공급자가 외부 데이터 원본에 연결하는 데 사용하는 연결 관리자의 이름을 저장합니다.Most of the log providers included with Integration ServicesIntegration Services use this property to store the name of the connection manager that the provider uses to connect to an external data source. 로그 공급자를 사용 하는 경우는 ConfigString 속성을 사용 하 여는 Validate 메서드가이 속성의 유효성을 검사 하는 속성이 올바르게 설정 되어 있는지 확인 합니다.If your log provider uses the ConfigString property, use the Validate method to validate this property and make sure that the property is set correctly.

로그 공급자 유효성 검사Validating the Log Provider

Validate 메서드를 재정의하여 로그 공급자가 올바르게 구성되어 있고 실행 준비가 되어 있는지 확인할 수 있습니다.You override the Validate method to make sure that the provider has been configured correctly and is ready for execution. 일반적으로 최소 수준의 유효성 검사는 ConfigString이 올바르게 설정되어 있는지 확인하는 것입니다.Typically, a minimum level of validation is to make sure that the ConfigString is set correctly. 로그 공급자가 Success 메서드에서 Validate를 반환하기 전까지는 실행을 계속할 수 없습니다.Execution cannot continue until the log provider returns Success from the Validate method.

다음 코드 예에서는 연결 관리자 이름이 지정되어 있고, 연결 관리자가 패키지에 있으며, 연결 관리자가 Validate 속성에서 파일 이름을 반환하는지 확인하는 ConfigString의 구현을 보여 줍니다.The following code example shows an implementation of Validate that makes sure that the name of a connection manager name is specified, that the connection manager exists in the package, and that the connection manager returns a file name in the ConfigString property.

public override DTSExecResult Validate(IDTSInfoEvents infoEvents)  
{  
    if (this.ConfigString.Length == 0 || connections.Contains(ConfigString) == false)  
    {  
        infoEvents.FireError(0, "MyTextLogProvider", "The ConnectionManager " + ConfigString + " specified in the ConfigString property cannot be found in the collection.", "", 0);  
        return DTSExecResult.Failure;  
    }  
    else  
    {  
        string fileName = connections[ConfigString].AcquireConnection(null) as string;  

        if (fileName == null || fileName.Length == 0)  
        {  
            infoEvents.FireError(0, "MyTextLogProvider", "The ConnectionManager " + ConfigString + " specified in the ConfigString property cannot be found in the collection.", "", 0);  
            return DTSExecResult.Failure;  
        }  
    }  
    return DTSExecResult.Success;  
}  
Public Overrides Function Validate(ByVal infoEvents As IDTSInfoEvents) As DTSExecResult  
    If Me.ConfigString.Length = 0 Or connections.Contains(ConfigString) = False Then  
        infoEvents.FireError(0, "MyTextLogProvider", "The ConnectionManager " + ConfigString + " specified in the ConfigString property cannot be found in the collection.", "", 0)  
        Return DTSExecResult.Failure  
    Else   
        Dim fileName As String =  connections(ConfigString).AcquireConnectionCType(as string, Nothing)  

        If fileName = Nothing Or fileName.Length = 0 Then  
            infoEvents.FireError(0, "MyTextLogProvider", "The ConnectionManager " + ConfigString + " specified in the ConfigString property cannot be found in the collection.", "", 0)  
            Return DTSExecResult.Failure  
        End If  
    End If  
    Return DTSExecResult.Success  
End Function  

로그 공급자 지속Persisting the Log Provider

일반적으로 연결 관리자의 사용자 지정 지속성은 구현할 필요가 없습니다.Ordinarily you do not have to implement custom persistence for a connection manager. 사용자 지정 지속성은 개체의 속성이 복합 데이터 형식을 사용할 때만 필요합니다.Custom persistence is required only when the properties of an object use complex data types. 자세한 내용은 참조 Integration Services에 대 한 사용자 지정 개체 개발합니다.For more information, see Developing Custom Objects for Integration Services.

로그 공급자를 사용하여 로깅Logging with the Log Provider

모든 로그 공급자는 OpenLog, Log, CloseLog 등의 런타임 메서드 세 개를 재정의해야 합니다.There are three run-time methods that must be overridden by all log providers: OpenLog, Log, and CloseLog.

중요

단일 패키지의 유효성 검사 및 실행 중 OpenLogCloseLog 메서드는 두 번 이상 호출됩니다.During the validation and execution of a single package, the OpenLog and CloseLog methods are called more than one time. 사용자 지정 코드로 인해 다음에 로그를 열고 닫을 때 이전의 로그 항목을 덮어쓰지 않도록 해야 합니다.Make sure that your custom code does not cause earlier log entries to be overwritten by the next opening and closing of the log. 테스트 패키지에서 유효성 검사 이벤트를 로깅하도록 선택한 경우 표시되는 첫 번째 로깅 이벤트는 OnPreValidate입니다. 이 이벤트 대신 PackageStart가 표시되는 첫 번째 로깅 이벤트인 경우에는 초기 유효성 검사 이벤트가 덮어쓰여진 것입니다.If you have selected to log validation events in your test package, the first logged event that you should see is OnPreValidate; if instead the first logged event that you see is PackageStart, the initial validation events have been overwritten.

로그 열기Opening the Log

대부분의 로그 공급자는 파일 또는 데이터베이스와 같은 외부 데이터 원본에 연결하여 패키지가 실행되는 동안 수집된 이벤트 정보를 저장합니다.Most log providers connect to an external data source, such as a file or database, to store the event information that is collected during package execution. 런타임의 다른 개체와 마찬가지로 외부 데이터 원본에 연결하는 작업은 일반적으로 연결 관리자 개체를 사용하여 수행됩니다.As with any other object in the runtime, connecting to the external data source is typically accomplished by using connection manager objects.

OpenLog 메서드는 패키지 실행이 시작될 때 호출되며, 이 메서드를 재정의하여 외부 데이터 원본에 대한 연결을 설정할 수 있습니다.The OpenLog method is called at the start of package execution.Override this method to establish a connection to the external data source.

다음 예제 코드에서는 OpenLog 실행 중에 텍스트 파일을 쓰기용으로 여는 로그 공급자를 보여 줍니다.The following sample code shows a log provider that opens a text file for writing during OpenLog. 이 로그 공급자는 AcquireConnection 속성에 지정된 연결 관리자의 ConfigString 메서드를 호출하여 파일을 엽니다.It opens the file by calling the AcquireConnection method of the connection manager that was specified in the ConfigString property.

public override void OpenLog()  
{  
    if(!this.connections.Contains(this.ConfigString))  
        throw new Exception("The ConnectionManager " + this.ConfigString + " does not exist in the Connections collection.");  

    this.connectionManager = connections[ConfigString];  
    string filePath = this.connectionManager.AcquireConnection(null) as string;  

    if(filePath == null || filePath.Length == 0)  
        throw new Exception("The ConnectionManager " + this.ConfigString + " is not a valid FILE ConnectionManager");  

    //  Create a StreamWriter to append to.  
    sw = new StreamWriter(filePath,true);  

    sw.WriteLine("Open log" + System.DateTime.Now.ToShortTimeString());  
}  
Public Overrides  Sub OpenLog()  
    If Not Me.connections.Contains(Me.ConfigString) Then  
        Throw New Exception("The ConnectionManager " + Me.ConfigString + " does not exist in the Connections collection.")  
    End If  

    Me.connectionManager = connections(ConfigString)  
    Dim filePath As String =  Me.connectionManager.AcquireConnectionCType(as string, Nothing)  

    If filePath = Nothing Or filePath.Length = 0 Then  
        Throw New Exception("The ConnectionManager " + Me.ConfigString + " is not a valid FILE ConnectionManager")  
    End If  

    '  Create a StreamWriter to append to.  
    sw = New StreamWriter(filePath,True)  

    sw.WriteLine("Open log" + System.DateTime.Now.ToShortTimeString())  
End Sub  

로그 항목 기록Writing Log Entries

Log 메서드는 패키지의 개체가 이벤트를 발생 시킵니다 화재를 호출 하 여 될 때마다<이벤트 > 메서드를 이벤트 인터페이스 중 하나입니다.The Log method is called every time that an object in the package raises an event by calling a Fire<event> method on one of the event interfaces. 각 이벤트가 발생할 때는 해당 컨텍스트에 대한 정보와 설명 메시지도 포함됩니다.Each event is raised with information about its context and usually an explanatory message. 그러나 Log 메서드를 호출할 때마다 모든 메서드 매개 변수에 대한 정보가 포함되는 것은 아닙니다.However, not every call to the Log method includes information for every method parameter. 예를 들어 이름이 설명 역할을 하는 표준 이벤트는 MessageText를 제공하지 않으며 DataCode와 DataBytes는 선택적인 추가 정보를 위한 것입니다.For example, some standard events whose names are self-explanatory do not provide MessageText, and DataCode and DataBytes are intended for optional supplemental information.

다음 코드 예에서는 Log 메서드를 구현하고 이전 섹션에서 연 스트림에 이벤트를 기록합니다.The following code example implements the Log method, and writes the events to the stream that was opened in the previous section.

public override void Log(string logEntryName, string computerName, string operatorName, string sourceName, string sourceID, string executionID, string messageText, DateTime startTime, DateTime endTime, int dataCode, byte[] dataBytes)  
{  
    sw.Write(logEntryName + ",");  
    sw.Write(computerName + ",");  
    sw.Write(operatorName + ",");  
    sw.Write(sourceName + ",");  
    sw.Write(sourceID + ",");  
    sw.Write(messageText + ",");  
    sw.Write(dataBytes + ",");  
    sw.WriteLine("");  
}  
Public Overrides  Sub Log(ByVal logEnTryName As String, ByVal computerName As String, ByVal operatorName As String, ByVal sourceName As String, ByVal sourceID As String, ByVal executionID As String, ByVal messageText As String, ByVal startTime As DateTime, ByVal endTime As DateTime, ByVal dataCode As Integer, ByVal dataBytes() As Byte)  
    sw.Write(logEnTryName + ",")  
    sw.Write(computerName + ",")  
    sw.Write(operatorName + ",")  
    sw.Write(sourceName + ",")  
    sw.Write(sourceID + ",")  
    sw.Write(messageText + ",")  
    sw.Write(dataBytes + ",")  
    sw.WriteLine("")  
End Sub  

로그 닫기Closing the Log

CloseLog 메서드는 패키지 실행이 끝날 때, 즉 패키지에 있는 모든 개체의 실행이 완료된 후나 오류로 인해 패키지가 중지된 경우에 호출됩니다.The CloseLog method is called at the end of package execution, after all the objects in the package have completed execution, or, when the package stops because of errors.

다음 코드 예에서는 CloseLog 메서드 실행 중 연 파일 스트림을 닫는 OpenLog 메서드의 구현을 보여 줍니다.The following code example demonstrates an implementation of the CloseLog method that closes the file stream that was opened during the OpenLog method.

public override void CloseLog()  
{  
    if (sw != null)  
    {  
        sw.WriteLine("Close log" + System.DateTime.Now.ToShortTimeString());  
        sw.Close();  
    }  
}  
Public Overrides  Sub CloseLog()  
    If Not sw Is Nothing Then  
        sw.WriteLine("Close log" + System.DateTime.Now.ToShortTimeString())  
        sw.Close()  
    End If  
End Sub  

관련 항목:See Also

사용자 지정 로그 공급자 만들기 Creating a Custom Log Provider
사용자 지정 로그 공급자에 대 한 사용자 인터페이스 개발Developing a User Interface for a Custom Log Provider