Partilhar via


Codificando um provedor de log personalizado

Após ter criado uma classe que herda da classe base LogProviderBase e aplicado o atributo DtsLogProviderAttribute à classe, você deverá substituir a implementação das propriedades e dos métodos da classe base para fornecer sua funcionalidade personalizada.

Para obter exemplos funcionais de provedores de log personalizados, consulte os exemplos do Integration Services no Codeplex.

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

Observação importanteImportante

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 tempo de execução, 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 Fire<evento> 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 auto-explicativos 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 pára devido a erros.

O exemplo de código seguinte 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
Ícone do Integration Services (pequeno) Fique atualizado com o Integration Services

Para obter os mais recentes downloads, artigos, exemplos e vídeos da Microsoft, bem como soluções selecionadas da comunidade, visite a página do Integration Services no MSDN ou TechNet:

Para receber uma notificação automática das atualizações, assine os feeds RSS disponíveis na página.