私は新しいgoサービスで作業しています。SetupLogger
ユーティリティ機能があり、go-kitのログ構造体log.Logger
の新しいインスタンスが作成されています。Goロギング構造体のインスタンシエーションユーティリティメソッドの不正なスレッドの安全性
別のジャンプルーチン内の要求を処理するコードからこのメソッドを呼び出すのは安全ですか?
package utils
import (
"fmt"
"github.com/go-kit/kit/log"
"io"
"os"
"path/filepath"
)
// If the environment-specified directory for writing log files exists, open the existing log file
// if it already exists or create a log file if no log file exists.
// If the environment-specified directory for writing log files does not exist, configure the logger
// to log to process stdout.
// Returns an instance of go-kit logger
func SetupLogger() log.Logger {
var logWriter io.Writer
var err error
LOG_FILE_DIR := os.Getenv("CRAFT_API_LOG_FILE_DIR")
LOG_FILE_NAME := os.Getenv("CRAFT_API_LOG_FILE_NAME")
fullLogFilePath := filepath.Join(
LOG_FILE_DIR,
LOG_FILE_NAME,
)
if dirExists, _ := Exists(&ExistsOsCheckerStruct{}, LOG_FILE_DIR); dirExists {
if logFileExists, _ := Exists(&ExistsOsCheckerStruct{}, fullLogFilePath); !logFileExists {
os.Create(fullLogFilePath)
}
logWriter, err = os.OpenFile(fullLogFilePath, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
if err != nil {
fmt.Println("Could not open log file. ", err)
}
} else {
logWriter = os.Stdout
}
return log.NewContext(log.NewJSONLogger(logWriter)).With(
"timestamp", log.DefaultTimestampUTC,
"caller", log.DefaultCaller,
)
}
ファイルシステムにアクセスしているので、それだけで 'mutex.Lock()'で保護します。 go-kitに関しては、新しいロガーを作成するのがスレッドセーフであれば、スタックチャネル(彼らが非常に活発である)に関する直接の質問に答えるでしょう。 – eduncan911