Aller/Golang écriture du journal de fichier
Je suis en train d'écrire dans un fichier journal avec Golang.
J'ai essayé plusieurs approches, qui ont toutes échoué. C'est ce que j'ai essayé:
func TestLogging(t *testing.T) {
if !FileExists("logfile") {
CreateFile("logfile")
}
f, err := os.Open("logfile")
if err != nil {
t.Fatalf("error: %v", err)
}
//attempt #1
log.SetOutput(io.MultiWriter(os.Stderr, f))
log.Println("hello, logfile")
//attempt #2
log.SetOutput(io.Writer(f))
log.Println("hello, logfile")
//attempt #3
log.SetOutput(f)
log.Println("hello, logfile")
}
func FileExists(name string) bool {
if _, err := os.Stat(name); err != nil {
if os.IsNotExist(err) {
return false
}
}
return true
}
func CreateFile(name string) error {
fo, err := os.Create(name)
if err != nil {
return err
}
defer func() {
fo.Close()
}()
return nil
}
Le fichier journal est créé, mais rien n'est jamais imprimé ou ajouté à la fin. Pourquoi?
- Si vous déployez votre programme sous Linux, vous pouvez simplement écrire votre journal à std sortie de rediriger la sortie vers un fichier comme ceci: ./programme 2>,&1 | tee logs.txt. Il doit y avoir une autre façon dans un autre système.
Vous devez vous connecter pour publier un commentaire.
os.Open()
doit avoir travaillé différemment dans le passé, mais cela fonctionne pour moi:Basé sur l'Aller docs,
os.Open()
ne peut pas travailler pourlog.SetOutput
, parce qu'il ouvre le fichier pour la lecture:"MODIFIER
Déplacé
defer f.Close()
aprèsif err != nil
vérifiernil
, qui pourraient résulter d'un mouvement de panique. Donc la vérification deerr
avant de reporter l'appel est conseillé.Open
ne fonctionne pas avec leslog.SetOutput
?Je préfère la simplicité et la flexibilité de l'12 facteur d'application de la recommandation pour la journalisation. Pour ajouter un fichier journal, vous pouvez utiliser le shell de redirection. La valeur par défaut de l'enregistreur de à Aller de l'écrit sur la sortie stderr (2).
Voir aussi: http://12factor.net/logs
Cela fonctionne pour moi
créé un package appelé enregistreur.aller
importer le package partout où vous voulez vous connecter.e.g principal.aller
J'ai l'habitude d'imprimer les journaux sur l'écran et d'écrire dans un fichier en tant que bien. Espérons que cela aide quelqu'un.
La valeur par défaut de l'enregistreur de à Aller de l'écrit sur la sortie stderr (2).
rediriger vers un fichier
De déclarer haut dans votre global
var
de sorte que tous vos processus peut accéder si nécessaire.go version go1.10.2 windows/amd64
, quelle est la vôtre?outfile, _ = os.Create("my.log")
et il fonctionnera comme prévu.outfile, _ = os.Create("./path/to/my.log")
. J'avais en quelque sorte l'espoir que le code va créer lepath/to
dossiers et lamy.log
fichier, mais apparemment ça ne fonctionne pas. Je voudrais vous suggérer de modifier votre réponse àoutfile, _ = os.Create("./my.log")
. De cette façon, nous savons clairement que c'est de créer un journal dans le dossier en cours.Si vous exécutez binaire sur la machine linux vous pouvez utiliser un script shell.
écraser dans un fichier
ajouter dans un fichier
remplacer stderr dans un fichier
ajouter stderr dans un fichier
il peut être plus dynamique, à l'aide d'un script shell fichiers.
Je suis en train d'écrire les logs pour les fichiers, qui sont de générer sur une base quotidienne (par jour un journal de fichier est généré). Cette approche fonctionne bien pour moi :
"shortenFilePath()" méthode utilisée pour obtenir le nom du fichier chemin d'accès complet du fichier. et "serveur de log()" sert à créer un journal formaté déclaration (contient : le nom de fichier, numéro de ligne, le niveau de journal, erreur de déclaration, etc...)