日志级别通常按重要性排序:在开发阶段开启 "不重要 "级别(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),以进行常规操作。
gofr: https://github.com/gofr-dev/gofr
[2]Gofr docs: https://gofr.dev/docs