Codificando um provedor de log personalizado
Depois de 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 do funcionamento 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.
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 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 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 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
|
Consulte também