log_custom_printer
Biblioteca Dart/Flutter para logging customizado com serialização JSON, formatação colorida ANSI e injeção de dependência (get_it). Ideal para aplicações que necessitam de logs estruturados, rastreáveis e visualmente organizados.
v2.0.0 — Refatoração da API de registro:
registerLogPrinterColoreregisterLogPrinterSimpleretornamLoggerPersistenceServicee incluem cache integrado por padrão. Impressoras customizadas viaregisterLogPrinter(LogPrinterBase, cacheRepository: ...).
✨ Funcionalidades
- 🎯 Hierarquia de logs tipada:
DebugLog,InfoLog,WarningLog,ErrorLog - 🎨 Formatação colorida: Códigos ANSI para logs visuais no terminal
- 📦 Serialização JSON: Auto-geração com
json_serializable - 🔧 Configuração flexível: Filtragem por tipos e controle de habilitação
- 💾 Sistema de Cache: Armazenamento de logs em memória e persistência em arquivo JSON
- 🔒 I/O seguro em concorrência: Operações de arquivo serializadas por caminho no
FileManager - 🏗️ Injeção de Dependência: Configuração via
registerLogPrinter,registerLogPrinterColorouregisterLogPrinterSimple(get_it) - 🎭 Mixin utilities:
LoggerClassMixinpara integração fácil em classes - 🔍 Rastreabilidade: Identificação automática da classe de origem
- 🖥️ Console Visual: Overlay Flutter para visualização e filtragem de logs em tempo real (
ConsoleOverlayManager)
🚀 Instalação
Adicione no pubspec.yaml:
dependencies:
log_custom_printer:
git:
url: https://github.com/saulogatti/log_custom_printer.git
# ou use path local para desenvolvimento:
# path: ../log_custom_printer
Execute:
dart pub get # Projetos Dart puro
flutter pub get # Projetos Flutter
Requisitos: Dart SDK ^3.11.0
📖 Uso Básico
Configuração Inicial (obrigatório no startup)
import 'package:log_custom_printer/log_custom_printer.dart';
void main() {
// Configuração com cores (recomendado para desenvolvimento)
// Retorna LoggerPersistenceService para acesso ao cache de logs
final persistenceService = registerLogPrinterColor(
config: ConfigLog(enableLog: true),
maxLogsInCache: 100, // Opcional: limite de logs em memória por tipo (padrão: 100)
cacheFilePath: '/caminho/para/salvar/logs', // Opcional: persistência em arquivo JSON
);
// Ou configuração simples sem cores
// final persistenceService = registerLogPrinterSimple(config: ConfigLog(enableLog: true));
runApp(MyApp());
}
Sistema de Cache
registerLogPrinterColor e registerLogPrinterSimple retornam um LoggerPersistenceService que expõe operações de leitura/limpeza de logs e usa um repositório de cache internamente (em memória e, opcionalmente, em arquivo via cacheFilePath).
Quando a persistência em arquivo está habilitada, o FileManager interno aplica serialização assíncrona por caminho (path lock). Isso evita condições de corrida em cenários com múltiplas operações concorrentes sobre o mesmo arquivo/diretório.
// Recuperar todos os logs
final allLogs = await persistenceService.getAllLogs();
// Recuperar logs por tipo
final errorLogs = await persistenceService.getLogsByType(EnumLoggerType.error);
// Limpar logs
await persistenceService.clearLogs();
await persistenceService.clearLogsByType(EnumLoggerType.debug);
Para implementar storage customizado (banco local, SharedPreferences etc.), implemente ILoggerCacheRepository e passe via registerLogPrinter(printer, cacheRepository: seuRepository, config: ...).
Usando o Mixin (Recomendado)
class MinhaClasse with LoggerClassMixin {
void minhaFuncao() {
logDebug('Iniciando função');
logInfo('Processando dados...');
try {
// código da função
logInfo('Função executada com sucesso');
} catch (error, stackTrace) {
logError('Erro na função: $error', stackTrace);
}
}
}
Uso Direto dos Objetos de Log
// Criando logs específicos
final debugLog = DebugLog('Mensagem de debug', typeClass: runtimeType);
debugLog.sendLog();
final errorLog = ErrorLog('Algo deu errado', StackTrace.current, typeClass: runtimeType);
errorLog.sendLog();
// Serialização JSON
final json = debugLog.toJson();
final logRecriado = DebugLog.fromJson(json);
Configuração Avançada
void main() {
// Configuração customizada - apenas logs de erro e debug
registerLogPrinterColor(
config: ConfigLog(
enableLog: true,
onlyClasses: {DebugLog, ErrorLog}, // Filtra apenas estes tipos
),
);
// Ou para produção - logs desabilitados
// registerLogPrinterSimple(config: ConfigLog(enableLog: false));
runApp(MyApp());
}
Regras de Entrega de Logs
ConfigLog.enableLog: quandofalse, todos os logs são ignorados exceto aqueles comalwaysPrint(ex:ErrorLog).ConfigLog.onlyClasses: filtra quais tipos são aceitos; se não estiver vazio e o tipo não estiver no conjunto, o log é descartado.LoggerClassMixin: preenche automaticamenteclassNamecom oruntimeTypeda classe que está emitindo o log.LoggerJsonList: mantém no máximomaxLogEntries(padrão 100) por tipo, inserindo o mais novo no topo e descartando o mais antigo.
🏗️ Arquitetura
Componentes Principais
LoggerObject(sealed class) — Hierarquia base para tipos de logLoggerObjectBase— Classe abstrata com funcionalidades comunsLogPrinterService— Serviço central que coordena impressão e cache (resolvido via get_it)registerLogPrinter/registerLogPrinterColor/registerLogPrinterSimple— Injeção de dependência via get_itConfigLog— Configuração de habilitação e filtragem (padrão:enableLog: false,onlyClasses: {DebugLog, WarningLog, InfoLog})LoggerPersistenceService— Serviço retornado pelosregister*para acesso ao cache/persistênciaILoggerCacheRepository— Interface para implementação customizada de armazenamento de logsLoggerClassMixin— Mixin para integração fácil em classes
Tipos de Log Disponíveis
| Tipo | Cor ANSI | Uso |
|---|---|---|
DebugLog |
🟡 Amarelo | Informações de debug/desenvolvimento |
InfoLog |
⚪ Branco | Informações gerais |
WarningLog |
🟢 Verde | Avisos e alertas |
ErrorLog |
🔴 Vermelho | Erros e exceções (sempre processado via alwaysPrint) |
Impressoras de Log
LogSimplePrint— Saída simples viaprint()(sem cores)LogWithColorPrint— Saída colorida viadart:developer.log()com separadores ANSI
Use registerLogPrinterColor() ou registerLogPrinterSimple() para configuração rápida; ou registerLogPrinter(LogPrinterBase) para impressoras customizadas.
Console Visual de Logs
O pacote inclui um overlay Flutter para visualização dos logs em tempo real durante o desenvolvimento.
import 'package:log_custom_printer/log_custom_printer.dart';
import 'package:log_custom_printer/src/console_view/application/application_injection.dart';
void main() {
initAppInjection(); // registra dependências do console visual
runApp(MyApp());
}
// Em qualquer widget com acesso ao BuildContext:
ConsoleOverlayManager.toggle(
context,
appGetIt<MessageRepository>(),
appGetIt<ILoggerCacheRepository>(),
);
Para documentação completa do console visual, consulte ConsoleView.md.
🛠️ Desenvolvimento
Dependências de Desenvolvimento
# Instalar dependências
dart pub get
# ou: flutter pub get
# Code generation (OBRIGATÓRIO após mudanças em classes @JsonSerializable)
dart run build_runner build --delete-conflicting-outputs
# Ou use o script de automação
./ci.sh -build
Comandos Úteis
# Análise estática
dart analyze
# Testes
dart test # Dart puro
flutter test # Flutter
# Documentação
dart doc # Gera documentação em doc/api
# Atualização de dependências
./ci.sh -upgrade
Cobertura atual de testes automatizados:
- Serialização e truncamento de
LoggerJsonListmantendo ordem mais recente → mais antiga - Filtragem de logs via
ConfigLog.onlyClassese priorização deErrorLog(viaalwaysPrint) mesmo comenableLog = false LoggerClassMixinpreenchendoclassNamecom oruntimeTypeda classe hospedeira- Utilitários: formatação de data/hora, aplicação de códigos ANSI e limpeza de stack trace
Geração de Documentação
O projeto está configurado para gerar documentação usando dartdoc. A configuração está definida em dartdoc_options.yaml com:
- Categorização automática por funcionalidade (Core, Log Types, Printers, Configuration, Utilities, Console View)
- Links para o código fonte no GitHub
- Exclusão automática de arquivos gerados (*.g.dart, *.freezed.dart)
- Saída em
doc/api
Para gerar a documentação:
dart doc
Para gerar no diretório docs/ (útil para servir localmente):
dart doc -o docs/
Visualização local (exemplo):
# em qualquer servidor estático, apontando para docs/
# exemplo com Python:
python -m http.server 8080 -d docs
A documentação gerada incluirá:
- Documentação completa de todas as classes públicas
- Exemplos de uso para cada componente
- Referências cruzadas entre tipos relacionados
- Categorias organizadas para fácil navegação
Adicionando Novos Tipos de Log
- Estenda
LoggerObjectBase - Adicione
@JsonSerializable()e importe.g.dart - Implemente
getColor()com cor específica - Adicione factory
fromJson()e overridetoJson() - Execute
dart run build_runner buildou./ci.sh -build
Exemplo:
import 'package:json_annotation/json_annotation.dart';
part 'custom_log.g.dart';
@JsonSerializable()
class CustomLog extends LoggerObjectBase {
CustomLog(super.message, {super.typeClass});
factory CustomLog.fromJson(Map<String, dynamic> json) =>
_$CustomLogFromJson(json);
@override
LoggerAnsiColor getColor() => LoggerAnsiColor(enumAnsiColors: EnumAnsiColors.magenta);
@override
Map<String, dynamic> toJson() => _$CustomLogToJson(this);
}
📚 Documentação
| Arquivo | Conteúdo |
|---|---|
| README.md | Visão geral, instalação e uso básico |
| Core.md | Núcleo da biblioteca e injeção de dependência |
| LogTypes.md | Tipos de log disponíveis |
| Printers.md | Estratégias de impressão |
| Configuration.md | Configuração e filtros |
| Utilities.md | Utilitários, cache e extensões |
| ConsoleView.md | Console visual de logs (overlay Flutter) |
| DOCUMENTATION.md | Documentação arquitetural expandida |
🤝 Contribuições
Contribuições são bem-vindas! Por favor:
- Mantenha a API pública estável
- Documente mudanças importantes no
CHANGELOG.md - Execute testes antes de enviar PRs
- Siga as convenções do Effective Dart
📄 Licença
Este projeto está licenciado sob os termos definidos no arquivo LICENSE do repositório.
Libraries
- main
- log_custom_printer Core - Sistema de Logging
- Biblioteca de logging customizada para Dart/Flutter.
Core - Sistema de Logging
Core — Sistema de Logging