Estoy intentando escribir en un archivo de registro con Go.
He intentado varios enfoques, todos los cuales han fallado. Esto es lo que he probado:
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
}
Se crea el archivo de registro, pero nunca se imprime ni se le agrega nada. ¿Por qué?
Respuestas:
os.Open()
debe haber funcionado de manera diferente en el pasado, pero esto funciona para mí:Según los documentos de Go,
os.Open()
no funcionalog.SetOutput
porque abre el archivo "para leer":EDITAR
Movido
defer f.Close()
a después delif err != nil
chequefuente
f
podría sernil
, lo que resultaría en pánico. Por lo tanto,err
es aconsejable verificar antes de aplazar la llamada.Open
no funcionalog.SetOutput
?Prefiero la simplicidad y flexibilidad de la recomendación de la aplicación de 12 factores para el registro. Para agregar a un archivo de registro, puede usar la redirección de shell. El registrador predeterminado en Go escribe en stderr (2).
Véase también: http://12factor.net/logs
fuente
$ 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'
yo no trabajaraUbuntu 18.04.3
Normalmente imprimo los registros en pantalla y también escribo en un archivo. Espero que esto ayude a alguien.
fuente
Esto funciona para mi
creó un paquete llamado logger.go
importe el paquete donde desee iniciar sesión, por ejemplo, main.go
fuente
Si ejecuta binario en una máquina Linux, puede usar un script de shell.
sobrescribir en un archivo
agregar en un archivo
sobrescribir stderr en un archivo
agregar stderr a un archivo
puede ser más dinámico usando un archivo de script de shell.
fuente
El registrador predeterminado en Go escribe en stderr (2). redirigir al archivo
fuente
Declare lo más alto en su global
var
para que todos sus procesos puedan acceder si es necesario.fuente
go version go1.10.2 windows/amd64
, ¿cuál es la tuya?outfile, _ = os.Create("my.log")
y funcionará como se esperaba.outfile, _ = os.Create("./path/to/my.log")
. De alguna manera tenía la expectativa de que el código crearía laspath/to
carpetas y elmy.log
archivo, pero aparentemente no funcionó. Le sugiero que modifique su respuesta para que seaoutfile, _ = os.Create("./my.log")
. De esa manera, sabemos claramente que está creando un registro en la carpeta actual.Sobre la base de la respuesta de Allison y Deepak, comencé a usar logrus y realmente me gustó:
Tengo un aplazamiento f.Close () en la función principal
fuente
Estoy escribiendo registros en los archivos, que se generan a diario (por día se genera un archivo de registro). Este enfoque funciona bien para mí:
Método "shortenFilePath ()" utilizado para obtener el nombre del archivo de la ruta completa del archivo. y el método "LogServer ()" se utiliza para crear una declaración de registro formateada (contiene: nombre de archivo, número de línea, nivel de registro, declaración de error, etc.)
fuente
Para ayudar a otros, creo una función de registro básica para manejar el registro en ambos casos, si desea que la salida sea estándar, luego active la depuración, es sencillo hacer un indicador de cambio para que pueda elegir su salida.
fuente
tal vez esto le ayude (si el archivo de registro existe, úselo, si no existe, créelo):
Para más detalles: https://su9.co/9BAE74B
fuente