logged-stream é uma biblioteca de ferrugem que fornece uma estrutura LoggedStream que pode ser usada como um invólucro para o objeto IO subjacente que implementa std::io::Write e std::io::Read características ou seus análogos assíncronos da tokio Library para ativar o registro de todas as operações de leitura e gravação, erros e queda.
As construções de estrutura LoggedStream de quatro partes:
std::io::Write e std::io::Read traços ou seus análogos assíncronos da biblioteca tokio : tokio::io::AsyncRead e tokio::io::AsyncWrite .BufferFormatter fornecido por esta biblioteca. Esta parte do LoggedStream é responsável pelo formulário, você verá os bytes de entrada e saída. Currently this library provides the following implementations of BufferFormatter trait: LowercaseHexadecimalFormatter , UppercaseHexadecimalFormatter , DecimalFormatter , BinaryFormatter and OctalFormatter . Além disso, BufferFormatter é uma característica pública, então você é livre para construir sua própria implementação.RecordFilter fornecida por esta biblioteca. Esta parte do LoggedStream é responsável pela filtragem de registros de log. Atualmente, esta biblioteca fornece a seguinte implementação do RecordFilter Trait: DefaultFilter , que aceita todos os registros de log e RecordKindFilter , que aceita logs com tipos especificados durante o construto. Além disso, RecordFilter é uma característica pública e você é livre para construir sua própria implementação.Logger fornecido por esta biblioteca. Esta parte do LoggedStream é responsável por trabalhos adicionais com registro de log construído, formatado e filtrado. Por exemplo, ele pode ser produzido para console, gravado no arquivo, gravado no banco de dados, gravado na memória para uso posterior ou enviado pelo canal. Atualmente, esta biblioteca fornece as seguintes implementações de traço Logger : ConsoleLogger , MemoryStorageLogger , ChannelLogger e FileLogger . Também Logger é uma característica pública e você é livre para construir sua própria implementação. Para usar logged-stream , adicione a seguinte linha à sua Cargo.toml :
[ dependencies ]
logged-stream = " 0.4 "Ou execute o seguinte comando de carga no diretório do seu projeto:
$ cargo add [email protected]
Este é um exemplo de uso simples da estrutura LoggedStream com std::net::TcpStream como objeto Underling IO, que se conecta a algum formatador hexadecimal eco-servidor, eco-servidor, minúsculas e logger de filtro padrão e console.
fn main ( ) {
env :: set_var ( "RUST_LOG" , "debug" ) ;
env_logger :: init ( ) ;
let mut client = LoggedStream :: new (
net :: TcpStream :: connect ( "127.0.0.1:8080" ) . unwrap ( ) ,
LowercaseHexadecimalFormatter :: new ( None ) ,
DefaultFilter :: default ( ) ,
ConsoleLogger :: new_unchecked ( "debug" ) ,
) ;
let send = [ 0x01 , 0x02 , 0x03 , 0x04 ] ;
client . write_all ( & send ) . unwrap ( ) ;
let mut response = [ 0u8 ; 4 ] ;
client . read_exact ( & mut response ) . unwrap ( ) ;
let send = [ 0x05 , 0x06 , 0x07 , 0x08 ] ;
client . write_all ( & send ) . unwrap ( ) ;
let mut response = [ 0u8 ; 4 ] ;
client . read_exact ( & mut response ) . unwrap ( ) ;
let send = [ 0x09 , 0x0a , 0x0b , 0x0c ] ;
client . write_all ( & send ) . unwrap ( ) ;
let mut response = [ 0u8 ; 4 ] ;
client . read_exact ( & mut response ) . unwrap ( ) ;
let send = [ 0x01 , 0x02 , 0x03 , 0x04 ] ;
client . write_all ( & send ) . unwrap ( ) ;
let mut response = [ 0u8 ; 4 ] ;
client . read_exact ( & mut response ) . unwrap ( ) ;
}Saída para console:
[2023-04-18T08:18:45.895Z DEBUG logged_stream::logger] > 01:02:03:04
[2023-04-18T08:18:45.895Z DEBUG logged_stream::logger] < 01:02:03:04
[2023-04-18T08:18:45.895Z DEBUG logged_stream::logger] > 05:06:07:08
[2023-04-18T08:18:45.895Z DEBUG logged_stream::logger] < 05:06:07:08
[2023-04-18T08:18:45.895Z DEBUG logged_stream::logger] > 09:0a:0b:0c
[2023-04-18T08:18:45.896Z DEBUG logged_stream::logger] < 09:0a:0b:0c
[2023-04-18T08:18:45.896Z DEBUG logged_stream::logger] > 01:02:03:04
[2023-04-18T08:18:45.896Z DEBUG logged_stream::logger] < 01:02:03:04
[2023-04-18T08:18:45.896Z DEBUG logged_stream::logger] x Deallocated.
A versão completa deste exemplo pode ser encontrada lá.
O mesmo exemplo, mas reescrito usando API assíncrono, pode ser encontrado lá.
Licenciado sob qualquer um de
por sua opção.
A menos que você declare explicitamente o contrário, qualquer contribuição enviada intencionalmente para inclusão no trabalho por você, conforme definido na licença Apache-2.0, será licenciado como acima, sem termos ou condições adicionais.