我试图使用os.OpenFile函数打开os包的日志文件,如果这样的文件不存在,应该使用正确的标志创建文件。但它返回非零错误:没有这样的文件或目录。顺便说一下,我使用的是linux并且去了1.6。日志文件打开发生在init函数中。继承我的代码:
package main
import (
"encoding/json"
"fmt"
"log"
"net/http"
"os"
"github.com/gorilla/mux"
"github.com/gorilla/sessions"
)
// Structs holds server configuration data from config json.
type serverConfiguration struct {
port string
logFileName string
sessionStorePhrase string
resourceFilesPath string
resourceFilesPathPrefix string
}
// Server global variables.
var (
serverConfig serverConfiguration
logFile *os.File
router *mux.Router
sessionStore *sessions.CookieStore
)
func init() {
// temporary variables.
var (
configFile *os.File
serverConfErr, configDecodingErr, logFileErr error
)
// Loads json config file.
configFile, serverConfErr = os.Open("server-conf.json")
defer configFile.Close()
if serverConfErr != nil {
log.Fatal("SERVER-CONFIG-ERROR: ", serverConfErr)
}
// Decodes json to serverConfig struct.
decoder := json.NewDecoder(configFile)
serverConfig = serverConfiguration{}
configDecodingErr = decoder.Decode(&serverConfig)
if configDecodingErr != nil {
log.Fatal("CONFIGURATION-DECODING-ERROR: ", configDecodingErr)
}
// Opens log file in app root directory.
logFile, logFileErr = os.OpenFile(serverConfig.logFileName, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0666)
if logFileErr != nil {
log.Fatal("LOG-FILE-ERROR: ", logFileErr)
}
// Creates session store.
sessionStore = sessions.NewCookieStore([]byte(serverConfig.sessionStorePhrase))
}
// Home page handler.
func homePageHandler(writer http.ResponseWriter, request *http.Request) {
fmt.Fprint(writer, "asdasdasdasd")
}
func main() {
defer logFile.Close()
router = mux.NewRouter().StrictSlash(false)
resourceFileServer := http.FileServer(http.Dir(serverConfig.resourceFilesPath))
router.PathPrefix(serverConfig.resourceFilesPathPrefix).Handler(http.StripPrefix(serverConfig.resourceFilesPathPrefix, resourceFileServer))
router.HandleFunc("/", homePageHandler)
server := &http.Server{
Addr: serverConfig.port,
Handler: router,
}
log.Println("Server listening on port ", serverConfig.port)
server.ListenAndServe()
}
答案 0 :(得分:0)
错误很可能是您要创建文件的路径不存在。如果它们不存在,它将创建日志文件,但不创建父目录。
要创建必要的目录结构,可以使用os.MkdirAll
答案 1 :(得分:0)
问题是json serverConfiguration没有值,因为它没有导出它需要像这样:
// ServerConfiguration structs holds server configuration data from config json.
type ServerConfiguration struct {
Port string `json:"port"`
LogFileName string `json:"logFileName"`
SessionStorePhrase string `json:"sessionStorePhrase"`
ResourceFilesPath string `json:"resourceFilesPath"`
ResourceFilesPathPrefix string `json:"resourceFilesPathPrefix"`
}