亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

更改容器運行時的日志級別

更改容器運行時的日志級別

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 關注
  • 251 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號