プロダクションでgo言語を使用している人は誰でもログファイルのローリングに問題がありますか?GOでログファイルを転記する最も良い方法
ログファイルスレッドを安全にロールする可能性はありますか?
これを行うためのフレームワークはありますか?
ありがとうございます。
プロダクションでgo言語を使用している人は誰でもログファイルのローリングに問題がありますか?GOでログファイルを転記する最も良い方法
ログファイルスレッドを安全にロールする可能性はありますか?
これを行うためのフレームワークはありますか?
ありがとうございます。
を述べているように、あなたのためのログを回転させます。他のゴルーチンからのログを受け取るチャンネルで、ロギングとログのローテーションを担当する単一のゴルーチンがあると考えることができます。回転するときはいつでも、ゴルーチンはログを回転し、他のゴルーチンからの着信ログはチャンネルにエンキューされます。ログのローテーションが完了すると、チャネル上のすべてのものをデキューしてロギングを続行します。
type Log struct {
log string
// other info you might want
}
// This will be your goroutine
func Logging(LogChannel chan Log) {
// assume logger creates/opens a file and prepares it for writing
logger := New(logger)
for {
// collect a log. Will also block until a log is available on the channel
log <- LogChannel
if timeToRotate() {
RotateLogFile(logger)
}
// write log
logger.Log(log)
}
}
EDIT:の線に沿って
何か以前のコードでは、ログファイルが回転した場合にチェックした後、ブロッキング呼び出しを持っていました。 timeToRotate
関数呼び出しの前に置いて、ログファイルが回転した後にログを書き込む可能性を避けることをお勧めします。
それは完璧なソリューションのように見えます! –
通常はログファイルを直接使用していません。スクライブやカフカなどのネットワークロガーに書き込むか、または、stdout/stderrに書き込んで、サービスランナーにログファイルへの書き込み、ネットワークロガーへの転送、またはファイルのローテーションを処理させることができます。
あなたはそれに対してどのようなサービスランナーをお勧めしますか? – AJPennster
runitはそのIIRCを行うことができます –
絶対に同意してください。 15個以上のプロジェクトが稼動していて、それぞれ数十(または100)個のインスタンスがある場合、すべての出力をログ出力のためにstdout/stderrに出力します。これにより、devopsチーム(または自分自身)が必要に応じてロギングをオフロードできます。たとえば、AWSのCloudWatchログサービスにストリームを送信して、アラートのフィルタリングやグループ化、設定ができます。 – eduncan911
私はhttps://github.com/natefinch/lumberjackでうまくいっていて、golangの標準でメモリ効率的な "ログ"pkg。
使用することは非常に簡単で、単にそれを設定し、通常どおりログインに使用するコードの1行を追加します。私は本当のユーザーエクスペリエンスの面白いよ
log.SetOutput(&lumberjack.Logger{
Filename: "/var/log/myapp/foo.log",
MaxSize: 500, // megabytes
MaxBackups: 3,
MaxAge: 28, //days
})
私はこれをプロジェクトの小さなものにも使用しました。しかし、大規模な展開では、ディスクへのロギングを避け、stdout/stderrに行き、インフラストラクチャで大量のログを処理させます。 – eduncan911
@evanmcdonnal。私は人々が何千ものログファイルで同じ問題に直面したと思います。正確な実装をお勧めしますか? –