A versão 3.0 do .NET Framework temos um namespace chamado System.IO.Log, qual traz uma série de classes para manipular um log de informações, utilizando o sistema de arquivos como repositório, mas baseando-se em registros. Isso permite catalogar e ler as informações como se elas fossem itens, ao invés de ficar manipulando linhas, strings, etc., como acontece atualmente.
Para fazer o uso dessas classes, é necessário adicionar a referencia para o assembly System.IO.Log.dll que está dentro do seguinte diretório: %ProgramFiles%Reference AssembliesMicrosoftFrameworkv3.0.
Como já era de se esperar, tudo o que for catalogado deverá ser convertido em um array de bytes. Já durante a leitura, o retorno será através de um Stream, que também deverá ser carregado para um array de bytes. O exemplo abaixo exibe como proceder para armazenar dados e também para ler o conteúdo do mesmo arquivo:
using (FileRecordSequence f = new FileRecordSequence(“Teste.log”))
{
f.Append(
new ArraySegment<byte>(Encoding.Default.GetBytes(“Mensagem para logar”)),
SequenceNumber.Invalid,
SequenceNumber.Invalid,
RecordAppendOptions.ForceFlush);
}
using (FileRecordSequence f = new FileRecordSequence(“Teste.log”))
{
foreach (LogRecord r in f.ReadLogRecords(f.BaseSequenceNumber, LogRecordEnumeratorType.Next))
{
int length = (int)r.Data.Length;
byte[] data = new byte[length];
r.Data.Read(data, 0, length);
Console.WriteLine(Encoding.Default.GetString(data));
}
}
Note que para cada append, haverá uma instancia da classe LogRecord que representará o registro corrente. A classe FileRecordSequence, responsável por grande parte do processo, também traz suporte ao processamento assíncrono, com os métodos BeginAppend e EndAppend.