Estou tentando gravar em um arquivo de log com Go.
Tentei várias abordagens, mas todas falharam. Isso é o que eu tentei:
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
}
O arquivo de log é criado, mas nada é impresso ou anexado a ele. Por quê?
Respostas:
os.Open()
deve ter funcionado de forma diferente no passado, mas isso funciona para mim:Com base nos documentos Go,
os.Open()
não pode funcionar paralog.SetOutput
, porque abre o arquivo "para leitura:"EDITAR
Movido
defer f.Close()
para apósif err != nil
verificaçãofonte
f
pode sernil
, o que resultaria em pânico. Portanto,err
é aconselhável verificar antes de adiar a chamada.Open
que não funciona comlog.SetOutput
?Eu prefiro a simplicidade e flexibilidade da recomendação do aplicativo de 12 fatores para registro. Para anexar a um arquivo de log, você pode usar o redirecionamento de shell. O logger padrão em Go grava em stderr (2).
Veja também: http://12factor.net/logs
fonte
$ 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'
eu, NÃO trabalhoUbuntu 18.04.3
Eu geralmente imprimo os logs na tela e escrevo em um arquivo também. Espero que isso ajude alguém.
fonte
Isso funciona para mim
criou um pacote chamado logger.go
importe o pacote para onde você deseja registrar, por exemplo, main.go
fonte
Se você executar o binário em uma máquina Linux, poderá usar um script de shell.
sobrescrever em um arquivo
anexar em um arquivo
sobrescrever stderr em um arquivo
anexar stderr em um arquivo
pode ser mais dinâmico usando o arquivo de script de shell.
fonte
O logger padrão em Go grava em stderr (2). redirecionar para arquivo
fonte
Declare no topo em seu global
var
para que todos os seus processos possam acessar, se necessário.fonte
go version go1.10.2 windows/amd64
, qual é a sua?outfile, _ = os.Create("my.log")
e ele funcionará conforme o esperado.outfile, _ = os.Create("./path/to/my.log")
. De alguma forma, esperava que o código fosse criar aspath/to
pastas e omy.log
arquivo, mas aparentemente não funcionou. Eu sugeriria que você modifique sua resposta para seroutfile, _ = os.Create("./my.log")
. Dessa forma, sabemos claramente que ele está criando um log na pasta atual.Com base na resposta de Allison e Deepak, comecei a usar logrus e gostei muito:
Eu tenho um adiar f.Close () na função principal
fonte
Estou gravando logs nos arquivos, que são gerados diariamente (por dia, um arquivo de log é gerado). Esta abordagem está funcionando bem para mim:
Método "shortenFilePath ()" usado para obter o nome do arquivo do caminho completo do arquivo. e o método "LogServer ()" é usado para criar uma declaração de registro formatada (contém: nome do arquivo, número da linha, nível de registro, declaração de erro etc ...)
fonte
Para ajudar os outros, eu crio uma função de log básica para lidar com o log em ambos os casos, se você quiser que a saída seja stdout, ative a depuração, é direto fazer um sinalizador de switch para que você possa escolher sua saída.
fonte
talvez isso te ajude (se o arquivo de log existe, use-o, se não existir, crie-o):
Para mais detalhes: https://su9.co/9BAE74B
fonte