Koda en anpassad loggleverantör

Gäller för:SQL Server SSIS Integration Runtime i Azure Data Factory

Efter att du har skapat en klass som ärver från LogProviderBase basklassen och applicerat attributet DtsLogProviderAttribute på klassen, måste du åsidosätta implementeringen av basklassens egenskaper och metoder för att tillhandahålla din anpassade funktionalitet.

För arbetsexempel på anpassade loggleverantörer, se Utveckling av användargränssnitt för en anpassad loggleverantör.

Konfigurera loggleverantören

Initiering av loggleverantören

Du åsidosätter InitializeLogProvider metoden för att cacheminna referenser till anslutningssamlingen och händelsegränssnittet. Du kan använda dessa cachade referenser senare i andra metoder hos loggleverantören.

Användning av egenskapen ConfigString

Vid designtillfället får en loggleverantör konfigurationsinformation från kolumnen Konfiguration . Denna konfigurationsinformation motsvarar egenskapen ConfigString hos loggleverantören. Som standard innehåller denna kolumn en textruta där du kan hämta vilken stränginformation som helst. De flesta loggleverantörer som ingår i Integration Services använder denna egenskap för att lagra namnet på anslutningshanteraren som leverantören använder för att ansluta till en extern datakälla. Om din loggleverantör använder egenskapen ConfigString , använd Validate metoden för att validera denna egenskap och se till att egenskapen är korrekt inställd.

Validering av loggleverantören

Du åsidosätter Validate metoden för att säkerställa att leverantören har konfigurerats korrekt och är redo att köras. Vanligtvis är en miniminivå av validering att säkerställa att det ConfigString är korrekt inställt. Exekveringen kan inte fortsätta förrän loggleverantören återvänder Success från metoden Validate .

Följande kodexempel visar en implementation av Validate som säkerställer att namnet på en anslutningshanterare är specificerat, att anslutningshanteraren finns i paketet, och att anslutningshanteraren returnerar ett filnamn i egenskapen 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  

Att upprätthålla loggleverantören

Vanligtvis behöver du inte implementera anpassad persistens för en anslutningshanterare. Anpassad persistens krävs endast när objektets egenskaper använder komplexa datatyper. För mer information, se Utveckling av anpassade objekt för integrationstjänster.

Loggning med loggleverantören

Det finns tre körtidsmetoder som måste överskrivas av alla loggleverantörer: OpenLog, Log, och CloseLog.

Important

Under validering och körning av ett enda paket anropas och-metoderna OpenLogCloseLog mer än en gång. Se till att din anpassade kod inte orsakar att tidigare loggposter skrivs över vid nästa öppning och stängning av loggen. Om du har valt att logga valideringshändelser i ditt testpaket bör den första loggade händelsen du ser vara OnPreValidate; om istället den första loggade händelsen du ser är PackageStart, har de initiala valideringshändelserna skrivits över.

Att öppna loggen

De flesta loggleverantörer ansluter till en extern datakälla, såsom en fil eller databas, för att lagra händelseinformationen som samlas in under paketexekveringen. Precis som med alla andra objekt i runtimen görs anslutningen till den externa datakällan vanligtvis genom att använda anslutningshanterare.

Metoden OpenLog anropas i början av paketexekveringen. Åsidosätt denna metod för att etablera en anslutning till den externa datakällan.

Följande exempelkod visar en loggleverantör som öppnar en textfil för att skriva under OpenLog. Den öppnar filen genom att anropa AcquireConnection metoden för anslutningshanteraren som specificerades i egenskapen 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  

Att skriva loggposter

Metoden Log anropas varje gång ett objekt i paketet anropar en händelse genom att anropa en Fire-händelsemetod>< på ett av händelsegränssnitten. Varje händelse tas upp med information om sitt sammanhang och vanligtvis ett förklarande budskap. Dock innehåller inte varje anrop till Log metoden information för varje metodparameter. Till exempel tillhandahåller vissa standardhändelser vars namn är självförklarande inte MessageText, och DataCode och DataBytes är avsedda för valfri kompletterande information.

Följande kodexempel implementerar Log metoden och skriver händelserna till strömmen som öppnades i föregående avsnitt.

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  

Stängning av loggen

Metoden CloseLog anropas i slutet av paketexekveringen, efter att alla objekt i paketet har slutfört exekveringen, eller när paketet stannar på grund av fel.

Följande kodexempel demonstrerar en implementation av metoden CloseLog som stänger filströmmen som öppnades under metoden 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