この記事では、アプリケーションを再起動せずにアプリケーションのログ レベルを変更する方法を紹介します。
ログ レベルは通常、重要性の順に考慮されます。開発では「重要ではない」レベル (通知、デバッグなど) を有効にしますが、開発では「最も重要な」レベル (警告、エラーなど) のみを有効にします。 CPU 時間やディスク容量などのリソースが貴重な本番環境。
しかし、アプリケーションが ERROR レベルで実行されており、多くの問題に直面し始めた場合はどうでしょうか。しかし、ERROR レベルのログからはそれを把握できず、アプリケーションを再デプロイしてログ レベルを変更すると、多くの時間とリソースがかかります。
さらに、運用環境でアプリケーションを INFO または DEBUG レベルで実行すると、ログ システムを圧倒する大量のログが生成され、I/O 操作とリソース消費の増加につながる可能性があります。
これらの問題から私たちを救うために、GoFr - 究極の Golang フレームワークは、アプリケーションを再起動せずにログ レベルを変更する安全な方法を提供します。
ログ レベルを変更するには、GoFr アプリケーションで次の構成が必要です:
REMOTE_LOG_URL=<URL to user remote log level endpoint> (e.g., https://log-service.com/log-levels?id=1)
GoFr は、デフォルトで 15 秒ごとに提供されたエンドポイントを取得して最新のログ レベルを取得します。この間隔は、次の構成を追加することで増減できます。
REMOTE_LOG_FETCH_INTERVAL=<Interval in seconds> (default: 15)
GoFr では、2 つの必須フィールドを含む次の形式で URL からの応答が必要です:
{ "data": { "serviceName": "test-service", "logLevel": "DEBUG" } }
アプリケーションにログレベルを提供するログレベルサービスを作成しましょう。
GoFr を使用してサービスを作成します。詳細についてはドキュメントを参照してください。
データベースとして MySQL を使用します。MySQL を追加するには、configs ディレクトリの .env ファイルに次の構成を追加します。
DB_HOST=localhost DB_USER=root DB_PASSWORD=password DB_NAME=log-level DB_PORT=2001 DB_DIALECT=mysql
MySQL Docker コンテナを実行するには、次のコマンドを実行します
docker run --name gofr-logger -e MYSQL_ROOT_PASSWORD=password -e MYSQL_DATABASE=log-level -p 2001:3306 -d mysql:8.0.30
マイグレーションを含む main.go ファイルを追加してテーブルを作成し、AddRESTHandler 機能を使用してルートを登録しましょう。
main.go
package main import ( "gofr.dev/pkg/gofr" "gofr.dev/pkg/gofr/migration" ) const createTable = `CREATE TABLE level ( id INT PRIMARY KEY, service_name VARCHAR(255) NOT NULL, log_level VARCHAR(50) NOT NULL ); ` func createTableLevel() migration.Migrate { return migration.Migrate{ UP: func(d migration.Datasource) error { _, err := d.SQL.Exec(createTable) if err != nil { return err } return nil }, } } type Level struct { ID int `json:"id"` ServiceName string `json:"serviceName"` LogLevel string `json:"logLevel"` } func (u *Level) RestPath() string { return "level" } func main() { app := gofr.New() app.Migrate(map[int64]migration.Migrate{1: createTableLevel()}) err := app.AddRESTHandlers(&Level{}) if err != nil { app.Logger().Fatalf("Failed to register routes for level struct: %v", err) } app.Run() }
ログ サービスを実行すると、次のログが表示されます:
すべての REST ルートが登録されました。
サービスを作成するには、次のリクエストを送信します:
curl --location 'localhost:8000/level' \ --header 'Content-Type: application/json' \ --data '{ "id":1, "logLevel":"INFO", "serviceName":"gofr-app" }'
ログレベルを更新するには、次のリクエストを送信します:
curl --location --request PUT 'localhost:8000/level/1' \ --header 'Content-Type: application/json' \ --data '{ "id":1, "logLevel":"DEBUG", "serviceName":"gofr-app" }'
ログレベルを取得するには、次のリクエストを送信します:
curl --location 'localhost:8000/level/1'
同じ URL が、ログレベルをリモートで変更する必要があるアプリケーションの構成で使用されます。
GoFr のリモート ログ レベル変更機能を使用すると、次のようなメリットが得られます。
簡単な調整:
アプリケーションを再起動することなく、いつでもログ レベルを変更できます。これは、トラブルシューティングの際に特に役立ちます。
可視性の強化:
より詳細なログ レベル (例: DEBUG) に簡単に切り替えて、特定の問題についてより深い洞察を得ることができ、その後、通常の操作のためにあまり詳細ではないレベル (例: INFO) に戻すことができます。
パフォーマンスの向上:
大量のログを生成すると、ログ システムに負荷がかかり、I/O 操作とリソース消費が増加する可能性があります。警告レベルまたはエラー レベルに変更すると、ログの数が減り、パフォーマンスが向上し、クラウド コストが削減されます。
⭐スターを付けて GoFr をサポートします: https://github.com/gofr-dev/gofr
さらに、アプリケーションのトレースをエクスポートして表示するための無料のパブリック エンドポイント @tracer.gofr.dev にアクセスできます。
有効にするには、.env ファイルに次の設定を追加します
TRACE_EXPORTER=gofr
その他の特典:
開発または記事の執筆で GOFR に貢献した場合。 GitHub Readme (下部) にあるフォームに記入することで、無料の グッズ (T シャツ、ステッカー) を入手できます。
以上がGolang と GoFr を使用したランタイム ログ レベルの変更の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。