Udostępnij za pośrednictwem


Coding a Custom Log Provider

Po utworzeniu klasy, która dziedziczy LogProviderBase utworzyć klasę i stosowane DtsLogProviderAttribute atrybut do klasy, należy zastąpić stosowania właściwości i metod klasy podstawowej umożliwiają korzystanie z funkcji niestandardowej.

Aby próbek pracy włączeni niestandardowych zobacz Developing a User Interface for a Custom Log Provider i EmailLogProvider Sample.

Konfigurowanie dostawca dziennika

Inicjowanie dostawca dziennika

Można zastąpić InitializeLogProvider(Connections, IDTSInfoEvents, ObjectReferenceTracker) Metoda odwołań do pamięci podręcznej do kolekcja połączeń i interfejs zdarzenia. W dalszej części innych metod dostawca dziennika można użyć tych odwołań do pamięci podręcznej.

Przy użyciu właściwość Ciąg_konfiguracji

W projekcie czas, dostawca dziennika odbiera informacje o konfiguracji z Konfiguracja kolumna.Odpowiada to informacje o konfiguracja ConfigString() Właściwość dostawca dziennika. Domyślnie ta kolumna zawiera pole tekstowe, z którego można pobierać informacje dowolnego ciąg znaków.Większość dostawców dzienników, dostępnych w programie Integration Services Ta właściwość służy do przechowywania nazwy menedżer połączeń, używanych przez dostawcę do łączenia się z danych zewnętrznych urządzenie źródłowe. Jeśli korzysta się z dostawca dziennika ConfigString() właściwości, zastosować Validate(IDTSInfoEvents) Metoda sprawdzania poprawności tej właściwości i upewnij się, że właściwość jest zestaw poprawnie.

Sprawdzanie poprawności dostawca dziennika

Można zastąpić Validate(IDTSInfoEvents) Metoda, aby upewnić się, że dostawca został poprawnie skonfigurowany i jest gotowy do wykonania. Zazwyczaj jest minimalny poziom sprawdzania poprawności, aby upewnić się, że ConfigString() jest ustawiona poprawnie. Wykonanie nie może być kontynuowana aż do momentu powrotu dostawca dziennika Success() z Validate(IDTSInfoEvents) Metoda.

Poniższy przykład kodu pokazuje implementację Validate(IDTSInfoEvents) które sprawdza, czy podano nazwę nazwę menedżera połączeń, sprawdzając, czy Menedżer połączeń w pakiecie, a Menedżer połączeń zwraca nazwę pliku w ConfigString() Właściwość.

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

Pozostające dostawca dziennika

Zazwyczaj nie trzeba zaimplementować trwałość niestandardowych dla menedżer połączeń.Trwałość niestandardowego jest wymagany tylko wtedy, gdy złożone typy danych za pomocą właściwości obiektu.Aby uzyskać więcej informacji zobaczOpracowywanie niestandardowych obiektów dla usług integracja Services.

Rejestrowanie w dzienniku dostawca

Istnieją trzy wykonywania-czas metod, które muszą zostać zastąpione przez wszystkich dostawców dzienników: OpenLog(), Log(String, String, String, String, String, String, String, DateTime, DateTime, Int32, array<Byte[]), a CloseLog().

Important noteImportant Note:

Podczas sprawdzania poprawności i wykonanie pojedynczy pakiet OpenLog() i CloseLog() metody są nazywane więcej niż jeden raz. Upewnij się, że kod niestandardowy nie powoduje wcześniejszych wpisów dziennika zostaną zastąpione przez następnego otwarcia i zamknięcia dziennika.Jeżeli wybrano opcję Rejestruj zdarzenia sprawdzania poprawności do pakiet testów, pierwszy zarejestrowane zdarzenie, które powinny być widoczne jest OnPreValidate; Jeśli natomiast pierwszego zdarzenia zarejestrowane, widoczny jest PackageStart, zastępowane zdarzenia wstępnego sprawdzania poprawności.

Otwieranie dziennika

Większość dostawców dzienników połączyć się z danych zewnętrznych urządzenie źródłowe, na przykład pliku lub bazie danych, aby przechowywać informacje o zdarzeniach, które są zbierane podczas wykonywania pakiet.Podobnie jak w przypadku każdego innego obiektu w czasie wykonywania, nawiązywanie połączenia z zewnętrznym źródłem danych jest zazwyczaj dokonywane przy użyciu obiektów menedżer połączeń.

The OpenLog() metoda is called at the start of pakiet execution.Override this metoda to establish a connection to the external data urządzenie źródłowe.

Poniższy przykład kodu pokazuje dostawca dziennika, który otwiera plik tekstowy do zapisu podczas OpenLog(). Plik zostanie otwarty przez wywołanie AcquireConnection(Object) Metoda menedżer połączeń, która została określona w ConfigString() Właściwość.

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

Wpisy dziennika do pisania

The Log(String, String, String, String, String, String, String, DateTime, DateTime, Int32, array<Byte[]) metoda is called every czas that an object in the pakiet raises an zdarzenie by calling a Fire<zdarzenie> metoda on one of the zdarzenie interfaces. Każde zdarzenie jest wywoływane z informacjami o jego kontekstem i zazwyczaj komunikat wyjaśniający.Jednak nie wszystkie wywołania Log(String, String, String, String, String, String, String, DateTime, DateTime, Int32, array<Byte[]) Metoda zawiera informacje dla każdego parametru metody. Na przykład niektóre zdarzenia standardowych, których nazwy nie wymagają wyjaśnień nie zapewniają MessageText i DataCode i DataBytes przeznaczone są dodatkowe informacje opcjonalne.

Następujący kod implementuje przykład Log(String, String, String, String, String, String, String, DateTime, DateTime, Int32, array<Byte[]) Metoda i zapisuje zdarzenia do strumienia, który został otwarty w poprzedniej sekcji.

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

Zamknięcie dziennika

The CloseLog() metoda is called at the end of pakiet execution, after all the objects in the pakiet have completed execution, or, when the pakiet stops because of errors.

Poniższy przykład kodu demonstruje implementacja CloseLog() Metoda, która zamyka strumienia pliku, który został otwarty w trakcie OpenLog() Metoda.

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
Integration Services icon (small) Konfiguracja w aktualizacji z usług integracja Services pobytu

Najnowsze pliki do pobrania, artykuły, próbki, i pliki wideo firmy Microsoft, jak również wybranego rozwiązania od Wspólnoty, odwiedź witrynę Integration Services strona w witrynie MSDN lub TechNet:

Automatycznego powiadomienie tych aktualizacji należy subskrybować źródła danych RSS, które jest dostępne strona.