いろいろ備忘録日記

主に .NET とか Go とか Python絡みのメモを公開しています。

Goメモ-41 (logパッケージのフラグ設定についてのメモ, log.Flags, log.SetFlags)

概要

よく忘れるので、忘れないうちにメモメモ。

Goには、ログライブラリとしてlogパッケージが標準装備されています。

他の言語やっていた人間からすると、結構シンプルな形になっているなという印象。個人的には好きですが。

で、ちょっとクセがあって、出力する項目の設定とかをフラグで管理しています。

log.Flags()で現在のフラグ値を取得できます。

log.SetFlags()で新しいフラグ値を設定できます。

設定するフラグの定数は $GOROOT/src/log/log.go にて以下のように定義されています。(go1.13.5の場合)

const (
    Ldate         = 1 << iota     // the date in the local time zone: 2009/01/23
    Ltime                         // the time in the local time zone: 01:23:23
    Lmicroseconds                 // microsecond resolution: 01:23:23.123123.  assumes Ltime.
    Llongfile                     // full file name and line number: /a/b/c/d.go:23
    Lshortfile                    // final file name element and line number: d.go:23. overrides Llongfile
    LUTC                          // if Ldate or Ltime is set, use UTC rather than the local time zone
    LstdFlags     = Ldate | Ltime // initial values for the standard logger
)

デフォルト値は、log.LstdFlagsが設定されていますので、何も設定しないまま

log.Println("デフォルト状態でログ出力")

とかすると

2020/01/09 18:30:47 デフォルト状態でログ出力

みたいに出力されます。

んで、たまに日付とか時刻とか無しでそのままメッセージ出力したいときとかあるんですよね。

そういうときは、フラグの設定をしてやって、出ないようにできます。

// log.LstdFlags を 除去
log.SetFlags(log.Flags() &^ log.LstdFlags)

これで、除去できます。

また、とりあえず全設定を落としたい場合は以下でも良いです。

log.SetFlags(0)

サンプル

package log_

import "log"

// Flags は、log.Flag()とlog.SetFlags()の挙動を確認するサンプルです.
func Flags() error {
    // ----------------------------------------------------------------
    // log.Flags()とlog.SetFlags()について
    //
    // log.Flags() は、現在設定されているログの設定フラグを取得することが出来る.
    // log.SetFlags()は、新たにログの設定フラグを設定することが出来る.
    //
    // デフォルトでは、log.LstdFlags が設定されている.
    // なのでそのまま、log.Println() とかを呼ぶと
    //   日付 時刻 メッセージ
    // という出力になる.
    //
    // この状態から、日付と時刻の出力を消したい場合は、log.LstdFlags を除去すれば良い.
    // フラグ定数は、$GOROOT/src/log/log.go の中に記載されている.
    //
    // REFERENCES::
    //   https://golang.org/pkg/log/#pkg-constants
    //   https://golang.org/pkg/log/#Flags
    //   https://golang.org/pkg/log/#SetFlags
    //   https://stackoverflow.com/questions/48629988/remove-timestamp-prefix-from-go-logger
    // ----------------------------------------------------------------
    // デフォルトの状態でログ出力
    log.Println("デフォルト状態でログ出力")

    // 現在 log.LstdFlags が設定されているかを確認
    log.Printf("log.LstdFlags [%t]", log.Flags()&log.LstdFlags == log.LstdFlags)

    // log.LstdFlags を 除去
    log.SetFlags(log.Flags() &^ log.LstdFlags)

    // 日付と時刻が出力されないかを確認
    log.Println("日付と時刻が消える")

    // 新たな フラグ として、ファイル名を表示するように設定
    log.SetFlags(log.Flags() | log.Lshortfile)

    // ファイル名が出力されるかを確認
    log.Println("ファイル名が付与される")
    log.Printf("log.Lshortfile [%v]", log.Flags()&log.Lshortfile == log.Lshortfile)

    // 一気に全設定フラグを落とす場合は以下のようにする
    log.SetFlags(0)

    // ただの文字列だけが出力されることを確認
    log.Println("全設定フラグをオフ")

    // 元に戻す
    log.SetFlags(log.Flags() | log.LstdFlags)

    // 元の状態に戻ったことを確認
    log.Println("元の状態に戻る")

    return nil
}

try-golang/log_flags.go at master · devlights/try-golang · GitHub

実行すると以下な感じ。

[Name] "log_flags"
2020/01/09 18:30:47 デフォルト状態でログ出力
2020/01/09 18:30:47 log.LstdFlags [true]
日付と時刻が消える
log_flags.go:43: ファイル名が付与される
log_flags.go:44: log.Lshortfile [true]
全設定フラグをオフ
2020/01/09 18:30:47 元の状態に戻る

参考情報

golang.org

stackoverflow.com


過去の記事については、以下のページからご参照下さい。

  • いろいろ備忘録日記まとめ

devlights.github.io

サンプルコードは、以下の場所で公開しています。

  • いろいろ備忘録日記サンプルソース置き場

github.com

github.com

github.com