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

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

PHPz
PHPzオリジナル
2024-07-22 20:56:53811ブラウズ

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

導入

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