Kódování vlastního zprostředkovatele protokolu

Platí pro:SQL Server SSIS Integration Runtime v rámci Azure Data Factory

Poté, co vytvoříte třídu, která dědí ze základní třídy LogProviderBase , a aplikujete DtsLogProviderAttribute atribut na tuto třídu, musíte přepsat implementaci vlastností a metod základní třídy, abyste poskytli vlastní funkcionalitu.

Pro pracovní ukázky vlastních poskytovatelů logů viz Vývoj uživatelského rozhraní pro vlastního poskytovatele logů.

Konfigurace poskytovatele logů

Inicializace poskytovatele logů

Přepisujete metodu InitializeLogProvider a ukládáte odkazy na sbírku spojení a rozhraní událostí. Tyto cacheované odkazy můžete později použít i v jiných metodách poskytovatele logů.

Použití vlastnosti ConfigString

Při návrhu poskytovatel logů obdrží konfigurační informace ze sloupce Konfigurace . Tyto konfigurační informace odpovídají ConfigString vlastnosti poskytovatele logu. Ve výchozím nastavení tento sloupec obsahuje textové pole, ze kterého můžete získat informace o řetězci. Většina poskytovatelů logů zahrnutých v integračních službách používá tuto vlastnost k uložení názvu správce připojení, který poskytovatel používá k připojení k externímu datovému zdroji. Pokud váš poskytovatel logů tuto vlastnost ConfigString používá, použijte tuto metodu Validate k ověření této vlastnosti a ujistěte se, že je správně nastavena.

Ověřování poskytovatele logů

Přepisujete metodu Validate , abyste se ujistili, že poskytovatel byl správně nakonfigurován a připraven k vykonání. Typicky je minimální úroveň ověření zajištění, že je správně nastaveno ConfigString . Provádění nemůže pokračovat, dokud poskytovatel logu nevrátí Success z metody Validate .

Následující příklad kódu ukazuje implementaci Validate , která zajišťuje, že je specifikováno jméno správce spojení, že správce spojení existuje v balíčku a že správce spojení vrací název souboru ve ConfigString vlastnosti.

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  

Uchovávání poskytovatele logů

Obvykle není nutné implementovat vlastní perzistenci pro správce spojení. Vlastní perzistence je vyžadována pouze tehdy, když vlastnosti objektu používají složité datové typy. Pro více informací viz Vývoj vlastních objektů pro integrační služby.

Logování s poskytovatelem logů

Existují tři metody za běhu, které musí být přepsány všemi poskytovateli logů: OpenLog, Log, a CloseLog.

Important

Během validace a spuštění jednoho balíčku jsou metody a CloseLog volány OpenLog vícekrát. Ujistěte se, že váš vlastní kód nezpůsobí, že by dřívější záznamy v logu byly přepsány při dalším otevření a zavírání logu. Pokud jste zvolili zaznamenávat validační události ve svém testovacím balíčku, první zaznamenanou událostí, kterou byste měli vidět, je OnPreValidate; pokud je místo toho první zaznamenanou událostí, kterou vidíte, PackageStart, byly počáteční validační události přepsány.

Otevírání klády

Většina poskytovatelů logů se připojuje k externímu datovému zdroji, jako je soubor nebo databáze, aby uložila informace o událostech shromážděných během spuštění balíčku. Stejně jako u jakéhokoli jiného objektu v běhu se připojení k externímu datovému zdroji obvykle provádí pomocí objektů správce spojení.

Metoda OpenLog se volá na začátku spuštění balíčku. Tuto metodu přepsejte a navázáte spojení s externím datovým zdrojem.

Následující ukázkový kód ukazuje poskytovatele logů, který během . OpenLogotevírá textový soubor pro zápis . Soubor se otevře vyvoláním AcquireConnection metody správce spojení, která byla specifikována ve ConfigString vlastnosti.

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  

Psaní záznamů v deníku

Metoda Log se volá pokaždé, když objekt v balíčku vyvolá událost, vyvolání metody události> Fire<na jednom z rozhraní událostí. Každá událost je vyvolána s informacemi o svém kontextu a obvykle s vysvětlujícím poselstvím. Nicméně ne každé volání Log metody obsahuje informace pro každý parametr metody. Například některé standardní události, jejichž názvy jsou samozřejmé, neposkytují MessageText a DataCode a DataBytes jsou určeny jako volitelné doplňkové informace.

Následující příklad kódu implementuje Log metodu a zapisuje události do proudu, který byl otevřen v předchozí sekci.

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  

Uzavření klády

Metoda CloseLog se volá na konci spuštění balíčku, poté co všechny objekty v balíčku dokončily vykonání, nebo když se balíček zastaví kvůli chybám.

Následující příklad kódu ukazuje implementaci metody CloseLog , která uzavírá souborový tok otevřený během této metody 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