2016-06-25 2 views
-1

os.OpenFile関数を使用してosパッケージでログファイルを開こうとしています。しかし、それは無限のエラーを返します:そのようなファイルやディレクトリはありません。私はlinuxを使っていて、1.6へ行く。ログファイルのオープンはinit関数で行われます。 Heres私のコード:os.OpenFileでO_CREATEフラグを指定すると、このようなファイルやディレクトリはスローされません。

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

エラーは、ファイルを作成するパスが存在しない可能性が高いです。ログファイルは作成されますが、親ディレクトリが存在しない場合は作成されません。 必要なディレクトリ構造を作成するには、問題は、それがこのようにする必要が輸出されていなかったので、JSONのserverConfigurationは何の価値がなかったということでしたos.MkdirAll

+0

ファイルパスがlogfile.txtというあります –

+1

あなたのコードを実行しました。私が見ることができる問題は、あなたのconfig構造体にはエクスポートされていないフィールドしかない(小文字で始まる)ため、jsonパッケージはそれらを見ることができません。 –

+0

ええ、すでに修復していることがわかったので、今すぐ動作しています。とにかく助けてくれてありがとう。 –

0

を使用することができます。

// 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"` 
} 
関連する問題