「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > Golang と GoFr を使用したランタイム ログ レベルの変更

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

2024 年 7 月 30 日に公開
ブラウズ:661

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

導入

ログ レベルは通常、重要性の順に考慮されます。開発では「重要ではない」レベル (通知、デバッグなど) を有効にしますが、開発では「最も重要な」レベル (警告、エラーなど) のみを有効にします。 CPU 時間やディスク容量などのリソースが貴重な実稼働環境。

しかし、アプリケーションがエラー レベルで実行されており、多くの問題に直面し始めた場合はどうでしょうか。しかし、エラー レベルのログからはそれを把握できません。アプリケーションを再デプロイしてログ レベルを変更すると、多くの時間とリソースがかかります。

さらに、本番環境でアプリケーションを INFO レベルまたは DEBUG レベルで実行すると、ログ システムを圧倒する大量のログが生成され、I/O 操作とリソース消費の増加につながる可能性があります。

これらの問題から私たちを救うために、GoFr - 究極の Golang フレームワークは、アプリケーションを再起動せずにログ レベルを変更する安全な方法を提供します。

ログレベルの変更

ログ レベルを変更するには、GoFr アプリケーションで次の構成が必要です:

REMOTE_LOG_URL= (e.g., https://log-service.com/log-levels?id=1)

GoFr は、デフォルトで 15 秒ごとに提供されたエンドポイントを取得して最新のログ レベルを取得します。この間隔は、次の構成を追加することで増減できます。

REMOTE_LOG_FETCH_INTERVAL= (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 シャツ、ステッカー) を入手できます。

リリースステートメント この記事は次の場所に転載されています: https://dev.to/aryanmehrotra/remote-runtime-log-level-change-using-golang-gofr-54d8?1 侵害がある場合は、[email protected] に連絡して削除してください。それ
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3