为了账号安全,请及时绑定邮箱和手机立即绑定

更改容器运行时的日志级别

更改容器运行时的日志级别

Go
慕妹3146593 2023-07-04 19:11:08
我用于logrus记录在 K8S 上运行的应用程序,我们有 env 变量,我们可以设置log-level它并在重新启动应用程序时更改它我们的应用程序在 k8s 上使用 docker 容器运行现在我们想要更改运行时的日志级别,即不要重新启动容器并在运行时更改它,这样我们就可以将其从 更改error为debug,我认为这是合法的请求,但没有找到任何参考或任何这样做的开源代码,有什么想法吗?package logsimport (    "fmt"    "os"    "github.com/sirupsen/logrus")const (    AppLogLevel = “APP_LOG_LEVEL"    DefLvl = "info")var Logger *logrus.Loggerfunc NewLogger() *logrus.Logger {    var level logrus.Level    lvl := getLogLevel()    // In case level doesn't set will not print any message    level = logLevel(lvl)    logger := &logrus.Logger{        Out:   os.Stdout,        Level: level,    }    Logger = logger    return Logger}// use from envfunc getLogLevel() string {    lvl, _ := os.LookupEnv(AppLogLevel)    if lvl != "" {        return lvl    }    return DefLvl}func logLevel(lvl string) logrus.Level {    switch lvl {    case "debug":        // Used for tracing        return logrus.DebugLevel    case "info":        return logrus.InfoLevel    case "error":        return logrus.ErrorLevel    case "fatal":        return logrus.FatalLevel    default:        panic(fmt.Sprintf("the specified %s log level is not supported", lvl))    }}我知道如何更改日志级别,但我需要一种方法来影响记录器更改级别
查看完整描述

3 回答

?
炎炎设计

TA贡献1808条经验 获得超4个赞

作为一般的 Un*x 语句,您无法在进程启动后更改进程中的环境变量。(你可以setenv (3)你自己的环境,并且你可以在execve (2)它时指定一个新进程的环境,但是一旦启动,你就不能再改变它。)

此限制适用于更高级别。如果您有docker run一个容器,那么它-e设置环境变量的选项是您必须删除并重新创建容器才能更改的内容之一。这env:是 Kubernetes Pod 规范的众多不可变部分之一;如果不删除并重新创建 Pod,您也无法更改它。

如果您已通过 Deployment 部署了 pod(您确实应该这样做),则可以更改 Deployment 规范中的环境变量设置(在源代码管理中编辑 YAML 文件及其,或直接编辑kubectl apply -fkubectl edit。这将导致 Kubernetes 使用新的日志值启动新的 pod,并按顺序关闭旧的 pod,从而进行零停机更新。 像这样删除和重新创建 Pod 是完全正常的,并且每当您想要更改部署内的映像以获得今天的构建时都会发生。

如果您的应用程序能够注意到其加载的配置文件的更改(并且必须对其进行专门编码才能做到这一点),那么另一种适合您的路径是将 ConfigMap 挂载到容器中;如果更改 ConfigMap 内容,容器看到的文件将会更改,但不会重新启动。


查看完整回答
反对 回复 2023-07-04
?
泛舟湖上清波郎朗

TA贡献1818条经验 获得超3个赞

您可以运行该命令kubectl exec -it <container_name> bash并使用容器内的命令行来更改环境变量。您可以通过运行命令export LOG_LEVEL=debugexport LOG_LEVEL=error在容器内来完成。



查看完整回答
反对 回复 2023-07-04
?
拉风的咖菲猫

TA贡献1995条经验 获得超2个赞

首先,了解这应该发生在应用程序级别。也就是说,这不是 Kubernetes 应该为你做的事情。

话虽这么说,您可以让应用程序检查环境变量的值(您已经在这样做),并且根据该值是什么,它可以设置应用程序的日志级别。换句话说,让应用程序代码轮询环境变量以查看它是否已更改。

您可以像 Shahaf 建议的那样注入环境变量,但这需要您exec进入 pod,这可能并不总是可行或良好的做法。

我建议你跑kubectl set env rs [REPLICASET_NAME] SOME_ENVIRONMENT_VAR=1

话虽如此,您需要考虑为什么这很重要。Kubernetes 的构建原则是“ Pod 应该像牛一样对待,而不是宠物”。这意味着当一个 Pod 不再有用或不同步时,它应该被终止,并且应该启动一个代表代码当前状态的新 Pod 来代替它。

不管你如何去做你需要做的事情,你真的不应该在生产中这样做,甚至不应该在登台中这样做。

相反,让您的应用程序的基础环境变量设置适合该环境的日志级别。


查看完整回答
反对 回复 2023-07-04
  • 3 回答
  • 0 关注
  • 108 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信