loguinho 1.0.2
loguinho: ^1.0.2 copied to clipboard
Framework de logging estruturado, seguro, de alta performance e multiplataforma para aplicações Dart e Flutter.
example/lib/main.dart
import 'package:flutter/material.dart';
import 'package:loguinho/loguinho.dart';
void main() {
WidgetsFlutterBinding.ensureInitialized();
// 1. Configura o Loguinho para o ambiente de desenvolvimento
Loguinho.configure(LoggerConfig.development());
Loguinho.setSessionId('sess_demo_123456');
Loguinho.setUserId('desenvolvedor@flubit.dev');
runApp(const LoguinhoDemoApp());
}
class LoguinhoDemoApp extends StatelessWidget {
const LoguinhoDemoApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Loguinho Demo App',
debugShowCheckedModeBanner: false,
theme: ThemeData.dark().copyWith(
scaffoldBackgroundColor: const Color(0xFF090D16),
colorScheme: const ColorScheme.dark(
primary: Color(0xFF38BDF8),
surface: Color(0xFF111827),
),
),
// Interceptador automático de navegação/rotas no Flutter
navigatorObservers: [LoguinhoNavigatorObserver()],
// Envolve a aplicação no LoguinhoOverlay (botão flutuante 🪵)
builder: (context, child) => LoguinhoOverlay(child: child),
initialRoute: '/',
routes: {
'/': (context) => const DemoHomePage(),
'/details': (context) => const DemoDetailsPage(),
},
);
}
}
class DemoHomePage extends StatefulWidget {
const DemoHomePage({super.key});
@override
State<DemoHomePage> createState() => _DemoHomePageState();
}
class _DemoHomePageState extends State<DemoHomePage> {
@override
void initState() {
super.initState();
// Exemplo: Registro explícito de Page Log na inicialização da tela
Loguinho.page('HomePage', attributes: {'tab': 'overview', 'initialTime': DateTime.now().toIso8601String()});
}
void _triggerAllLogLevels() {
Loguinho.page('CheckoutPage', attributes: {'cartValue': 'R$ 149,90', 'itemsCount': 3});
Loguinho.debug('🔍 Log de Depuração (Debug)', category: 'SYSTEM');
Loguinho.info('ℹ️ Usuário visualizou a tela principal', category: 'UI');
Loguinho.success('✅ Operação realizada com sucesso', category: 'SYSTEM');
Loguinho.warning('⚠️ Alerta de consumo de memória', category: 'PERF', attributes: {'usedMb': 320});
Loguinho.error('❌ Falha ao carregar preferências do usuário', category: 'STORAGE', error: 'FileNotFoundException');
Loguinho.fatal('💥 Exceção fatal não tratada na engine', category: 'CORE', error: 'StateError: Out of memory');
Loguinho.security('🔒 Autenticação com CPF 123.456.789-00 (dados mascarados)', category: 'AUTH', attributes: {'password': 'SenhaSecreta123'});
Loguinho.performance('⚡ Renderização da Home executada', category: 'PERF', attributes: {'fps': 60, 'durationMs': 12});
// Simulação HTTP REST
LoguinhoHttpInterceptor.logRequest(method: 'POST', url: 'https://api.flubit.dev/v1/auth', body: {'email': 'user@flubit.dev'});
LoguinhoHttpInterceptor.logResponse(method: 'POST', url: 'https://api.flubit.dev/v1/auth', statusCode: 200, durationMs: 95);
Loguinho.database('🗄️ Executada query SQL SELECT * FROM users', category: 'DATABASE');
Loguinho.analytics('📊 Evento de clique no botão principal disparado', category: 'ANALYTICS');
Loguinho.audit('📜 Termos de serviço aceitos pelo usuário', category: 'AUDIT');
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('🪵 Loguinho Inspector Demo', style: TextStyle(fontWeight: FontWeight.bold, fontSize: 16)),
backgroundColor: const Color(0xFF111827),
elevation: 0,
),
body: SingleChildScrollView(
padding: const EdgeInsets.all(20),
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
// Card Explicativo
Container(
padding: const EdgeInsets.all(16),
decoration: BoxDecoration(
color: const Color(0xFF111827),
borderRadius: BorderRadius.circular(16),
border: Border.all(color: const Color(0xFF1E293B)),
),
child: const Column(
children: [
Text('🪵', style: TextStyle(fontSize: 36)),
SizedBox(height: 8),
Text(
'Demonstração Interativa do Loguinho',
style: TextStyle(color: Colors.white, fontSize: 16, fontWeight: FontWeight.bold),
),
SizedBox(height: 6),
Text(
'Toque no botão flutuante no canto da tela (ou no botão abaixo) para abrir o Loguinho Inspector e testar o registro de Page Logs, filtros por Nível (12 LogLevels), Busca e Detalhes.',
textAlign: TextAlign.center,
style: TextStyle(color: Colors.grey, fontSize: 12, height: 1.4),
),
],
),
),
const SizedBox(height: 24),
// Botão Principal: Disparar todos os LogLevels + Page Log
ElevatedButton.icon(
style: ElevatedButton.styleFrom(
backgroundColor: const Color(0xFF0284C7),
foregroundColor: Colors.white,
padding: const EdgeInsets.symmetric(vertical: 14),
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)),
),
onPressed: () {
_triggerAllLogLevels();
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(
content: Text('✨ Logs gerados para todos os LogLevels e Page View! Toque no botão 🪵 para inspecionar.'),
duration: Duration(seconds: 2),
),
);
},
icon: const Icon(Icons.flash_on_rounded, size: 20),
label: const Text('Disparar Todos os LogLevels + Page Log', style: TextStyle(fontWeight: FontWeight.bold)),
),
const SizedBox(height: 12),
// Botão: Abrir Inspetor Direto
OutlinedButton.icon(
style: OutlinedButton.styleFrom(
foregroundColor: const Color(0xFF38BDF8),
side: const BorderSide(color: Color(0xFF38BDF8)),
padding: const EdgeInsets.symmetric(vertical: 14),
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)),
),
onPressed: () => LoguinhoInspectorScreen.show(context),
icon: const Text('🪵', style: TextStyle(fontSize: 18)),
label: const Text('Abrir Loguinho Inspector Screen', style: TextStyle(fontWeight: FontWeight.bold)),
),
const SizedBox(height: 12),
// Botão: Testar Navegação de Rota (LoguinhoNavigatorObserver)
OutlinedButton.icon(
style: OutlinedButton.styleFrom(
foregroundColor: Colors.white,
side: const BorderSide(color: Color(0xFF374151)),
padding: const EdgeInsets.symmetric(vertical: 14),
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)),
),
onPressed: () => Navigator.pushNamed(context, '/details'),
icon: const Icon(Icons.alt_route_rounded, size: 20),
label: const Text('Navegar para Tela de Detalhes (Testa Observer + Page Log)', style: TextStyle(fontWeight: FontWeight.bold)),
),
const SizedBox(height: 24),
const Text('TESTES INDIVIDUAIS POR NÍVEL:', style: TextStyle(color: Colors.grey, fontSize: 11, fontWeight: FontWeight.bold, letterSpacing: 1)),
const SizedBox(height: 10),
Wrap(
spacing: 8,
runSpacing: 8,
children: [
_buildLogButton('📄 Page Log', () => Loguinho.page('UserProfilePage', attributes: {'userId': 'usr_42'})),
_buildLogButton('🔍 Debug', () => Loguinho.debug('Log de depuração manual', category: 'TEST')),
_buildLogButton('ℹ️ Info', () => Loguinho.info('Log informativo manual', category: 'TEST')),
_buildLogButton('✅ Success', () => Loguinho.success('Log de sucesso manual', category: 'TEST')),
_buildLogButton('⚠️ Warning', () => Loguinho.warning('Alerta de aviso manual', category: 'TEST')),
_buildLogButton('❌ Error', () => Loguinho.error('Erro de teste simulado', category: 'TEST', error: Exception('Erro manual'))),
_buildLogButton('💥 Fatal', () => Loguinho.fatal('Erro fatal simulado', category: 'TEST')),
_buildLogButton('🔒 Security', () => Loguinho.security('Autenticação com CPF 999.888.777-66', category: 'AUTH')),
_buildLogButton('⚡ Perf', () => Loguinho.performance('Latência de renderização: 16ms', category: 'PERF')),
_buildLogButton('🌐 Network', () => LoguinhoHttpInterceptor.logResponse(method: 'GET', url: 'https://api.flubit.dev/v1/users', statusCode: 200, durationMs: 45)),
_buildLogButton('🗄️ Database', () => Loguinho.database('Query SQLite executada', category: 'DB')),
_buildLogButton('📊 Analytics', () => Loguinho.analytics('Clique em botão cadastrado', category: 'ANALYTICS')),
_buildLogButton('📜 Audit', () => Loguinho.audit('Auditoria de segurança gravada', category: 'AUDIT')),
],
),
],
),
),
);
}
Widget _buildLogButton(String label, VoidCallback onPressed) {
return ActionChip(
backgroundColor: const Color(0xFF1F2937),
side: const BorderSide(color: Color(0xFF374151)),
label: Text(label, style: const TextStyle(color: Colors.white, fontSize: 12)),
onPressed: onPressed,
);
}
}
class DemoDetailsPage extends StatefulWidget {
const DemoDetailsPage({super.key});
@override
State<DemoDetailsPage> createState() => _DemoDetailsPageState();
}
class _DemoDetailsPageState extends State<DemoDetailsPage> {
@override
void initState() {
super.initState();
// Exemplo: Registro explícito de Page Log ao abrir a Tela de Detalhes
Loguinho.page('DetailsPage', attributes: {'productId': 'prod_9982', 'source': 'home_button'});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Tela de Detalhes'),
backgroundColor: const Color(0xFF111827),
),
body: Center(
child: Padding(
padding: const EdgeInsets.all(24.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
const Icon(Icons.check_circle_outline_rounded, color: Color(0xFF38BDF8), size: 64),
const SizedBox(height: 16),
const Text(
'A rota foi interceptada automaticamente pelo LoguinhoNavigatorObserver! 🧭',
textAlign: TextAlign.center,
style: TextStyle(color: Colors.white, fontSize: 14, fontWeight: FontWeight.bold),
),
const SizedBox(height: 8),
const Text(
'Além disso, a chamada `Loguinho.page(\'DetailsPage\')` no initState() registrou explicitamente a visualização da tela no buffer.',
textAlign: TextAlign.center,
style: TextStyle(color: Colors.grey, fontSize: 12),
),
const SizedBox(height: 24),
ElevatedButton(
onPressed: () => Navigator.pop(context),
child: const Text('Voltar para a Home'),
),
],
),
),
),
);
}
}