Logging com msg!
msg! escreve linhas legíveis em logs de transação. Útil para desenvolvimento e ops, mas cada chamada custa compute units - orchestre logs como qualquer código em hot path.
Receita
solana_program::msg!("swap in={} out={}", amount_in, amount_out);Quando usar:
- Depurar falhas na devnet.
- Correlacionar passos on-chain com tickets de suporte.
- Instrumentação temporária durante resposta a incidentes.
Exemplo prático
#[cfg(feature = "verbose_logs")]
macro_rules! vlog { ($($t:tt)*) => { solana_program::msg!($($t)*) }; }
#[cfg(not(feature = "verbose_logs"))]
macro_rules! vlog { ($($t:tt)*) => {}; }O que isso demonstra:
- Logs controlados por feature em builds de release.
- Macro no-op quando desabilitada.
- Caminho de produção permanece silencioso.
Mergulho profundo
Impacto em CU
Logs cobram por syscall + bytes.
Logs binários
sol_log_data para key/value compacto.
Notas Rust
// Prefira prefixos fixos: "MYPROG:step1"Erros comuns
- Logs em loop apertado - CU excedido. Correção: agregue fora do loop.
- PII nos logs - Dados públicos na chain. Correção: redija.
- Confiar em logs para auth - Atacante vê os mesmos logs. Correção: estado é a verdade.
- Formatar strings do usuário - Injeção irrelevante mas custosa. Correção: logue hashes ou ids.
- Deixar logs de debug no mainnet - Ruído e custo. Correção: feature flags.
Alternativas
| Alternativa | Use quando | Não use quando |
|---|---|---|
| Apenas erros customizados | Voltado ao usuário | Debug interno |
| Eventos Anchor | Amigável a indexadores | CU ainda se aplica |
| Simulação off-chain | Dev | Prod |
FAQs
Custo CU do msg?
Não trivial - simule.
Explorer mostra?
Sim logMessages.
log_data?
Fatias binárias.
msg Anchor?
Mesmo syscall.
Pinocchio?
Syscall log.
Max logs?
Limite da tx + CU.
Logging estruturado?
Eventos são melhores.
Indexar logs?
Plugins Geyser.
Remover para mainnet?
Recomendado ou gate.
Sim vs live?
Igual.
Agave 4.1.1?
Reperfile após upgrade.
Surfpool?
Mostra logs no trace.
Relacionados
- Emitindo logs - Ângulo nativo
- Emitindo eventos - Estruturado
- Depurando transações falhas - Fluxo de trabalho
Versões da stack: Esta página foi escrita para Agave 4.1.1, Solana CLI 3.0.10, Anchor 0.32.1, anchor-lang 0.32.1, Rust 1.91.1, @solana/kit 7.0.0, Surfpool 0.12.0 e LiteSVM 0.6.x.