ホームページ  >  記事  >  バックエンド開発  >  golang ログローテーション

golang ログローテーション

王林
王林オリジナル
2023-05-06 12:05:07902ブラウズ

Golang ログ ローテーション

アプリケーションの継続的な開発に伴い、ログ ファイルがますます大きくなるのは避けられない問題です。長時間実行されるアプリケーションの場合、ログ ファイルが数ギガバイトに達する可能性があり、これによりディスク領域の問題が発生し、ログ ファイルを開いたり読み取ったりする速度が遅くなる可能性があります。したがって、優れたアプリケーションには、ログ ファイルの合理的な管理とローテーションが非常に必要です。

Golang では、ログ パッケージ、zap、logrus などの強力なログ ライブラリがいくつか提供されています。これらのログ ライブラリの共通点は、ログ ファイルを生成することですが、ログ ファイルが大きくなりすぎる場合は、ログ ファイルのローテーションを考慮する必要があります。

Golang ログ モジュールのログ レベル

Golang ログ モジュールは、最も低いレベルの Debug から始めて、Debug、Info、Warning、Error、Fatal、Panic などのさまざまなログ レベルを定義します。それらの定義は次のとおりです。

const (
    Ldate         = 1 << iota     // 日期
    Ltime                         // 时间
    Lmicroseconds                 // 微秒时间戳
    Llongfile                     // 完整文件路径名和行号:XXXX/XXXX/line
    Lshortfile                    // 文件名和行号:line
    LUTC                          // 如果设置了 Ldate 或 Ltime,则使用 UTC 时间,否则使用本地时间
    LstdFlags     = Ldate | Ltime // 指定标准日志记录器应具有的默认标志
)
const (
    TraceLevel int = iota
    DebugLevel
    InfoLevel
    WarnLevel
    ErrorLevel
    PanicLevel
    FatalLevel
    NoLevel
)

ログには、現在のログ レベルよりも高いレベルのログのみを記録する必要があります。これは、より高いレベルのログの方が緊急性が高いためです。ログ レベルは、エラーの診断に役立つだけでなく、ログに記録される内容を制御することもできます。たとえば、デバッグ レベルのロガーにはより多くの情報を記録し、リリース ビルドではエラーまたは警告に関する情報のみを記録できます。

ログ ファイルのローテーション

Golang では、ログのローテーションはプログラマによって制御されます。ログ ローテーションを実装するための一般的な手法は、レプリケーションと圧縮です。ログ ファイルが特定のサイズまたは間隔に達したら、名前を変更して新しいログ ファイルを作成する必要があります。

ログ ローテーションを実現するには、次の 2 つの方法を選択できます:

1. 時間によるローテーション: この方法は時間を軸にし、毎日 1 つのファイルを保存し、記録のみを保存します。デイリーログファイル 今日のログ。翌日プログラムが開始されると、新しいログ ファイルが作成され、古いログ ファイルは圧縮または削除されます。欠点は、その日のうちにファイル サイズ制限を超えないという保証がないことです。

2. ファイル サイズによる回転: この方法では、ファイル サイズを軸として使用し、ログ ファイルが特定のサイズ制限に達すると、名前が変更され、新しいログ ファイルが作成されます。欠点は、ログ ファイルを時間に基づいて区別できないことです。

以下では、Golang コードを使用してファイル サイズに基づいてログ ローテーションを実装する方法を段階的に紹介します。

ログ ローテーションに Lumberjack ライブラリを使用する

Lumberjack は、ファイル サイズに応じてログ ファイルをローテーションするために使用される信頼性の高いログ ライブラリです。複数のログ ファイルの並列書き込みをサポートし、Go の機能を利用して競合状態を回避します。 Lumberjack は古いログ ファイルを自動的に圧縮して、ディスク領域を節約することもできます。

最初に簡単な例を見てみましょう:

package main

import (
    "github.com/natefinch/lumberjack"
    "log"
)

func main() {
    logger := &lumberjack.Logger{
        Filename:   "./log/test.log",
        MaxSize:    5, // megabytes
        MaxBackups: 3,
        MaxAge:     28, // days
    }

    log.SetOutput(logger)

    // 测试日志轮转
    for i := 0; i < 12000; i++ {
        log.Println(i)
    }
}

上記のコードでは、ログ ローテーションに Lumberjack ログ ライブラリを使用します。ログ ファイル ./log/test.log を出力ファイルとして設定し、ファイル サイズ制限を 5 MB、バックアップの最大数を 3、最大保存日数を 28 日に設定します。ログ ファイルのサイズが 5 MB を超えると、Lumberjack はデータを新しいファイルに書き込み、古いファイルを .1、.2、または .3 バックアップとして保存します。バックアップ数が 3 つを超えると、古いバックアップ ファイルが削除されます。古いログが 28 日を超えると、自動的に削除されます。

12,000 サイクル後、./log ディレクトリに生成されたログ ファイルが表示されます。 Lumberjack がログ ファイルを自動的にさまざまな部分に分割し、指定された時間内に一部の古いログ ファイルを自動的に削除したことがわかります。

一般的なログ ローテーション

時間によるログのローテーションの一般的な構成は次のとおりです:

logger := &lumberjack.Logger{
    Filename:   logPath,
    MaxSize:    0,
    MaxBackups: 0,
    MaxAge:     7,  // 保留最近 7 天的日志
    LocalTime:  true,
    Compress:   true, // 压缩日志文件
}

ファイル サイズによるログのローテーションの一般的な構成は次のとおりです:

logger := &lumberjack.Logger{
    Filename:   logPath,
    MaxSize:    100, // megabytes
    MaxBackups: 5,
    MaxAge:     30, // 保留最近 30 天的日志
    LocalTime:  true,
    Compress:   true, // 压缩日志文件
}

概要

Golang では、Lumberjack ログ ライブラリを使用して自動ログ ローテーションを実装し、大きすぎるログ ファイルの問題を解決できます。柔軟な構成により、必要に応じてログ ローテーションの時間やファイル サイズを選択し、古いログ ファイルを自動的に削除できます。これは、最小ストレージ要件を満たすログ ファイルの問題を解決するだけでなく、アプリケーションがスムーズに実行され、大きなログ ファイルの影響を受けないようにすることにも役立ちます。

以上がgolang ログローテーションの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。