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 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
|