- Créer un seul journal. Logger et le faire circuler?
C'est possible. Un log.Logger peut être utilisé simultanément à partir de plusieurs goroutines.
- Faites passer un pointeur vers ce journal.
log.New renvoie un *Logger
qui indique généralement que vous devez passer l'objet en tant que pointeur. Le passer en tant que valeur créerait une copie de la structure (c'est-à-dire une copie du Logger) et plusieurs goroutines pourraient écrire simultanément dans le même io.Writer . Cela peut être un problème sérieux, selon l'implémentation de l'écrivain.
- Chaque goroutine ou fonction doit-il créer un enregistreur?
Je ne créerais pas un enregistreur séparé pour chaque fonction ou goroutine. Les goroutines (et fonctions) sont utilisées pour des tâches très légères qui ne justifieront pas la maintenance d'un enregistreur séparé. C'est probablement une bonne idée de créer un enregistreur pour chaque composant plus important de votre projet. Par exemple, si votre projet utilise un service SMTP pour envoyer des e-mails, la création d'un enregistreur distinct pour le service de messagerie semble être une bonne idée afin que vous puissiez filtrer et désactiver la sortie séparément.
- Dois-je créer l'enregistreur en tant que variable globale?
Cela dépend de votre colis. Dans l'exemple de service de messagerie précédent, ce serait probablement une bonne idée d'avoir un enregistreur pour chaque instance de votre service, afin que les utilisateurs puissent enregistrer les échecs lors de l'utilisation du service de messagerie gmail différemment des échecs survenus lors de l'utilisation du MTA local (par exemple, sendmail ).
io.Writer
interface et que vous modifiez la sortie de l'enregistreur par défaut viaSetOutput()
.Ceci est un simple enregistreur
Vous pouvez l'utiliser de cette manière
la source
Je sais que cette question est un peu ancienne, mais si, comme moi, vos projets sont constitués de plusieurs fichiers plus petits, je vote pour votre 4ème option - j'ai créé un
logger.go
qui fait partie du package main. Ce fichier go crée le logger, l'assigne à un fichier et le fournit au reste de main. Notez que je n'ai pas trouvé de moyen élégant de fermer le journal des erreurs ...la source
defer errorlog.Close()
à la fin de l'exécution, ou pour mieux assurer sa fermeture, configurer des gestionnaires de signaux en utilisant le paquetage de signaux de Go golang.org/pkg/os/signalC'est une question plus ancienne, mais je voudrais suggérer l'utilisation de http://github.com/romana/rlog (que nous avons développé). Il est configuré via des variables d'environnement, l'objet logger est créé et initialisé lorsque rlog est importé. Par conséquent, pas besoin de faire circuler un enregistreur.
rlog a pas mal de fonctionnalités:
Il est très petit, n'a pas de dépendances externes, à l'exception de la bibliothèque standard de Golang et est en cours de développement. Des exemples sont fournis dans le repo.
la source
J'ai trouvé le package de journaux par défaut ( https://golang.org/pkg/log/ ) quelque peu limitatif. Par exemple, aucune prise en charge des journaux d'informations par rapport aux journaux de débogage.
Après quelques fouilles, j'ai décidé d'utiliser https://github.com/golang/glog . Cela semble être un port de https://github.com/google/glog et donne une flexibilité décente dans la journalisation. Par exemple, lors de l'exécution d'une application localement, vous souhaiterez peut-être un journal de niveau DEBUG, mais vous souhaiterez peut-être l'exécuter uniquement au niveau INFO / ERROR en production. La liste complète des fonctionnalités / guide est, ici https://google-glog.googlecode.com/svn/trunk/doc/glog.html (C'est pour le module c ++, mais pour la plupart se traduit par le port golang)
la source
L'un des modules de journalisation que vous pouvez envisager est klog . Il prend en charge la journalisation en `` V '' qui donne la flexibilité de se connecter à un certain niveau
klog est un fork de glog et surmonte les inconvénients suivants
Exemple d'implémentation
la source