精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Slog如何同時輸出到控制臺和文件?MultiHandler提案或將終結重復造輪子

開發 前端
對于廣大的 Go 開發者而言,這無疑是個好消息。在不久的將來,我們或許就能告別為多目標日志而編寫的那些重復代碼或引入的微小依賴,享受到標準庫帶來的便利和統一。

自 log/slog 在 Go 1.21 中引入以來,一個常見的需求始終困擾著開發者:如何將日志同時發送到多個目的地,并為每個目的地設置不同的日志級別?盡管社區已涌現出 samber/slog-multi 等優秀的三方庫,但關于“標準庫是否應原生支持”的討論從未停止。最近,一項編號為 #65954 的提案,建議在 log/slog 中加入 MultiHandler,獲得了 Go 官方的 [likely accept] 評級。本文將帶您回顧該提案從被質疑到被接受的全過程,深入探討其背后的設計權衡。

背景:一個普遍而又棘手的需求

在實際生產環境中,日志往往需要被送往多個地方:

  • 控制臺(stdout):用于開發和調試,通常需要 DEBUG 級別的詳細信息。
  • 本地文件:用于歸檔和追溯,可能需要 INFO 級別以上的日志。
  • 遠端日志服務(如 ELK, Loki,VictoriaLogs等):用于聚合和告警,可能只關心 ERROR 級別的日志。

然而,log/slog 的核心設計是一個 Logger 對應一個 Handler。雖然 io.MultiWriter 可以將相同格式、相同級別的日志寫入多個 io.Writer,但它無法滿足不同目的地、不同級別這一核心需求。

這導致許多開發者不得不自行實現 slog.Handler 來“扇出”(fan-out)日志,或者引入第三方依賴。正如提案者 lxl-renren 和多位評論者所指出的,這是一個非常普遍的場景。

從“不需要”到“值得擁有”的轉變

提案初期,Go 團隊成員 jba (Jonathan Amsterdam) 和 seankhliao 對其必要性提出了質疑,核心論點是:

  1. 社區已有解決方案:像 samber/slog-multi 這樣的庫已經很好地解決了問題。
  2. 實現相對簡單:開發者可以自己編寫一個 multiHandler 來實現。
  3. 避免增加標準庫維護負擔:Go 團隊對向標準庫添加新 API 持非常謹慎的態度。

然而,隨著討論的深入,社區的聲音和更多場景的出現,逐漸改變了 Go 團隊的看法。

  • OpenTelemetry 集成:有開發者指出,當應用需要同時將日志發送到 stdout 和 OpenTelemetry Collector 時,MultiHandler 幾乎成了“剛需”。
  • 依賴問題:還有開發者認為,僅僅為了一個功能而引入一個帶有額外依賴(有時甚至是不必要的測試依賴)的第三方庫,違背了 Go 崇尚簡約的哲學。
  • 實現的微妙之處:甚至有開發者反駁了“實現簡單”的觀點,認為 slog.Handler 的正確實現存在許多“坑”(footguns),普通開發者未必能一次寫對,尤其是在處理 WithAttrs 和 WithGroup 的狀態傳遞時。
  • 先例與慣例:社區成員指出,標準庫中已經存在 io.MultiReader 和 io.MultiWriter 這樣的先例,為 slog 提供一個 MultiHandler 符合語言的內在一致性。

Filippo Valsorda 的“三復制代碼”

在討論中,Go 安全負責人、核心開發者 Filippo Valsorda (@FiloSottile) 的評論成為了一個重要的轉折點。他分享了自己在三個不同項目中都復制粘貼了的 multiHandler 實現,并直言:“代碼量太少,不值得為此增加一個依賴。”

這段代碼堪稱 slog.Handler 實現的典范,簡潔而完整:

type multiHandler []slog.Handler

func MultiHandler(handlers ...slog.Handler) slog.Handler {
return multiHandler(handlers)
}

func (h multiHandler) Enabled(ctx context.Context, l slog.Level) bool {
for i := range h {
if h[i].Enabled(ctx, l) {
   returntrue// 只要有一個 handler 需要,就啟用
  }
 }
returnfalse
}

