Go / Golang écrire le journal dans un fichier
J'essaie 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é. Pourquoi?
7 réponses
os.Open()
doit avoir travaillé différemment dans le passé, mais cela fonctionne pour moi:
f, err := os.OpenFile("testlogfile", os.O_RDWR | os.O_CREATE | os.O_APPEND, 0666)
if err != nil {
log.Fatalf("error opening file: %v", err)
}
defer f.Close()
log.SetOutput(f)
log.Println("This is a test log entry")
Basé sur les documents Go, os.Open()
ne peut pas fonctionner pour log.SetOutput
, car il ouvre le fichier "for reading:"
func Open
func Open(name string) (file *File, err error)
Open
ouvre le nommé fichier pour la lecture. En cas de succès, les méthodes sur le fichier retourné peuvent être utilisé pour la lecture; le descripteur de fichier associé a le modeO_RDONLY
. Si il y a une erreur, il sera de type*PathError
.
Modifier
Déplacé defer f.Close()
d'après if err != nil
vérifier
Je préfère la simplicité et la flexibilité de la recommandation de l'application 12 factor pour la journalisation. Pour ajouter à un fichier journal, vous pouvez utiliser la redirection shell. L'enregistreur par défaut dans Go écrit dans stderr (2).
./app 2>> logfile
Voir aussi: http://12factor.net/logs
L'enregistreur par défaut dans Go écrit dans stderr (2). rediriger vers le fichier
import (
"syscall"
"os"
)
func main(){
fErr, err = os.OpenFile("Errfile", os.O_APPEND|os.O_WRONLY|os.O_CREATE, 0600)
syscall.Dup2(int(fErr.Fd()), 1) /* -- stdout */
syscall.Dup2(int(fErr.Fd()), 2) /* -- stderr */
}
Cela fonctionne pour moi
-
A créé un paquet appelé logger.aller
package logger import ( "flag" "os" "log" "go/build" ) var ( Log *log.Logger ) func init() { // set location of log file var logpath = build.Default.GOPATH + "/src/chat/logger/info.log" flag.Parse() var file, err1 = os.Create(logpath) if err1 != nil { panic(err1) } Log = log.New(file, "", log.LstdFlags|log.Lshortfile) Log.Println("LogFile : " + logpath) }
-
Importez le paquet où vous voulez enregistrer, par exemple main.aller
package main import ( "logger" ) const ( VERSION = "0.13" ) func main() { // time to use our logger, print version, processID and number of running process logger.Log.Printf("Server v%s pid=%d started with processes: %d", VERSION, os.Getpid(),runtime.GOMAXPROCS(runtime.NumCPU())) }
-
Déclarez en haut dans votre var
global afin que tous vos processus puissent accéder si nécessaire.
package main
import (
"log"
"os"
)
var (
outfile, _ = os.Create("path/to/my.log") // update path for your needs
l = log.New(outfile, "", 0)
)
func main() {
l.Println("hello, log!!!")
}
J'imprime généralement les journaux à l'écran et j'écris également dans un fichier. Espérons que cela aide quelqu'un.
f, err := os.OpenFile("/tmp/orders.log", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
if err != nil {
log.Fatalf("error opening file: %v", err)
}
defer f.Close()
wrt := io.MultiWriter(os.Stdout, f)
log.SetOutput(wrt)
log.Println(" Orders API Called")
import (
"os/exec"
)
func main() {
// check error here...
exec.Command("/bin/sh", "-c", "echo "+err.Error()+" >> log.log").Run()
}