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
}
файл журнала создается, но ничего никогда не печатается и не добавляется к нему. Зачем?
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 */ }
это работает для меня
создал пакет под названием 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) }
импорт пакета везде, где вы хотите войти, например, 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