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

我用于logrus记录在 K8S 上运行的应用程序,我们有 env 变量,我们可以设置log-level它并在重新启动应用程序时更改它我们的应用程序在 k8s 上使用 docker 容器运行现在我们想要更改运行时的日志级别,即不要重新启动容器并在运行时更改它,这样我们就可以将其从 更改errordebug,我认为这是合法的请求,但没有找到任何参考或任何这样做的开源代码,有什么想法吗?

package logs


import (

    "fmt"

    "os"


    "github.com/sirupsen/logrus"

)


const (

    AppLogLevel = “APP_LOG_LEVEL"

    DefLvl = "info"

)



var Logger *logrus.Logger



func 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 env

func 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))

    }

}

我知道如何更改日志级别,但我需要一种方法来影响记录器更改级别


慕妹3146593
浏览 184回答 3
3回答

炎炎设计

作为一般的 Un*x 语句,您无法在进程启动后更改进程中的环境变量。(你可以setenv (3)你自己的环境,并且你可以在execve (2)它时指定一个新进程的环境,但是一旦启动,你就不能再改变它。)此限制适用于更高级别。如果您有docker run一个容器,那么它-e设置环境变量的选项是您必须删除并重新创建容器才能更改的内容之一。这env:是 Kubernetes Pod 规范的众多不可变部分之一;如果不删除并重新创建 Pod,您也无法更改它。如果您已通过 Deployment 部署了 pod(您确实应该这样做),则可以更改 Deployment 规范中的环境变量设置(在源代码管理中编辑 YAML 文件及其,或直接编辑kubectl apply -f)kubectl edit。这将导致 Kubernetes 使用新的日志值启动新的 pod,并按顺序关闭旧的 pod,从而进行零停机更新。 像这样删除和重新创建 Pod 是完全正常的,并且每当您想要更改部署内的映像以获得今天的构建时都会发生。如果您的应用程序能够注意到其加载的配置文件的更改(并且必须对其进行专门编码才能做到这一点),那么另一种适合您的路径是将 ConfigMap 挂载到容器中;如果更改 ConfigMap 内容,容器看到的文件将会更改,但不会重新启动。

泛舟湖上清波郎朗

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

拉风的咖菲猫

首先,了解这应该发生在应用程序级别。也就是说,这不是 Kubernetes 应该为你做的事情。话虽这么说,您可以让应用程序检查环境变量的值(您已经在这样做),并且根据该值是什么,它可以设置应用程序的日志级别。换句话说,让应用程序代码轮询环境变量以查看它是否已更改。您可以像 Shahaf 建议的那样注入环境变量,但这需要您exec进入 pod,这可能并不总是可行或良好的做法。我建议你跑kubectl set env rs [REPLICASET_NAME] SOME_ENVIRONMENT_VAR=1。话虽如此,您需要考虑为什么这很重要。Kubernetes 的构建原则是“&nbsp;Pod 应该像牛一样对待,而不是宠物”。这意味着当一个 Pod 不再有用或不同步时,它应该被终止,并且应该启动一个代表代码当前状态的新 Pod 来代替它。不管你如何去做你需要做的事情,你真的不应该在生产中这样做,甚至不应该在登台中这样做。相反,让您的应用程序的基础环境变量设置适合该环境的日志级别。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go