J'essaye d'écrire dans un fichier journal avec Go.
J'ai essayé plusieurs approches, qui ont toutes échoué. Voici 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é. Pourquoi?
Réponses:
os.Open()
doit avoir fonctionné différemment dans le passé, mais cela fonctionne pour moi:Basé sur la documentation Go,
os.Open()
ne fonctionne pas pourlog.SetOutput
, car il ouvre le fichier "pour lecture:"ÉDITER
Déplacé
defer f.Close()
aprèsif err != nil
vérificationla source
f
pourrait êtrenil
, ce qui entraînerait une panique. Ilerr
est donc conseillé de vérifier avant de reporter l'appel.Open
ne fonctionnera pas aveclog.SetOutput
?Je préfère la simplicité et la flexibilité de la recommandation d'application à 12 facteurs pour la journalisation. Pour ajouter à un fichier journal, vous pouvez utiliser la redirection shell. L'enregistreur par défaut de Go écrit dans stderr (2).
Voir aussi: http://12factor.net/logs
la source
$ cd /etc/systemd/system
$ sudo vi app.service ExecStart=/bin/bash -c 'sudo go run main.go >> /home/ubuntu/go/src/html_menu_1/logfile'
Me NOT workUbuntu 18.04.3
J'imprime généralement les journaux à l'écran et j'écris également dans un fichier. J'espère que cela aide quelqu'un.
la source
Cela fonctionne pour moi
créé un package appelé logger.go
importez le package où vous voulez vous connecter, par exemple main.go
la source
Si vous exécutez binary sur une machine Linux, vous pouvez utiliser un script shell.
écraser dans un fichier
ajouter dans un fichier
écraser stderr dans un fichier
ajouter stderr dans un fichier
il peut être plus dynamique en utilisant le fichier de script shell.
la source
L'enregistreur par défaut de Go écrit dans stderr (2). rediriger vers le fichier
la source
Déclarez en haut dans votre global
var
afin que tous vos processus puissent y accéder si nécessaire.la source
go version go1.10.2 windows/amd64
, quelle est la vôtre?outfile, _ = os.Create("my.log")
et cela fonctionnera comme prévu.outfile, _ = os.Create("./path/to/my.log")
. D'une certaine manière, je m'attendais à ce que le code crée lespath/to
dossiers et lemy.log
fichier, mais apparemment cela n'a pas fonctionné. Je vous suggère de modifier votre réponse pour êtreoutfile, _ = os.Create("./my.log")
. De cette façon, nous savons clairement qu'il crée un journal dans le dossier actuel.En me basant sur la réponse d'Allison et Deepak, j'ai commencé à utiliser logrus et j'aime vraiment ça:
J'ai un différer f.Close () dans la fonction principale
la source
J'écris des journaux dans les fichiers, qui sont générés quotidiennement (par jour, un fichier journal est généré). Cette approche fonctionne bien pour moi:
"shortenFilePath ()" méthode utilisée pour obtenir le nom du fichier à partir du chemin complet du fichier. et la méthode "LogServer ()" est utilisée pour créer une instruction de journal formatée (contient: nom de fichier, numéro de ligne, niveau de journal, instruction d'erreur, etc.)
la source
Pour aider les autres, je crée une fonction de journal de base pour gérer la journalisation dans les deux cas, si vous voulez que la sortie soit stdout, puis activez le débogage, il est simple de faire un indicateur de commutation afin que vous puissiez choisir votre sortie.
la source
peut-être que cela vous aidera (si le fichier journal existe, utilisez-le, s'il n'existe pas, créez-le):
Pour plus de détails: https://su9.co/9BAE74B
la source