Pular para o conteúdo principal

Introduzindo structured_logger para Flutter

· 2 min para ler
Altamir
Maintainer

Logging em apps Flutter costuma ser uma mistura de print, debugPrint e strings montadas na hora. Funciona no dia a dia, mas dificulta busca, alertas e correlação quando o app cresce.

O problema com logs não estruturados

Imagine depurar um problema em produção com a seguinte linha:

User 42 failed to checkout after 3 retries

Quem é o usuário 42? Qual foi o erro? Em qual tentativa falhou? Sem campos separados, cada ferramenta de observabilidade precisa fazer parsing frágil de texto livre.

A abordagem estruturada

Com structured_logger, você separa o template da mensagem das propriedades:

await logger.log(
'User {userId} failed checkout after {retries} retries: {error}',
level: LogLevel.error,
data: {
'userId': 42,
'retries': 3,
'error': 'payment_timeout',
},
);

O template permanece estável para agrupamento; os dados ficam indexáveis em backends como Seq.

Sinks: um evento, vários destinos

O diferencial do pacote é o modelo de sinks. O mesmo evento pode ir para:

  • Terminal (SimpleLineSink) — leitura rápida durante o desenvolvimento
  • DevTools (DefaultSink) — inspeção no log do desenvolvedor Dart
  • Seq (SinkSeq) — centralização em produção
final logger = StructureLogger();
logger.addSink(SimpleLineSink());
logger.addSink(SinkSeq('https://seq.example.com', apiKey: apiKey));

Próximos passos