在本文中,我将分享如何在不重新启动应用程序的情况下更改应用程序的日志级别。
介绍
日志级别通常被认为是按重要性排序:在开发中打开“不重要”级别(通知、调试等),但在生产中仅启用“最重要”级别(警告、错误等), cpu 时间和磁盘空间等资源非常宝贵。
但是,如果您的应用程序运行在 error 级别,并且您开始面临许多问题,但您无法从 error 级别日志中找出答案,那么通过重新部署应用程序来更改日志级别将花费大量时间和资源。
此外,在生产中以 info 或 debug 级别运行应用程序将生成大量日志,这些日志可能会压垮日志系统,导致 i/o 操作和资源消耗增加。
为了解决这些问题,gofr - 终极 golang 框架提供了一种安全的方法来更改日志级别,而无需重新启动应用程序。
立即学习“go语言免费学习笔记(深入)”;
更改日志级别
要更改任何 gofr 应用程序的日志级别,都需要以下配置:
remote_log_url=<url to user remote log level endpoint> (e.g., https://log-service.com/log-levels?id=1)
</url>
gofr 默认每 15 秒获取一次提供的端点以获取最新的日志级别,可以通过添加以下配置来增加或减少此间隔。
remote_log_fetch_interval=<interval in seconds> (default: 15)
</interval>
日志级别服务
gofr 要求 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()
}
运行日志服务后我们会看到如下日志:
我们已注册所有 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操作和资源消耗增加,更改为warn或error level可以减少日志数量,并增强性能,reducing cloud cost.
给 ⭐star 支持 gofr: https://github.com/gofr-dev/gofr
此外,您还可以访问免费公共端点来导出和查看应用程序的跟踪@tracer.gofr.dev。
要启用它,请在您的 .env 文件中添加以下配置
TRACE_EXPORTER=gofr
其他好处:
如果您在开发或撰写文章方面为 gofr 做出了贡献。您可以通过填写 github 自述文件(底部)上提供的表格来获得免费的赃物(t 恤、贴纸)。