Scrittura del codice di un provider di log personalizzato
Dopo aver creato una classe che eredita dalla classe di base LogProviderBase e aver applicato l'attributo DtsLogProviderAttribute alla classe, è necessario eseguire l'override dell'implementazione delle proprietà e dei metodi della classe di base per fornire la funzionalità personalizzata.
Per esempi reali di provider di log personalizzati, vedere gli esempi di Integration Services su Codeplex.
Configurazione del provider di log
Inizializzazione del provider di log
Eseguire l'override del metodo InitializeLogProvider per memorizzare nella cache i riferimenti alla raccolta di connessioni e all'interfaccia degli eventi. È possibile utilizzare questi riferimenti memorizzati nella cache in seguito in altri metodi del provider di log.
Utilizzo della proprietà ConfigString
In fase di progettazione un provider di log riceve informazioni di configurazione dalla colonna Configurazione. Tali informazioni corrispondono alla proprietà ConfigString del provider di log. Per impostazione predefinita, questa colonna contiene una casella di testo da cui è possibile recuperare qualsiasi informazione in formato stringa. La maggior parte dei provider di log inclusi in Integration Services utilizza questa proprietà per archiviare il nome della gestione connessione utilizzata per connettersi a un'origine dati esterna. Se il provider di log utilizza la proprietà ConfigString, utilizzare il metodo Validate per convalidarla e verificare che sia impostata correttamente.
Convalida del provider di log
Eseguire l'override del metodo Validate per verificare che il provider sia stato configurato correttamente e sia pronto per l'esecuzione. In genere, è richiesto un livello minimo di convalida per verificare che ConfigString sia impostato correttamente. L'esecuzione non può continuare finché il provider di log non restituisce Success dal metodo Validate.
Nell'esempio di codice seguente è illustrata un'implementazione di Validate che verifica che sia specificato il nome di una gestione connessione, che la gestione connessione esista nel pacchetto e che restituisca un nome di file nella proprietà ConfigString.
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
Persistenza del provider di log
In genere non è necessario implementare la persistenza personalizzata per una gestione connessione. La persistenza personalizzata è richiesta solo quando le proprietà di un oggetto utilizzano tipi di dati complessi. Per ulteriori informazioni, vedere Sviluppo di oggetti personalizzati per Integration Services.
Registrazione con il provider di log
Tutti i provider di log devono eseguire l'override di tre metodi di runtime: OpenLog, Log e CloseLog.
Importante |
---|
Durante la convalida e l'esecuzione di un singolo pacchetto, i metodi OpenLog e CloseLog vengono chiamati più di una volta. Verificare che il codice personalizzato non produca la sovrascrittura delle voci precedenti del log le volte successive che il log viene aperto e chiuso. Se è stato selezionato di registrare gli eventi di convalida nel pacchetto di test, il primo evento registrato che dovrebbe apparire è OnPreValidate; se invece il primo evento registrato visualizzato è PackageStart, significa che gli eventi di convalida iniziali sono stati sovrascritti. |
Apertura del log
La maggior parte dei provider di log si connette a un'origine dati esterna, ad esempio un file o un database, per archiviare le informazioni degli eventi raccolte durante l'esecuzione del pacchetto. Come per qualsiasi altro oggetto nel runtime, la connessione all'origine dati esterna viene in genere stabilita tramite oggetti gestione connessione.
Il metodo OpenLog viene chiamato all'inizio dell'esecuzione del pacchetto. Eseguire l'override di questo metodo per stabilire una connessione con l'origine dati esterna.
Nel codice di esempio seguente è illustrato un provider di log che apre un file di testo per la scrittura durante OpenLog. Il file viene aperto tramite una chiamata al metodo AcquireConnection della gestione connessione specificata nella proprietà ConfigString.
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
Scrittura di voci di log
Il metodo Log viene chiamato ogni volta che un oggetto del pacchetto genera un evento chiamando un metodo Fire<evento> in una delle interfacce degli eventi. Ogni evento viene generato con informazioni sul relativo contesto e in genere con un messaggio descrittivo. Tuttavia, non tutte le chiamate al metodo Log includono informazioni per ogni parametro del metodo. Ad esempio, alcuni eventi standard i cui nomi sono autodescrittivi non forniscono MessageText, mentre DataCode e DataBytes vengono utilizzati per fornire informazioni supplementari facoltative.
Nell'esempio di codice seguente viene implementato il metodo Log e vengono scritti gli eventi nel flusso aperto nella sezione precedente.
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
Chiusura del log
Il metodo CloseLog viene chiamato alla fine dell'esecuzione del pacchetto, dopo il completamento dell'esecuzione di tutti i relativi oggetti oppure quando il pacchetto viene arrestato a causa di errori.
Nell'esempio di codice seguente è illustrata un'implementazione del metodo CloseLog che chiude il flusso di file aperto durante il metodo OpenLog.
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
|
Vedere anche