Partilhar via


Codificando um provedor de log personalizado

Aplica-se a: Tempo de execução de integração do SSIS do SQL Server no Azure Data Factory

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

Para amostras funcionais de provedores de logs personalizados, consulte Desenvolver uma interface do usuário para um provedor de logs personalizado.

Configurando o provedor de log

Inicializando o provedor de log

Você substitui o método InitializeLogProvider para armazenar em cache as referências à coleção de conexões e à interface de eventos. Você poderá usar essas referências armazenadas em cache posteriormente em outros métodos do provedor de log.

Utilizando a propriedade ConfigString

Em tempo de design, um provedor de logs recebe informações de configuração da coluna Configuração. Essas informações de configuração correspondem à propriedade ConfigString do provedor de log. Por padrão, esta coluna contém uma caixa de texto da qual você pode recuperar informações de cadeia de caracteres. A maioria dos provedores de log fornecida com o Integration Services usa essa propriedade para armazenar o nome do gerenciador de conexões que o provedor usa para se conectar com uma fonte de dados externa. Se o provedor de logs usar a propriedade ConfigString, use o método Validate para validar essa propriedade e verificar se ela está definida corretamente.

Validando o provedor de log.

Substitua o método Validate para verificar se o provedor foi configurado corretamente e se está pronto para execução. Normalmente, um nível mínimo de validação é para verificar se a ConfigString está definida corretamente. A execução não pode continuar até que o provedor de log retorne Success do método Validate.

O exemplo de código a seguir mostra uma implementação de Validate que verifica se o nome do gerenciador de conexões está especificado, se o gerenciador de conexões existe no pacote e se ele retorna um nome de arquivo na propriedade 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  

Persistência do provedor de log

Normalmente você não tem que implementar a persistência personalizada em um gerenciador de conexões. A persistência personalizada é necessária somente quando as propriedades de um objeto usam tipos de dados complexos. Para obter mais informações, consulte Desenvolvendo objetos personalizados para o Integration Services.

Registrando em log com o provedor de log

Há três métodos de tempo de execução que devem ser substituídos por todos os provedores de log: OpenLog, Log e CloseLog.

Importante

Durante a validação e execução de um único pacote, são chamados os métodos OpenLog e CloseLog mais de uma vez. Verifique se seu código personalizado não faz com que as entradas de log anteriores sejam substituídas pela próxima abertura e fechamento de log. Se você optou por registrar em log os eventos de validação em seu pacote de teste, o primeiro evento registrado que deverá ver é o OnPreValidate. Se, em vez disso, o primeiro evento registrado que você visualizar for o PackageStart, os eventos de validação iniciais foram substituídos.

Abrindo o log

A maioria dos provedores de log se conecta a fontes de dados externas, como um arquivo ou banco de dados, para armazenar as informações do evento coletadas durante a execução do pacote. Como com qualquer outro objeto no runtime, a conexão com a fonte de dados externa normalmente é realizada por meio de objetos do gerenciador de conexões.

O método OpenLog é chamado no início da execução do pacote. Substitua esse método para estabelecer uma conexão com a fonte de dados externa.

O código de exemplo seguinte mostra um provedor de log que abre um arquivo de texto para gravação durante o OpenLog. Ele abre o arquivo chamando o método AcquireConnection do gerenciador de conexões que foi especificado na propriedade 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  

Gravando entradas de log

O método Log é chamado sempre que um objeto no pacote gera um evento chamando-se um método de <evento> Fire em uma das interfaces do evento. Cada evento normalmente é gerado com informações sobre seu contexto e uma mensagem explicativa. Entretanto, nem toda chamada para o método Log inclui informações de 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 são destinados para informações suplementares opcionais.

O exemplo de código seguinte implementa o método Log e grava os eventos no fluxo que foi aberto na seçã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  

Fechando o log

O método CloseLog é chamado no final da execução do pacote, depois que todos os objetos do pacote concluíram a execução ou quando o pacote para devido a erros.

O exemplo de código a seguir demonstra uma implementação do método CloseLog que fecha o fluxo de arquivos aberto durante o método 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  

Consulte Também

Criar um provedor de logs personalizado
Desenvolver uma interface do usuário para um provedor de logs personalizado