Condividi tramite


Scrittura del codice di un provider di log personalizzato

Si applica a: SQL Server SSIS Integration Runtime in Azure Data Factory

Dopo avere creato una classe che eredita dalla classe di base LogProviderBase e avere 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 dei provider di log personalizzati, vedere Sviluppo di un'interfaccia utente per un provider di log personalizzato.

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 le 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 usa questa proprietà per archiviare il nome della gestione connessione usata per connettersi a un'origine dati esterna. Se il provider di log usa la proprietà ConfigString, usare 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 altre 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  

Vedi anche

Creazione di un provider di log personalizzato
Sviluppo di un'interfaccia utente per un provider di log personalizzato