2016-11-22 3 views
3

У меня есть приложение Golang, которое использует библиотеку go-logging (https://github.com/op/go-logging). Файл журнала генерируется правильно, но когда я останавливаю и перезапускаю приложение Go, этот файл журнала перезаписывается новым файлом журнала. Это не ошибка, Golang делает то, что она просила сделать. Но, если возможно, мне бы хотелось, чтобы новые журналы были добавлены в существующий файл журнала.Реализация файла журнала в Golang

Во-первых, отрывок из моего main.go:

package main 

import (

"utils" 
"webapp" 
"odbc" 
"constants" 
"github.com/op/go-logging" 
) 

var config = &Configuration{} 

var log = logging.MustGetLogger("main") 

func main() { 

    // Load the configuration file 
    utils.Load(constants.CONFIG_PATH, config) 

    utils.InitLog(config.LOG) 

    ... 
    } 

Мои appUtils.go где определены utilitary функции:

package utils 

import (
"github.com/op/go-logging" 
"os" 
"fmt" 
) 

func InitLog(config LOG) { 

f, err := os.Create(config.LogFile) 

backend := logging.NewLogBackend(f, "", 0) 

format := logging.MustStringFormatter(config.FORMAT,) 

backendFormatter := logging.NewBackendFormatter(backend, format) 

// Only errors and more severe messages should be sent to backend1 logging.Level 
logging.SetBackend(backendFormatter) 


    level, err := logging.LogLevel(config.LEVEL) 
    if err != nil { 
    logging.SetLevel(logging.ERROR, "") 
    } else{ 
    logging.SetLevel(level, "") 
    } 
} 

type LOG struct { 
    FORMAT string 
    LEVEL string 
    LogFile string 
} 

В случае необходимости я также поставил содержание моей конфигурации. json:

{ 
    "LOG":{ 
     "LEVEL": "DEBUG", 
     "FORMAT": "%{color}%{time:15:04:05.000} %{shortfunc} => %{level:.4s} %{id:03x}%{color:reset} %{message}", 
     "LogFile": "logfile.log" 
     } 
} 

Является ли это возможным? я понял, что проблема исходит от этой линии:

f, err := os.Create(config.LogFile) 

Новый файл создается после (пере) запуска приложения. Чтобы избежать этого, я попытался это:

var f *os.File 
    if _, err := os.Stat(config.LogFile); os.IsNotExist(err) { 
     f, err := os.Create(config.LogFile) 
    } 
    else { 
    f, err := os.OpenFile(config.LogFile, os.O_APPEND|os.O_WRONLY, 0600)  
    } 

но это довольно Bullsh * т, он не работает.

Если это невозможно, должен ли я изменить свой config.json, чтобы генерировать файлы, которые имеют от имени дату с миллисекундами, например?

+2

Я очень рекомендую вам воспользоваться моментом и реорганизовать свои пакеты и читать [эффективный GO] (https: // golang. орг/DOC/effective_go.html). – OneOfOne

ответ

2

Ваша версия не работает, потому что вы затеняете переменную f в блоках if. Если вы сначала объявили err и используете простое назначение, это, по-видимому, будет работать в большинстве случаев.

Однако, stat'ing файла, который пытается создать или открыть его, по своей природе является ярким. Просто откройте его с помощью правильных флагов в одной попытке. Если вы хотите «писать только», «добавить», и «создать», затем:

os.OpenFile(name, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0600) 
Смежные вопросы