扩展 writer 的地址: https://github.com/gota33/aliyun-log-writer
logger := slog.New(slog.NewJSONHandler(os.Stdout, nil))
用的时候把参数中的 os.Stdout 换成这个 writer 就行了.
一个是 slog 想 Hook 的话就两个接口可以入手, slog.Handler
和 io.Writer
.
我这里选择了 io.Writer
, 主要是因为自己写 slog.Handler
的话, 得把 slog.commonHandler
里的逻辑再实现一遍, 实在有点麻烦, 有没有像 logrus.Hook
那样比较简单的实现方式?
还有一个问题跟 channel 有关.
有这样的工作队列, submit()
提交任务, stop()
阻止新任务提交, 并处理完存量任务后返回.
var (
ErrClosed = errors.New("closed")
chQuit = make(chan struct{})
chData = make(chan int, 10)
)
// func start() { ... }
func submit(n int) error {
select {
case <-chQuit:
return ErrClosed
case chData <- n:
return nil
}
}
func stop() {
close(chQuit)
close(chData)
for n := range chData {
// process data
_ = n
}
}
但是 select
跟 switch
不一样, case
的选择不是有序的, 导致有时候会选到第二个 case
然后 panic
.
所以后来把 stop()
改成这样了
func stop() {
close(chQuit)
ch := chData
chData = make(chan int)
for len(ch) > 0 {
// process data
select {
case n := <-ch:
_ = n
default:
}
}
}
这种情况大家一般是怎么处理的?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.