ホームページ バックエンド開発 Golang Golang と GoFr を使用したランタイム ログ レベルの変更

Golang と GoFr を使用したランタイム ログ レベルの変更

Jul 22, 2024 pm 08:56 PM

この記事では、アプリケーションを再起動せずにアプリケーションのログ レベルを変更する方法を紹介します。

導入

ログ レベルは通常、重要性の順に考慮されます。開発では「重要ではない」レベル (通知、デバッグなど) を有効にしますが、開発では「最も重要な」レベル (警告、エラーなど) のみを有効にします。 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()
}
ログイン後にコピー

ログ サービスを実行すると、次のログが表示されます:

LOGS FOR LOG-LEVEL CHANGE SERVICE STARTUP

すべての 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 サイトの他の関連記事を参照してください。

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

ホットな記事タグ

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Go Language Packのインポート:アンダースコアとアンダースコアなしの違いは何ですか? Go Language Packのインポート:アンダースコアとアンダースコアなしの違いは何ですか? Mar 03, 2025 pm 05:17 PM

Go Language Packのインポート:アンダースコアとアンダースコアなしの違いは何ですか?

GOでテスト用のモックオブジェクトとスタブを書くにはどうすればよいですか? GOでテスト用のモックオブジェクトとスタブを書くにはどうすればよいですか? Mar 10, 2025 pm 05:38 PM

GOでテスト用のモックオブジェクトとスタブを書くにはどうすればよいですか?

Beegoフレームワークのページ間で短期情報転送を実装する方法は? Beegoフレームワークのページ間で短期情報転送を実装する方法は? Mar 03, 2025 pm 05:22 PM

Beegoフレームワークのページ間で短期情報転送を実装する方法は?

トレースツールを使用して、GOアプリケーションの実行フローを理解するにはどうすればよいですか? トレースツールを使用して、GOアプリケーションの実行フローを理解するにはどうすればよいですか? Mar 10, 2025 pm 05:36 PM

トレースツールを使用して、GOアプリケーションの実行フローを理解するにはどうすればよいですか?

GOのジェネリックのカスタムタイプ制約を定義するにはどうすればよいですか? GOのジェネリックのカスタムタイプ制約を定義するにはどうすればよいですか? Mar 10, 2025 pm 03:20 PM

GOのジェネリックのカスタムタイプ制約を定義するにはどうすればよいですか?

Go言語でファイルを便利に書く方法は? Go言語でファイルを便利に書く方法は? Mar 03, 2025 pm 05:15 PM

Go言語でファイルを便利に書く方法は?

MySQLクエリ結果リストをGO言語のカスタム構造スライスに変換する方法は? MySQLクエリ結果リストをGO言語のカスタム構造スライスに変換する方法は? Mar 03, 2025 pm 05:18 PM

MySQLクエリ結果リストをGO言語のカスタム構造スライスに変換する方法は?

GOの実際のパフォーマンスを正確に反映するベンチマークを作成するにはどうすればよいですか? GOの実際のパフォーマンスを正確に反映するベンチマークを作成するにはどうすればよいですか? Mar 10, 2025 pm 05:36 PM

GOの実際のパフォーマンスを正確に反映するベンチマークを作成するにはどうすればよいですか?

See all articles