”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 使用 Golang 和 GoFr 更改运行时日志级别

使用 Golang 和 GoFr 更改运行时日志级别

发布于2024-07-30
浏览:544

在本文中,我将分享如何在不重新启动应用程序的情况下更改应用程序的日志级别。

介绍

日志级别通常被认为是按重要性排序:在开发中打开“不重要”级别(通知、调试等),但在开发中仅启用“最重要”级别(警告、错误等)。生产环境,CPU 时间和磁盘空间等资源非常宝贵。

但是,如果您的应用程序运行在 ERROR 级别并且您开始面临许多问题,但您无法从 ERROR 级别日志中找出答案,那么通过重新部署应用程序来更改日志级别将花费大量时间和资源。

此外,在生产中以 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 要求 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 操作和资源消耗增加,更改为警告或错误级别可减少日志数量,增强性能,并降低云成本

通过给予 ⭐star 支持 GoFr: https://github.com/gofr-dev/gofr

此外,您可以访问免费公共端点来导出和查看应用程序的跟踪@tracer.gofr.dev。 
要启用它,请在您的 .env 文件中添加以下配置

TRACE_EXPORTER=gofr

其他福利:
如果您在开发或撰写文章方面为 GOFR 做出了贡献。您可以通过填写 GitHub 上的表格来获得免费的 赠品(T 恤、贴纸) 自述文件(位于底部)。

版本声明 本文转载于:https://dev.to/aryanmehrotra/remote-runtime-log-level-change-using-golang-gofr-54d8?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 如何使用node-mysql在单个查询中执行多个SQL语句?
    如何使用node-mysql在单个查询中执行多个SQL语句?
    Multi-Statement Query Support in Node-MySQLIn Node.js, the question arises when executing multiple SQL statements in a single query using the node-mys...
    编程 发布于2025-04-22
  • FastAPI自定义404页面创建指南
    FastAPI自定义404页面创建指南
    response = await call_next(request) if response.status_code == 404: return RedirectResponse("https://fastapi.tiangolo.com") else: ...
    编程 发布于2025-04-22
  • JavaScript计算两个日期之间天数的方法
    JavaScript计算两个日期之间天数的方法
    How to Calculate the Difference Between Dates in JavascriptAs you attempt to determine the difference between two dates in Javascript, consider this s...
    编程 发布于2025-04-22
  • 如何从Google API中检索最新的jQuery库?
    如何从Google API中检索最新的jQuery库?
    从Google APIS 问题中提供的jQuery URL是版本1.2.6。对于检索最新版本,以前有一种使用特定版本编号的替代方法,它是使用以下语法:获取最新版本:未压缩)While these legacy URLs still remain in use, it is recommended ...
    编程 发布于2025-04-22
  • 在Java中,`@SuppressWarnings("unchecked")`的含义及使用时机
    在Java中,`@SuppressWarnings("unchecked")`的含义及使用时机
    [pundresswarnings(“ untable”)在java 相关资源有关此主题的更全面信息,请参阅Java Generics FAQ,尤其是标题为“什么是“未被关注” Warning?”。 FAQ提供了对场景的有价值的见解,其中@suppresswarnings(“未检查”)是适当的,...
    编程 发布于2025-04-22
  • Python高效去除文本中HTML标签方法
    Python高效去除文本中HTML标签方法
    在Python中剥离HTML标签,以获取原始的文本表示Achieving Text-Only Extraction with Python's MLStripperTo streamline the stripping process, the Python standard librar...
    编程 发布于2025-04-22
  • 如何使用不同数量列的联合数据库表?
    如何使用不同数量列的联合数据库表?
    合并列数不同的表 当尝试合并列数不同的数据库表时,可能会遇到挑战。一种直接的方法是在列数较少的表中,为缺失的列追加空值。 例如,考虑两个表,表 A 和表 B,其中表 A 的列数多于表 B。为了合并这些表,同时处理表 B 中缺失的列,请按照以下步骤操作: 确定表 B 中缺失的列,并将它们添加到表的末...
    编程 发布于2025-04-22
  • Go语言垃圾回收如何处理切片内存?
    Go语言垃圾回收如何处理切片内存?
    Garbage Collection in Go Slices: A Detailed AnalysisIn Go, a slice is a dynamic array that references an underlying array.使用切片时,了解垃圾收集行为至关重要,以避免潜在的内存泄...
    编程 发布于2025-04-22
  • 将图片浮动到底部右侧并环绕文字的技巧
    将图片浮动到底部右侧并环绕文字的技巧
    在Web设计中围绕在Web设计中,有时可以将图像浮动到页面右下角,从而使文本围绕它缠绕。这可以在有效地展示图像的同时创建一个吸引人的视觉效果。 css位置在右下角,使用css float and clear properties: img { 浮点:对; ...
    编程 发布于2025-04-22
  • 如何处理PHP文件系统功能中的UTF-8文件名?
    如何处理PHP文件系统功能中的UTF-8文件名?
    在PHP的Filesystem functions中处理UTF-8 FileNames 在使用PHP的MKDIR函数中含有UTF-8字符的文件很多flusf-8字符时,您可能会在Windows Explorer中遇到comploreer grounder grounder grounder gro...
    编程 发布于2025-04-22
  • Java数组中元素位置查找技巧
    Java数组中元素位置查找技巧
    在Java数组中检索元素的位置 利用Java的反射API将数组转换为列表中,允许您使用indexof方法。 (primitives)(链接到Mishax的解决方案) 用于排序阵列的数组此方法此方法返回元素的索引,如果发现了元素的索引,或一个负值,指示应放置元素的插入点。
    编程 发布于2025-04-22
  • 如何在JavaScript对象中动态设置键?
    如何在JavaScript对象中动态设置键?
    在尝试为JavaScript对象创建动态键时,如何使用此Syntax jsObj['key' i] = 'example' 1;不工作。正确的方法采用方括号: jsobj ['key''i] ='example'1; 在JavaScript中,数组是一...
    编程 发布于2025-04-22
  • 图片在Chrome中为何仍有边框?`border: none;`无效解决方案
    图片在Chrome中为何仍有边框?`border: none;`无效解决方案
    在chrome 中删除一个频繁的问题时,在与Chrome and IE9中的图像一起工作时,遇到了一个频繁的问题。和“边境:无;”在CSS中。要解决此问题,请考虑以下方法: Chrome具有忽略“ border:none; none;”的已知错误,风格。要解决此问题,请使用以下CSS ID块创建带...
    编程 发布于2025-04-22
  • 可以在纯CS中将多个粘性元素彼此堆叠在一起吗?
    可以在纯CS中将多个粘性元素彼此堆叠在一起吗?
    [2这里: https://webthemez.com/demo/sticky-multi-header-scroll/index.html </main> <section> { display:grid; grid-template-...
    编程 发布于2025-04-22
  • JavaScript中如何动态访问全局变量?
    JavaScript中如何动态访问全局变量?
    在JavaScript 一种方法是使用窗口对象存储和检索变量。通过引用全局范围,可以使用其名称动态访问变量。 //一个脚本 var somevarname_10 = 20; //另一个脚本 window.all_vars = {}; window.all_vars ['somevarnam...
    编程 发布于2025-04-22

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3