[英]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 run
了docker 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=debug
或export 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.