- 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 )