gBenkyous / inTime

3 stars 0 forks source link

ログの起動処理について #67

Closed honmaharuki closed 11 months ago

honmaharuki commented 11 months ago
          Trace, Debug, Info, Warn, Error, Fatal, Panic それぞれについて最終行以外同じ処理のようですので、同じ処理を記述している部分はロガーを取得するメソッドとして切り出してください。

また本メソッド群を利用した場合は毎回ファイルを開く処理が入るかと思いますので下記点について議論いただきますようお願いいたします。

_Originally posted by @doranko in https://github.com/gBenkyous/inTime/pull/59#discussion_r1257218828_

honmaharuki commented 11 months ago

開閉操作自体は問題なさそう。 bufioとか使ってバッファリングしたりすれば。。。

honmaharuki commented 11 months ago

https://github.com/rs/zerolog#thread-safe-lock-free-non-blocking-writer

honmaharuki commented 11 months ago

https://github.com/rs/zerolog#set-as-standard-logger-output 標準出力のロガーとして設定可能

honmaharuki commented 11 months ago

共有ログインスタンス

package main

import ( "os" "github.com/rs/zerolog" "github.com/rs/zerolog/log" )

// パッケージレベルの変数としてログインスタンスを定義 var logger zerolog.Logger

func init() { // ログファイルを開く f, err := os.OpenFile("log.txt", os.O_RDWR | os.O_CREATE | os.O_APPEND, 0666) if err != nil { log.Fatal().Err(err).Msg("Failed to open log file") } // ログインスタンスを初期化 logger = zerolog.New(f).With().Timestamp().Logger() }

func main() { // アプリケーション全体でログインスタンスを使用 logger.Info().Msg("This is an info message") logger.Error().Msg("This is an error message") }

honmaharuki commented 11 months ago

こちらも

package main

import ( "bufio" "os" "os/signal" "syscall" "time" "github.com/natefinch/lumberjack" "github.com/rs/zerolog" "github.com/rs/zerolog/log" )

// パッケージレベルの変数としてログインスタンスとバッファリングされたWriterを定義 var logger zerolog.Logger var bw *bufio.Writer

func init() { // lumberjack.Loggerを作成 lj := &lumberjack.Logger{ Filename: "log.txt", MaxSize: 500, // megabytes MaxBackups: 3, MaxAge: 28, //days Compress: true, // disabled by default }

// バッファリングされたWriterを作成
bw = bufio.NewWriter(lj)

// ログインスタンスを初期化
logger = zerolog.New(bw).With().Timestamp().Logger()

// タイマーを設定して定期的にフラッシュを行うゴルーチンを起動
go func() {
    ticker := time.NewTicker(1 * time.Second)
    defer ticker.Stop()
    for {
        select {
        case <-ticker.C:
            bw.Flush()
        }
    }
}()

}

func main() { // シグナルハンドラを設定 c := make(chan os.Signal, 1) signal.Notify(c, os.Interrupt, syscall.SIGTERM) go func() { <-c bw.Flush() os.Exit(1) }()

// アプリケーション全体でログインスタンスを使用
logger.Info().Msg("This is an info message")
logger.Error().Msg("This is an error message")

}

doranko commented 11 months ago

go func() { <-c bw.Flush() os.Exit(1) }()

この部分について、ちょいちょい「go言語にはアロー演算子は無い」という表記を見るのですが「<-c」部分はどのような意味を持つでしょうか...?

honmaharuki commented 11 months ago

そいつはチャネル演算というもので、チャネルへの送受信を行うものらしいです! https://www.dragonarrow.work/articles/238

watabusi commented 11 months ago

・ファイル開閉操作がアプリ動作に影響を与えない範囲に収まるか?:bufio

・アプリ全体で一つのロガーオブジェクトを共有するような方法はないか?  上記コメントのコード ・日付単位のログローテーション (ファイルサイズのローテーションは一応残す) 下記ソースを基にして作成 chatGPT案 https://discordapp.com/channels/880986184380215296/1002743283937722519/1134665070320832613

東さん改良案 https://discordapp.com/channels/880986184380215296/1002743283937722519/1134665617807515728