繁体   English   中英

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

[英]Change log level on runtime for containers

我使用logrus来注销在K8S上运行的应用程序,我们有一个env变量,我们可以设置log-level并在重启应用程序时更改它,我们的应用程序在k8s上使用docker容器运行现在我们要更改日志级别在运行时,即不要重新启动容器并在运行时更改它,并且我们可以将其从error更改为debug ,我认为这是合法的要求,但没有找到任何引用或开放源代码理念?

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

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

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

这种限制会延续到更高的水平。 如果您已经docker rundocker run ,则其-e选项来设置环境变量是您必须删除并重新创建要更改的容器之一。 env:是Kubernetes Pod规范中许多不变的部分之一; 您也不能在不删除并重新创建广告连播的情况下进行更改。

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

如果您的应用程序能够注意到对配置文件的更改,则它已被加载(并且必须对此进行特殊编码),另一种可能对您有用的路径是将ConfigMap装入容器 如果更改ConfigMap内容,则容器看到的文件将更改,但不会重新启动。 不过,我不会竭尽全力编写此代码,只是为了避免重新启动Pod。

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

首先,了解这应该在应用程序级别上发生。 也就是说,Kubernetes应该不会为您做这件事。

话虽如此,您可以让您的应用程序检查环境变量的值(您已经在执行此操作),并且根据该值是多少,它可以设置应用程序的日志级别。 换句话说,让应用程序代码轮询环境变量以查看其是否已更改。

你可以注入环境变量,如Shahaf建议,但是这需要你exec进入吊舱,这可能并不总是可能的或好的做法。

我建议您运行kubectl set env rs [REPLICASET_NAME] SOME_ENVIRONMENT_VAR=1

综上所述,您需要考虑为什么这很重要。 Kubernetes的建立原则是“ 应将豆荚视为牛,而不是宠物 ”。 这意味着当某个Pod不再有用或不同步时,应终止该Pod,并代替它启动一个代表代码当前状态的新Pod。

不管您如何去做自己需要做的事情,您都绝对不应该在生产甚至阶段中做到这一点。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM