Scrittura del codice di un provider di log personalizzatoCoding a Custom Log Provider

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

Per esempi reali di provider di log personalizzati, vedere lo sviluppo di un'interfaccia utente per un Provider di Log personalizzato.For working samples of custom log providers, see Developing a User Interface for a Custom Log Provider.

Configurazione del provider di logConfiguring the Log Provider

Inizializzazione del provider di logInitializing the Log Provider

Eseguire l'override del metodo InitializeLogProvider per memorizzare nella cache i riferimenti alla raccolta di connessioni e all'interfaccia degli eventi.You override the InitializeLogProvider method to cache references to the connections collection and the events interface. È possibile utilizzare questi riferimenti memorizzati nella cache in seguito in altri metodi del provider di log.You can use these cached references later in other methods of the log provider.

Utilizzo della proprietà ConfigStringUsing the ConfigString Property

In fase di progettazione, un provider di log riceve informazioni di configurazione di configurazione colonna.At design time, a log provider receives configuration information from the Configuration column. Tali informazioni corrispondono alla proprietà ConfigString del provider di log.This configuration information corresponds to the ConfigString property of the log provider. Per impostazione predefinita, questa colonna contiene una casella di testo da cui è possibile recuperare qualsiasi informazione in formato stringa.By default, this column contains a text box from which you can retrieve any string information. La maggior parte dei provider di log inclusi in Integration ServicesIntegration Services utilizza questa proprietà per archiviare il nome della gestione connessione utilizzata per connettersi a un'origine dati esterna.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. Se il provider di log utilizza la ConfigString proprietà, utilizzare il Validate metodo per convalidare questa proprietà e assicurarsi che la proprietà è impostata correttamente.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.

Convalida del provider di logValidating the Log Provider

Eseguire l'override del metodo Validate per verificare che il provider sia stato configurato correttamente e sia pronto per l'esecuzione.You override the Validate method to make sure that the provider has been configured correctly and is ready for execution. In genere, è richiesto un livello minimo di convalida per verificare che ConfigString sia impostato correttamente.Typically, a minimum level of validation is to make sure that the ConfigString is set correctly. L'esecuzione non può continuare finché il provider di log non restituisce Success dal metodo Validate.Execution cannot continue until the log provider returns Success from the Validate method.

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

Persistenza del provider di logPersisting the Log Provider

In genere non è necessario implementare la persistenza personalizzata per una gestione connessione.Ordinarily you do not have to implement custom persistence for a connection manager. La persistenza personalizzata è richiesta solo quando le proprietà di un oggetto utilizzano tipi di dati complessi.Custom persistence is required only when the properties of an object use complex data types. Per ulteriori informazioni, vedere lo sviluppo di oggetti personalizzati per Integration Services.For more information, see Developing Custom Objects for Integration Services.

Registrazione con il provider di logLogging with the Log Provider

Tutti i provider di log devono eseguire l'override di tre metodi di runtime: OpenLog, Log e CloseLog.There are three run-time methods that must be overridden by all log providers: OpenLog, Log, and CloseLog.

Importante

Durante la convalida e l'esecuzione di un singolo pacchetto, i metodi OpenLog e CloseLog vengono chiamati più di una volta.During the validation and execution of a single package, the OpenLog and CloseLog methods are called more than one time. Verificare che il codice personalizzato non produca la sovrascrittura delle voci precedenti del log le volte successive che il log viene aperto e chiuso.Make sure that your custom code does not cause earlier log entries to be overwritten by the next opening and closing of the log. 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.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.

Apertura del logOpening the 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.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. Come per qualsiasi altro oggetto nel runtime, la connessione all'origine dati esterna viene in genere stabilita tramite oggetti gestione connessione.As with any other object in the runtime, connecting to the external data source is typically accomplished by using connection manager objects.

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.The OpenLog method is called at the start of package execution.Override this method to establish a connection to the external data source.

Nel codice di esempio seguente è illustrato un provider di log che apre un file di testo per la scrittura durante OpenLog.The following sample code shows a log provider that opens a text file for writing during OpenLog. Il file viene aperto tramite una chiamata al metodo AcquireConnection della gestione connessione specificata nella proprietà 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  

Scrittura di voci di logWriting Log Entries

Il Log metodo viene chiamato ogni volta che un oggetto nel pacchetto genera un evento chiamando un incendio<evento > metodo su una delle interfacce di eventi.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. Ogni evento viene generato con informazioni sul relativo contesto e in genere con un messaggio descrittivo.Each event is raised with information about its context and usually an explanatory message. Tuttavia, non tutte le chiamate al metodo Log includono informazioni per ogni parametro del metodo.However, not every call to the Log method includes information for every method parameter. Ad esempio, alcuni eventi standard i cui nomi sono autodescrittivi non forniscono MessageText, mentre DataCode e DataBytes vengono utilizzati per fornire informazioni supplementari facoltative.For example, some standard events whose names are self-explanatory do not provide MessageText, and DataCode and DataBytes are intended for optional supplemental information.

Nell'esempio di codice seguente viene implementato il metodo Log e vengono scritti gli eventi nel flusso aperto nella sezione precedente.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  

Chiusura del logClosing the 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.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.

Nell'esempio di codice seguente è illustrata un'implementazione del metodo CloseLog che chiude il flusso di file aperto durante il metodo 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  

Vedere ancheSee Also

Creazione di un Provider di Log personalizzato Creating a Custom Log Provider
Sviluppo di un'interfaccia utente per un Provider di Log personalizzatoDeveloping a User Interface for a Custom Log Provider