いろいろ備忘録日記

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

Goメモ-171 (logパッケージのprefixの出力位置をメッセージの前にしたい)

概要

よく忘れるのでここにメモメモ。。。

logパッケージで prefix を設定するとログ出力した際に付与して出力してくれるので便利なのですが

これ、LstdFlags とかを設定している場合、日付の前に出てしまいます。

たとえば

package main

import (
        "log"
        "os"
)

func main() {
        var (
                l = log.New(os.Stderr, "DEBUG\t", log.LstdFlags)
        )

        l.Println("helloworld")
}

って状態で動かしてみると

$ go run main.go
DEBUG   2022/01/07 16:12:35 helloworld

こんな感じで出ます。よく見るログの形式ってメッセージの前に DEBUG みたいな文字が来るんですよね。

んで、これをメッセージ部分の前に出力するようにしたい。

log.Lmsgprefix フラグを設定する

logパッケージのフラグには Lmsgprefix というフラグがあります。

このフラグを設定すると、prefixの出力位置をメッセージの前に変更してくれます。

package logging

import (
    "bytes"
    "log"

    "github.com/devlights/gomy/output"
)

// Msgprefix -- log.Lmsgprefix フラグのサンプルです.
//
// REFERENCES
//   - https://pkg.go.dev/log@go1.17.6#pkg-constants
//   - https://tutuz-tech.hatenablog.com/entry/2021/01/30/192956
//   - https://qiita.com/immrshc/items/a080975c6c7e23498944
func Msgprefix() error {
    var (
        buf1 = &bytes.Buffer{}
        buf2 = &bytes.Buffer{}
        log1 = log.New(buf1, "TRACE\t", log.LstdFlags)                // 行の先頭にprefixが出力される
        log2 = log.New(buf2, "DEBUG\t", log.LstdFlags|log.Lmsgprefix) // メッセージの手前にprefixが出力される
    )

    for _, l := range []*log.Logger{log1, log2} {
        l.Println("hello world")
    }

    output.Stdoutf("[-Lmsgprefix]", buf1.String())
    output.Stdoutf("[+Lmsgprefix]", buf2.String())

    return nil
}

実行すると以下のようになります。

gitpod /workspace/try-golang $ make run
go run github.com/devlights/try-golang/cmd/trygolang -onetime -example ""

ENTER EXAMPLE NAME: log_msgprefix

[Name] "log_msgprefix"
[-Lmsgprefix]        TRACE      2022/01/07 07:15:16 hello world
[+Lmsgprefix]        2022/01/07 07:15:16 DEBUG  hello world


[Elapsed] 73.556µs

参考情報


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

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

devlights.github.io

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

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

github.com

github.com

github.com