func (h multiHandler) Handle(ctx context.Context, r slog.Record) error {
var errs []error
for i := range h {
// 在 Handle 內部再次檢查 Enabled,確保日志只發給需要的 handler
if h[i].Enabled(ctx, r.Level) {
   // 克隆 Record 以防 handler 修改,影響后續 handler
   if err := h[i].Handle(ctx, r.Clone()); err != nil {
    errs = append(errs, err)
   }
  }
 }
return errors.Join(errs...) // 合并所有 handler 的錯誤
}

func (h multiHandler) WithAttrs(attrs []slog.Attr) slog.Handler {
 handlers := make([]slog.Handler, 0, len(h))
for i := range h {
  handlers = append(handlers, h[i].WithAttrs(attrs))
 }
return multiHandler(handlers)
}

func (h multiHandler) WithGroup(name string) slog.Handler {
 handlers := make([]slog.Handler, 0, len(h))
for i := range h {
  handlers = append(handlers, h[i].WithGroup(name))
 }
return multiHandler(handlers)
}

Filippo 的分享有力地證明了:這確實是一個普遍存在、實現固定、但自己寫又有點麻煩的“最佳實踐”代碼片段。將其標準化,可以避免社區無數次地“重復造輪子”。

最終提案:一個簡單、順序、可預測的 MultiHandler

最終,在充分吸取了社區的意見后,jba 轉變了看法,并親自提出了最終的 API 提案,該提案目前已被標記為 [likely accept]:

// MultiHandler returns a handler that invokes all the given Handlers.
// Its Enable method reports whether any of the handlers' Enabled methods return true.
// Its Handle, WithAttr and WithGroup methods call the corresponding method on each of the enabled handlers.
func MultiHandler(handlers ...Handler) Handler

在討論中,團隊還明確了幾個重要的行為特性:

  • 順序執行:MultiHandler 將依次、同步地調用每一個 handler,類似于 io.MultiWriter。
  • 錯誤處理:與 io.MultiWriter 在遇到第一個錯誤時就停止不同,MultiHandler 將會繼續執行所有的 handler,并最終通過 errors.Join 返回所有遇到的錯誤。這對于日志場景更為合理,因為一個 handler(如遠程服務)的失敗不應阻止日志被寫入另一個更可靠的 handler(如 stderr)。
  • 不處理并發:標準庫版本將不會內置復雜的異步、批處理或超時邏輯。這些高級功能被認為設計自由度太大,更適合由社區的第三方庫來實現和探索。

小結

slog.MultiHandler 的提案演進過程,是 Go 標準庫發展哲學的一次完美體現。它始于一個看似“社區可以自己解決”的問題,但通過社區的廣泛反饋和真實場景的展示,最終證明了將其標準化的價值:為最普遍的需求提供一個簡單、可靠、零依賴的解決方案,同時為更復雜的需求留出空間,讓社區生態去創新。

對于廣大的 Go 開發者而言,這無疑是個好消息。在不久的將來,我們或許就能告別為多目標日志而編寫的那些重復代碼或引入的微小依賴,享受到標準庫帶來的便利和統一。這正是 Go 語言持續改進、不斷提升開發者體驗的魅力所在。

資料鏈接:https://github.com/golang/go/issues/65954


責任編輯:武曉燕 來源: TonyBai
相關推薦

2009-03-04 10:10:49

控制臺桌面虛擬化Xendesktop

2011-07-06 15:25:33

Windows控制臺

2021-08-03 10:43:17

AI 數據人工智能

2009-04-28 09:51:21

WinForm控制臺輸出

2010-12-21 14:32:43

操作控制臺

2010-03-22 18:42:23

2023-09-21 11:03:31

開發輪子工具

2020-09-08 08:45:39

jupyter插件代碼

2024-09-30 05:38:48

2015-08-06 10:14:15

造輪子facebook

2014-08-11 11:12:35

Jansi

2022-03-30 08:40:00

JavaScript控制臺

2011-08-08 10:55:14

IOS 控制臺 Consol

2009-06-15 09:50:34

JBoss控制臺

2020-09-19 09:47:05

AI 數據人工智能

2023-07-28 09:26:43

GolangZap

2022-08-08 09:34:33

Linux串行控制臺

2018-10-30 09:20:00

Linux控制臺命令

2018-09-25 10:15:30

Linux虛擬控制鼠標

2019-08-23 09:58:18

Linux控制臺命令
點贊
收藏

51CTO技術棧公眾號

