Estava tentando lançar erros no meu programa Golang com log.Fatal
mas, log.Fatal
também não imprime a linha onde o log.Fatal
foi executado. Não há como obter acesso ao número da linha que chamou log.Fatal? ou seja, existe uma maneira de obter o número da linha ao lançar um erro?
Eu estava tentando pesquisar no Google, mas não sabia como. A melhor coisa que consegui foi imprimir o rastreamento da pilha , o que acho bom, mas pode ser um pouco demais. Eu também não quero escrever debug.PrintStack()
sempre que preciso do número da linha, estou apenas surpreso que não haja nenhuma função embutida para este tipo log.FatalStackTrace()
ou algo que não seja fantasia.
Além disso, o motivo pelo qual não quero fazer minhas próprias coisas de depuração / tratamento de erros é porque não quero que as pessoas tenham que aprender como usar meu código especial de tratamento de fantasias. Eu só quero algo padrão onde as pessoas possam ler meu código mais tarde e ser como
"ah ok, então é lançar um erro e fazer X ..."
Quanto menos pessoas aprenderem sobre meu código, melhor :)
fonte
Respostas:
Você pode definir os sinalizadores em um registrador personalizado ou o padrão para incluir
Llongfile
ouLshortfile
fonte
var mylog = log.New(os.Stderr, "app: ", log.LstdFlags | log.Lshortfile)
.expected declaration, found 'INDENT' log
quando tento fazerlog.SetFlags(log.LstdFlags | log.Lshortfile)
. Só me irrita ter que criar uma variável para isso, por que não pode haver umlog.Fatal("string", log.Flag)
. Mas criar um novo log de variável funcionou. É uma coisa padrão criar variáveis de log e outras coisas?func init() {}
Versão curta,
não há nada embutido diretamente, no entanto, você pode implementá-lo com uma curva de aprendizado mínima usandoruntime.Caller
playground
fonte
fn
variável atribuída deruntime.Caller()
é, na verdade, o nome do arquivo, não uma referência de função. Eu penso em fn como uma função, não como um nome de arquivo .runtime
uso de pacote. Muito útil para depuração por meio de logs.Se você precisa exatamente de um rastreamento de pilha, dê uma olhada em https://github.com/ztrue/tracerr
Eu criei este pacote para ter rastreamento de pilha e fragmentos de origem para poder depurar mais rápido e registrar erros com muito mais detalhes.
Aqui está um exemplo de código:
E aqui está a saída:
fonte