Codificando um provedor de log personalizado

Aplica-se a: SQL Server SSIS Integration Runtime em Azure Data Factory

Depois de criar uma classe que herda da LogProviderBase classe base e aplicar o DtsLogProviderAttribute atributo à classe, deve sobrescrever a implementação das propriedades e métodos da classe base para fornecer a sua funcionalidade personalizada.

Para exemplos funcionais de fornecedores de registos personalizados, consulte Desenvolvimento de uma Interface de Utilizador para um Fornecedor de Registos Personalizados.

Configuração do Fornecedor de Registo

Inicialização do Fornecedor de Registo

Sobrepões o InitializeLogProvider método para guardar referências à coleção de ligações e à interface de eventos. Pode usar estas referências em cache mais tarde noutros métodos do fornecedor de log.

Usando a propriedade ConfigString

No momento do conceção, um fornecedor de registo recebe informação de configuração da coluna Configuração . Esta informação de configuração corresponde à ConfigString propriedade do fornecedor do registo. Por defeito, esta coluna contém uma caixa de texto da qual pode obter qualquer informação de cadeia. A maioria dos fornecedores de registos incluídos nos Serviços de Integração utiliza esta propriedade para armazenar o nome do gestor de ligação que o fornecedor utiliza para se ligar a uma fonte de dados externa. Se o seu fornecedor de registos usar a ConfigString propriedade, utilize o Validate método para validar essa propriedade e certifique-se de que está corretamente definida.

Validação do Fornecedor de Registo

Sobrepõe-se ao Validate método para garantir que o fornecedor está configurado corretamente e pronto para execução. Normalmente, um nível mínimo de validação serve para garantir que o ConfigString está corretamente definido. A execução não pode continuar até que o fornecedor de log regresse Success do Validate método.

O exemplo de código seguinte mostra uma implementação de Validate que garante que o nome de um gestor de ligação está especificado, que o gestor de ligação existe no pacote e que o gestor de ligação devolve um nome de ficheiro na ConfigString propriedade.

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  

Persistência do Fornecedor de Registo

Normalmente, não é necessário implementar persistência personalizada para um gestor de ligações. A persistência personalizada é necessária apenas quando as propriedades de um objeto utilizam tipos de dados complexos. Para mais informações, consulte Desenvolvimento de Objetos Personalizados para Serviços de Integração.

Registo com o Fornecedor de Registos

Existem três métodos de tempo de execução que devem ser sobrepostos por todos os fornecedores de log: OpenLog, Log, e CloseLog.

Importante

Durante a validação e execução de um único pacote, os OpenLog métodos e CloseLog são chamados mais do que uma vez. Certifique-se de que o seu código personalizado não faz com que entradas anteriores do registo sejam sobrescrevidas na próxima abertura e fecho do registo. Se selecionou registar eventos de validação no seu pacote de teste, o primeiro evento registado que deverá ver é o OnPreValidate; se, em vez disso, o primeiro evento registado que vê for o PackageStart, os eventos iniciais de validação foram sobrescritos.

Abertura do Tronco

A maioria dos fornecedores de registos liga-se a uma fonte de dados externa, como um ficheiro ou base de dados, para armazenar a informação do evento recolhida durante a execução do pacote. Tal como em qualquer outro objeto em tempo de execução, a ligação à fonte de dados externa é normalmente realizada através do uso de objetos do gestor de conexões.

O OpenLog método é chamado no início da execução do pacote. Substitua este método para estabelecer uma ligação à fonte de dados externa.

O seguinte código de exemplo mostra um fornecedor de registo que abre um ficheiro de texto para escrita durante OpenLog. Abre o ficheiro chamando o AcquireConnection método do gestor de ligação especificado na ConfigString propriedade.

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  

Escrita de Entradas de Registo

O Log método é chamado sempre que um objeto no pacote levanta um evento, chamando um método de evento> Fire<numa das interfaces de eventos. Cada evento é levantado com informações sobre o seu contexto e geralmente uma mensagem explicativa. No entanto, nem todas as chamadas ao Log método incluem informação para cada parâmetro do método. Por exemplo, alguns eventos padrão cujos nomes são autoexplicativos não fornecem MessageText, e DataCode e DataBytes destinam-se a informações suplementares opcionais.

O exemplo de código seguinte implementa o Log método e escreve os eventos no fluxo que foi aberto na secção anterior.

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  

Fechar o Tronco

O CloseLog método é chamado no final da execução do pacote, depois de todos os objetos do pacote terem terminado a execução, ou quando o pacote para devido a erros.

O exemplo de código seguinte demonstra uma implementação do CloseLog método que fecha o fluxo de ficheiros que foi aberto durante o OpenLog método.

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