国产盗摄视频一区二区三区| 亚洲视频综合| 91精品国产麻豆国产自产在线| 欧美少妇一级片| 无码国产色欲xxxx视频| 免费欧美在线视频| 欧美国产中文字幕| 神马久久久久久久久久久| 日本精品在线观看| 在线视频国内自拍亚洲视频| 9l视频自拍9l视频自拍| 青青操视频在线| 国产精品一区二区在线观看不卡 | 国产精品理论在线| 亚洲精品一区在线| 欧美视频一区二区三区四区| 九色自拍视频在线观看| 欧美日本一道| 国产色产综合产在线视频| 91精品久久香蕉国产线看观看| 久久夜色精品国产噜噜亚洲av| 牛夜精品久久久久久久99黑人| 国产亚洲视频中文字幕视频| 伊人网综合视频| 自拍偷拍亚洲| 91福利区一区二区三区| 久久综合九色综合88i| av在线影院| 国产精品卡一卡二卡三| 日本不卡高清视频一区| 懂色av蜜臀av粉嫩av分享吧| 国产一区二区三区精品欧美日韩一区二区三区 | 综合久久久久| 中文字幕免费精品一区| 三级电影在线看| www.久久东京| 日韩视频永久免费| 8x8x成人免费视频| 久久91超碰青草在哪里看| 日本韩国欧美一区| 欧美女人性生活视频| 91桃色在线| 亚洲制服丝袜av| 激情五月五月婷婷| 国产三区在线观看| 国产精品久久久久久久久久免费看| 欧美激情论坛| 男人天堂网在线| 91看片淫黄大片一级| 国产精品一区二区欧美黑人喷潮水| 精品国产99久久久久久宅男i| 极品少妇xxxx精品少妇偷拍| 国产专区精品视频| 一区二区的视频| 九一九一国产精品| 成人一区二区电影| 99精品国产99久久久久久97| 国产乱码精品一区二区三区忘忧草 | 尤物yw午夜国产精品视频| 国产精品成人一区二区三区电影毛片 | 欧美精品成人一区二区三区四区| 五月天av在线播放| 91视频亚洲| 日韩欧美的一区| 亚洲啪av永久无码精品放毛片 | 91免费在线看| 日本一区二区三区四区在线观看 | 国产精品久久久久久久久久久久久久久久| 秋霞午夜鲁丝一区二区老狼| 国产日韩换脸av一区在线观看| 国产绿帽刺激高潮对白| 国产成人午夜电影网| 国产精品免费在线播放| 色哟哟在线观看| 国产精品入口麻豆原神| 国产精品久久久影院| xxx在线免费观看| 欧美日韩一区二区三区 | 丁香激情综合国产| 国语精品免费视频| 国产98在线| 亚洲六月丁香色婷婷综合久久| 无码人妻精品一区二区三区99v| 日韩精品卡一| 色婷婷一区二区| 中文字幕精品一区二区三区在线| 亚洲精品v亚洲精品v日韩精品| 亚洲第一页在线| 免费成人深夜天涯网站| 欧美成人高清| 国产91在线播放精品91| 国产视频在线一区| 91网站在线播放| 一区二区三区av| 成人性生交大片免费看在线播放| 日本精品一区二区三区高清 | 在线观看不卡的av| 国产凹凸在线观看一区二区| 欧美日韩亚洲免费| 亚洲综合图区| 在线视频一区二区三| 国产精品igao网网址不卡| 亚洲人成网站77777在线观看| 日韩亚洲精品视频| 免费观看成人毛片| 国产一区二区中文字幕| 欧美日韩国产免费一区二区三区 | 国产精品老女人视频| 狠狠躁夜夜躁av无码中文幕| 中文字幕巨乱亚洲| 精品这里只有精品| 视频欧美一区| 日韩在线中文字| 中文字幕黄色片| 懂色av一区二区三区免费观看 | 国产在线观看av| 欧美日韩亚洲一区二区三区| 免费黄视频在线观看| 精品国产一区二区三区四区| 九九精品视频在线观看| 一级片免费网站| 久久精品日产第一区二区三区高清版 | 国产日产一区二区三区| 欧美日韩在线观看一区二区 | 成人动漫视频在线观看完整版| www.久久综合| 国产精品国产三级国产有无不卡 | 日本少妇激情视频| 国产在线精品一区二区夜色| 视频一区二区在线| 高清不卡av| 亚洲国产精品一区二区三区| 九九精品在线观看视频| 国产老妇另类xxxxx| 在线观看日韩片| 色成人综合网| 日韩一级黄色av| 丰满人妻一区二区三区四区| 久久久久久99久久久精品网站| 日本精品免费在线观看| 欧美成人基地| 91黑丝高跟在线| 少妇荡乳情欲办公室456视频| 一区二区三区加勒比av| 91视频综合| 亚洲成年人在线播放| 顶级黑人搡bbw搡bbbb搡| 久久久久久婷| 欧美久久在线| 成人性生交大片免费观看网站| 精品精品欲导航| 一区二区三区免费高清视频| 国产成人啪午夜精品网站男同| 亚洲天堂第一区| 日韩激情欧美| 欧美多人爱爱视频网站| 亚洲a视频在线观看| 亚洲一区影音先锋| 亚洲欧美在线不卡| 亚洲影院免费| 日韩精品一区二区三区色偷偷| 日韩欧美一区二区三区在线观看| 最近2019免费中文字幕视频三| 亚洲天堂久久久久| 亚洲乱码日产精品bd| 香蕉视频污视频| 久久五月精品中文字幕| 欧美一区二区三区视频在线| 五月婷婷一区二区| youjizz国产精品| 国产性xxxx18免费观看视频| 精品国产一区二区三区久久久蜜臀 | 成人在线观看一区| 7777精品久久久大香线蕉| 麻豆亚洲av熟女国产一区二| www.成人在线| 三年中国国语在线播放免费| 91精品国产乱码久久久久久久| 91成人理论电影| 麻豆mv在线看| 中文字幕亚洲图片| 亚洲卡一卡二卡三| 91久久一区二区| 中文字幕亚洲欧美日韩| 成人深夜视频在线观看| 欧美日韩怡红院| 欧美久久影院| 欧美日韩国产精品一区二区| 精品国产亚洲一区二区三区在线| 国模私拍视频一区| 日本在线丨区| 日韩一级免费观看| 精品人妻一区二区色欲产成人| 国产精品国产三级国产aⅴ中文 | 黄色片在线免费| 欧美日本二区| 日韩欧美99| 大香伊人久久精品一区二区| 国产精品久久久久久网站| 久久av色综合| 最新亚洲国产精品| 桃花色综合影院| 日韩片之四级片| 中国一级特黄视频| 亚洲电影一区二区| 美国黄色片视频| 国产亚洲一区二区三区| 一级黄色电影片| 国内精品伊人久久久久影院对白| 久久精品99国产| 影音先锋久久资源网| 最新国产精品久久| 欧美综合在线视频观看| 你懂的视频在线一区二区| 97久久亚洲| 91亚洲人电影| 久久麻豆视频| 国产成人激情视频| 成人免费图片免费观看| 欧美激情高清视频| 91麻豆国产福利在线观看宅福利| 一本一本久久a久久精品综合小说 一本一本久久a久久精品牛牛影视 | 精品中文字幕人| 1204国产成人精品视频| 91中文在线视频| 成人综合网站| 国产成人精品免高潮在线观看| 9999在线视频| 久久久久久国产精品三级玉女聊斋| 麻豆网站在线| 久久精品91久久久久久再现| 91涩漫在线观看| 国产亚洲成av人片在线观看桃| 青青草在线视频免费观看| 亚洲国内高清视频| 天天操天天射天天舔| 亚洲电影免费观看高清完整版在线观看| av小说天堂网| 日韩视频免费观看高清完整版 | 国产精品自产自拍| 两女双腿交缠激烈磨豆腐| 国产一区激情在线| av在线网站免费观看| 国精品**一区二区三区在线蜜桃| 激情五月俺来也| 蜜桃av一区二区三区| 五月婷婷丁香色| 国产一区二区在线看| 香蕉视频xxxx| 国产盗摄女厕一区二区三区| 中国男女全黄大片| 不卡av在线免费观看| 国产真实乱人偷精品| av亚洲精华国产精华精| jizz日本免费| 国产色产综合产在线视频| 国产馆在线观看| 亚洲伦理在线精品| 日韩欧美大片在线观看| 欧美性20hd另类| 小泽玛利亚一区二区三区视频| 欧美日韩你懂得| av中文字幕第一页| 亚洲精美色品网站| 国产中文在线观看| 精品久久久999| 久久av色综合| 欧美中文在线观看国产| 91精品国产66| 亚洲最大的成人网| 猫咪成人在线观看| 日韩影片在线播放| 一区二区三区四区日韩| 日韩伦理在线免费观看| 日韩电影免费在线观看网站| 一区二区三区国产好的精华液| 成人网男人的天堂| 国产午夜福利一区| 一区二区三区欧美在线观看| 国产精品va无码一区二区三区| 欧美日韩亚洲丝袜制服| 亚洲国产精品久久人人爱潘金莲| 亚洲女人天堂视频| h网站久久久| 欧美有码在线视频| 久久久国产精品入口麻豆| 久久国产精品一区二区三区| 小说区亚洲自拍另类图片专区| 欧美日韩性生活片| 激情欧美一区二区三区在线观看| a天堂视频在线观看| 成人欧美一区二区三区黑人麻豆 | 9999热视频在线观看| 国产精品自拍偷拍| 日韩激情啪啪| 在线观看av的网址| 欧美大片免费播放器| 亚洲国产免费看| 亚洲五月天综合| 高清免费成人av| 少妇人妻好深好紧精品无码| 一区二区三区毛片| 国产黄色免费视频| 亚洲精品理论电影| av网站网址在线观看| 国产精品27p| 精品福利一区| 女同性恋一区二区| 日韩电影在线免费观看| 男女一区二区三区| 亚洲男同1069视频| 中文字幕在线播放av| 日韩精品亚洲视频| 都市激情国产精品| 97se亚洲综合| 91精品国产自产拍在线观看蜜| aaa毛片在线观看| 成人免费看视频| 校园春色 亚洲| 欧美一区二区视频免费观看| av在线收看| 国产精品成人播放| 午夜先锋成人动漫在线| 东北少妇不带套对白| 国产成人鲁色资源国产91色综| 欧美日韩色视频| 欧美日韩精品一区视频| 成人亚洲综合天堂| 青草成人免费视频| 免费视频国产一区| 国产在线观看福利| 久久午夜羞羞影院免费观看| 中文字幕亚洲精品在线| 亚洲精品suv精品一区二区| 青春草免费在线视频| 亚洲wwwav| 欧美日韩爆操| 在线播放第一页| 亚洲国产乱码最新视频| 动漫av一区二区三区| 欧美激情视频在线观看| 亚洲国产一区二区三区网站| 欧美一区二区三区综合| 国产成人免费视频一区| 欧美人妻精品一区二区三区| 日韩视频免费观看高清在线视频| free性欧美hd另类精品| 99在线视频首页| 亚洲国产免费| 成人免费无码大片a毛片| 天天做天天摸天天爽国产一区| 无套内谢的新婚少妇国语播放| 欧美亚洲免费电影| 精品日韩免费| 三级一区二区三区| 一区二区三区不卡在线观看 | 日韩欧美激情一区| 日本高清成人vr专区| 国产精品9999久久久久仙踪林| 99成人精品| 97超碰在线资源| 欧美日韩成人一区| 天堂av资源在线观看| 国产青春久久久国产毛片| 免费日韩一区二区| 青青草自拍偷拍| 日韩一级成人av| 天天综合av| 亚洲精品中字| 国产成人亚洲精品狼色在线| 日韩免费视频一区二区视频在线观看| 一个人看的www久久| 久久免费精品| 两根大肉大捧一进一出好爽视频| 国产女人18水真多18精品一级做 | 精品久久毛片| 97免费视频观看| 国产日韩欧美高清| 国产sm主人调教女m视频| 91精品成人久久| 99欧美视频| 在线免费观看黄色小视频| 欧美另类高清zo欧美| 国产精品yjizz视频网| 亚洲成人蜜桃| 不卡的看片网站| 国产精品系列视频| 26uuu另类亚洲欧美日本老年| 欧美韩国日本在线观看 | 国产美女精品视频国产| 97精品视频在线播放| 色一区二区三区四区| 亚洲久久久久久| 91精品国产91久久综合桃花| 欧美成人精品一区二区男人小说| 成年在线观看视频| 国产精品美女久久久久久久 | 欧美极品欧美精品欧美图片| 亚洲视频免费在线| 国产中文字幕在线观看|