Go/Golang запись журнала в файл



Я пытаюсь записать в файл журнала С Golang.



Я пробовал несколько подходов, которые провалились. Это то, что я пробовал:



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
}


файл журнала создается, но ничего никогда не печатается и не добавляется к нему. Зачем?

1188   7  

7 ответов:

os.Open() должно быть, работал по-другому в прошлом, но это работает для меня:

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")

на основе Go docs,os.Open() не может работать для log.SetOutput, потому что он открывает файл "для чтения:"

func Open

func Open(name string) (file *File, err error)Open открывает им файл для чтения. В случае успеха методы для возвращаемого файла могут быть используется для чтения; соответствующий файловый дескриптор имеет режим O_RDONLY. Если есть ошибка, она будет типа *PathError.

EDIT

двигался defer f.Close() после if err != nil Регистрация

Я предпочитаю простоту и гибкость рекомендации приложения 12 factor для ведения журнала. Для добавления в файл журнала можно использовать перенаправление оболочки. Регистратор по умолчанию в Go записывает в stderr (2).

./app 2>> logfile

Смотрите также:http://12factor.net/logs

регистратор по умолчанию в Go записывает в stderr (2). перенаправление в файл

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 */

}

это работает для меня

  1. создал пакет под названием logger.иди

    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)
    }
    
    1. импорт пакета везде, где вы хотите войти, например, main.иди

      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()))
      
      }
      

объявить топ в вашем глобальном var Так что все ваши процессы могут получать доступ в случае необходимости.

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!!!")
}

Я обычно печатаю журналы на экране и пишу в файл. Надеюсь, это кому-то поможет.

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()
}

Comments

    Ничего не найдено.