- Criar um único log.Logger e distribuí-lo?
Isso é possível. Um log.Logger pode ser usado simultaneamente a partir de vários goroutines.
- Passe um ponteiro para esse log.Logger?
log.New retorna um *Logger
que geralmente é uma indicação de que você deve passar o objeto como um ponteiro. Passá-lo como valor criaria uma cópia da estrutura (ou seja, uma cópia do Logger) e, em seguida, várias goroutines poderiam gravar no mesmo io.Writer simultaneamente. Isso pode ser um problema sério, dependendo da implementação do escritor.
- Cada goroutine ou função deve criar um logger?
Eu não criaria um logger separado para cada função ou goroutine. Goroutines (e funções) são usadas para tarefas muito leves que não justificam a manutenção de um logger separado. Provavelmente é uma boa ideia criar um registrador para cada componente maior de seu projeto. Por exemplo, se o seu projeto usa um serviço SMTP para enviar e-mails, criar um registrador separado para o serviço de e-mail parece uma boa ideia para que você possa filtrar e desligar a saída separadamente.
- Devo criar o logger como uma variável global?
Isso depende do seu pacote. No exemplo de serviço de e-mail anterior, provavelmente seria uma boa ideia ter um registrador para cada instância do seu serviço, de modo que os usuários possam registrar falhas ao usar o serviço de e-mail do gmail de forma diferente das falhas que ocorreram durante o uso do MTA local (por exemplo, sendmail )
io.Writer
interface e você alterar a saída do logger padrão viaSetOutput()
.Este é um registrador simples
Você pode usá-lo desta forma
fonte
Sei que essa questão é um pouco antiga, mas se, como eu, seus projetos são compostos de vários arquivos menores, eu voto na sua 4ª opção - criei um
logger.go
que faz parte do pacote principal. Este arquivo go cria o logger, atribui-o a um arquivo e o fornece ao resto do main. Observação: não criei uma maneira elegante de fechar o log de erros ...fonte
defer errorlog.Close()
no final da execução, ou para melhor garantir seu fechamento, configurar manipuladores de sinal usando o pacote de sinal de Go golang.org/pkg/os/signalEsta é uma pergunta antiga, mas gostaria de sugerir o uso de http://github.com/romana/rlog (que desenvolvemos). Ele é configurado através de variáveis de ambiente, o objeto logger é criado e inicializado quando o rlog é importado. Portanto, não há necessidade de passar um logger.
rlog tem alguns recursos:
É muito pequeno, não tem dependências externas, exceto a biblioteca Golang padrão e está sendo desenvolvido ativamente. Exemplos são fornecidos no repo.
fonte
Achei o pacote de log padrão ( https://golang.org/pkg/log/ ) um tanto limitante. Por exemplo, nenhum suporte para informações vs. logs de depuração.
Depois de algumas pesquisas, decida-se em usar https://github.com/golang/glog . Esta parece ser uma porta de https://github.com/google/glog e oferece uma flexibilidade decente no registro. Por exemplo, ao executar um aplicativo localmente, você pode desejar o nível de log DEBUG, mas pode querer executar apenas no nível INFO / ERROR na produção. A lista completa de recursos / guia está aqui https://google-glog.googlecode.com/svn/trunk/doc/glog.html (é para o módulo c ++, mas na maioria das vezes se traduz na porta golang)
fonte
Um dos módulos de registro que você pode considerar é o klog . Suporta registro 'V' que dá a flexibilidade de registrar em certo nível
klog é um fork do glog e supera as seguintes desvantagens
Implementação de amostra
fonte
Convido você a revisar meus blogs, onde explico o uso de LOG com GOlang: https://su9.co/9BAE74B
Exemplo: // Se declara la variable Log. Esta será usada para registrar los eventos. var (Log * log.Logger = Loggerx ())
fonte