日志应该统一输出到 os.Stdout,还是 os.Stderr?? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
1800x
V2EX    Go 编程语言

日志应该统一输出到 os.Stdout,还是 os.Stderr??

  1800x 2023-01-28 11:47:15 +08:00 4017 次点击
这是一个创建于 995 天前的主题,其中的信息可能已经有所发展或是发生改变。

看网上很多例子,日志统一输出到 os.Stderr 。
当然也有 os.Stdout 的。

想请教下,在实际环境上,这两者的不同。

19 条回复    2023-07-27 22:42:27 +08:00
msg7086
    1
msg7086  
   2023-01-28 11:54:13 +08:00
生产的时候哪个都不用,走日志库发送到中央日志系统。
jifengg
    2
jifengg  
   2023-01-28 11:56:01 +08:00   5
个人觉得,看软件的输出类型。
比如你的程序是服务型的(比如一个 http 服务),不靠控制台做输出或不输出管道,则 stdout 或 stderr 都可以。
如果是工具型的(比如 grep 、ffmpeg ),通过控制台输出结果的,那么日志就应该输出到 stderr ,避免和正常的 stdout 混淆了。
plko345
    3
plko345  
   2023-01-28 11:59:31 +08:00
stdout 吧, 基本都是这么做的吧, 而且现在容器化, 也都是这么做的
julyclyde
    4
julyclyde  
   2023-01-28 12:51:07 +08:00   1
julyclyde
    5
julyclyde  
   2023-01-28 12:51:50 +08:00   1
@msg7086 我觉得应用程序亲自发到中心有点不太好。调试的时候还需要抑制这个行为
ql562482472
    6
ql562482472  
   2023-01-28 13:09:55 +08:00
stdout 啊
guanzhangzhang
    7
guanzhangzhang  
   2023-01-28 16:46:53 +08:00
最优雅的还是 env 或者配置文件支持类似 DSN 那样的配置,支持 stdout 也支持远端集中日志,以及 format 是 json 还是 line 啥的
tool2d
    8
tool2d  
   2023-01-28 17:37:51 +08:00
推荐 os.Stdout ,这样还可以用管道,让别的程序实时二次加工 /过滤你的 log 内容。
nightwitch
    9
nightwitch  
   2023-01-28 17:45:30 +08:00 via Android
生产环境下一般往 socket 或者 file
feelinglucky
    10
feelinglucky  
   2023-01-28 19:32:38 +08:00
@julyclyde 让日志库去实现好了,应用只是调用不关心细节
GopherDaily
    11
GopherDaily  
   2023-01-28 19:57:26 +08:00
stdout ,逻辑分层,输出日志就输出日志,后续的收集、分类存储没必要耦合
MrKrabs
    12
MrKrabs  
   2023-01-28 20:47:22 +08:00
看心情
soulsxd
    13
soulsxd  
   2023-01-29 10:05:59 +08:00
统一 stdout ,然后日志打印加上日志级别用于过滤
hellojukay
    14
hellojukay  
   2023-01-29 11:50:33 +08:00
系统正常日志,输出到 os.Stdout, 系统错误日志输出到 os.Stderr , linux 上命令行程序的日志都是这个规则。
mxalbert1996
    15
mxalbert1996  
   2023-01-29 12:01:24 +08:00 via Android
@tool2d stderr 也可以,加个 2>&1 就行
libook
    16
libook  
   2023-01-29 12:02:14 +08:00
这其实就是个约定问题,你可以看一下为什么系统要设计 stdout 和 stderr 两个通道,然后再看一下自己项目的设计如何利用这两个通道。
jim9606
    17
jim9606  
   2023-01-29 13:05:38 +08:00 via Android
如果你打算用 systemd 、docker 等管理服务日志,用 stdout 问题不大
如果本身有 CLI 交互的就得换 stderr 了
tairan2006
    18
tairan2006  
   2023-02-07 10:12:47 +08:00
stdout 啊,因为 go 的 panic 会输出到 stderr ,你需要单独捕获 panic 的日志的话,就不要向 stderr 里面输出任何业务信息。
lotusgrm
    19
lotusgrm  
   2023-07-27 22:42:27 +08:00
1 、如果服务是容器化的,建议将容器的日志输出到 stdout 和 stderr ,这里主要有这么 2 个原因吧:( 1 )方便日志的集中管理。将容器日志输出 stdout 和 stderr 可以很方便的通过管道重定向到其它的日志管理平台,这样一来的话所有容器的日志可以集中存储和分析 ( 2 )容器化标准化。将日志输出 stdout 和 stderr 有助于将容器设计为只负责应用程序进程本身,而不用关心日志的具体实现,比如我们可以通过 sidecar 的方式收集封装服务日志

2 、具体是输出 stdout 还是 stderr ,我个人觉得可以根据日志级别来决定,比如 nginx 中有两类很重的日志:access.log 、error.log ,前者表示正常的访问日志,后者表示错误日志,一般情况我觉得我们的业务系统可以参考 nginx 的设计建立这两类日志
关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2573 人在线   最高记录 6679       Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 24ms UTC 03:55 PVG 11:55 LAX 20:55 JFK 23:55
Do have faith in what you're doing.
ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86