1. ホーム
  2. go

[解決済み] ログをファイルに書き出す方法

2022-08-23 07:51:15

質問

Goでログファイルに書き込もうとしています。

私はいくつかのアプローチを試しましたが、すべて失敗しました。これは私が試したものです。

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
}

ログファイルは作成されますが、何も出力されず、追加もされません。なぜでしょうか?

どうすれば解決できますか?

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のドキュメントを元にした os.Open() は動作しません。 log.SetOutput では動作しません。なぜなら、ファイルを "for reading:" で開いてしまうからです。

func Open

func Open(name string) (file *File, err error) Open は,指定された ファイルを読み込む。成功した場合、返されたファイルのメソッドは読み込みに使用できます。 関連するファイルディスクリプタは、モード O_RDONLY . もし エラーが発生した場合、そのエラーは *PathError .

EDIT

移動した defer f.Close() の後に if err != nil チェック