GoFr 远程更改运行时的日志级别

文摘   2024-09-07 22:48   中国香港  

日志级别通常按重要性排序:在开发阶段开启 "不重要 "级别(INFO、DEBUG等),但在生产阶段只开启 "最重要 "级别(WARN、ERROR等),否则会浪费 CPU, I/O 操作和磁盘空间等资源。但是,如果应用程序运行在 "ERROR "级别,但是开始出现某些问题需要排查,无法从 ERROR 级别的日志中找出问题所在,通过重新部署应用程序来更改日志级别将耗费大量时间和资源。那么如何在不重启应用程序的情况下更改应用程序的日志级别?

为了解决这些问题,GoFr[1] - 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)

Log Level Service

GoFr 要求 URL 以下列格式作出回应,其中有两个必填字段:

{
  "data": {
    "serviceName""test-service",
    "logLevel""DEBUG"
  }
}

让我们创建日志级别服务,它将为我们的应用程序提供日志级别。可以参考 GoFr 文档[2]

我们将使用 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 功能来注册路由。

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, ERROR),以进行常规操作。
参考资料
[1]

gofr: https://github.com/gofr-dev/gofr

[2]

Gofr docs: https://gofr.dev/docs


Go Official Blog
Golang官方博客的资讯翻译及独家解读
 最新文章