小编Iva*_*anD的帖子

Uber Zap Logger:如何在每个日志条目前面加上字符串

我将我的应用程序用作 SystemD 服务,并且需要在每条消息前添加<LEVEL>JournalD 的入门级别,例如:

<6> this is info
<7> this is debug
<4> this is warning
Run Code Online (Sandbox Code Playgroud)

否则,JournalD 将所有条目视为同一级别,我想使用其高级功能仅显示特定级别的日志。

<6>如何使用 uber-zap 库在每个日志条目前面添加正确的级别标签(例如 Info )?

编辑:这是我的记录器配置的相关部分:

<6> this is info
<7> this is debug
<4> this is warning
Run Code Online (Sandbox Code Playgroud)

go systemd systemd-journald go-zap

5
推荐指数
1
解决办法
5712
查看次数

如何访问 zap Hooks 中的字段?

如何访问 uber-zap 挂钩中有关日志记录事件的完整信息?

例如,我试图zapcore.Field向日志记录事件添加一个,但它没有显示在zapcore.Entry.

如果不可能,我至少可以以某种方式拥有完全格式化的字符串吗?目标是在出现错误时发送电子邮件/自动消息/哨兵/等。

package main

import (
    "log"

    "github.com/davecgh/go-spew/spew"
    "go.uber.org/zap"
    "go.uber.org/zap/zapcore"
)

func main() {
    prodLogger, err := zap.NewProduction(zap.Hooks(func(entry zapcore.Entry) error {
        if entry.Level == zapcore.ErrorLevel {
            spew.Dump(entry) // fancy console printer
        }

        return nil
    }))

    if err != nil {
        log.Fatal(err)
    }

    prodLogger.
        Named("logger_name").
        Error("something happened", zap.String("foo", "bar"))
}
Run Code Online (Sandbox Code Playgroud)

foo输出 - 没有或的痕迹bar:

{"level":"error","ts":1640722252.899601,"logger":"logger_name","caller":"awesomep2/main.go:23","msg":"something happened","foo":"bar","stacktrace":"main.main\n\t/Users/xxx/GitHub/awesomep2/main.go:23\nruntime.main\n\t/usr/local/go/src/runtime/proc.go:255"}
(zapcore.Entry) {
 Level: (zapcore.Level) error,
 Time: (time.Time) 2021-12-28 13:10:52.899601 -0700 MST m=+0.000629089,
 LoggerName: (string) (len=11) "logger_name", …
Run Code Online (Sandbox Code Playgroud)

logging go go-zap

4
推荐指数
1
解决办法
3134
查看次数

如何使用Docker HEALTHCHECK?

根据https://docs.docker.com/engine/reference/builder/#healthcheck,我们可以对容器进行健康检查,给它们一些启动时间,设置重试次数和超时等。

问题是:docker container ls查看容器的状态是该功能的唯一用途吗?我知道让一个人来检查是否有任何容器不健康并决定如何处理这些容器是非常方便的。

Docker 守护进程中对于如何处理那些不健康的容器有什么后果或自定义逻辑吗?是否可以将其配置为自动重新启动这 N 次,以尝试让它们恢复活力?或者有其他编程用途吗?

docker

3
推荐指数
1
解决办法
4374
查看次数

产生 goroutine 的库中出现恐慌

如果导入的库产生一个可能会出现恐慌的 goroutine 怎么办?在这种情况下,开发人员无法阻止程序退出。

就像这段代码一样,调用一个带有延迟恢复的坏库并没有帮助,因为该库正在生成一个发生恐慌的 goroutine,并且它无法被 main 的恢复捕获。

我是否理解正确的是,唯一的补救措施是在为项目选择依赖项时非常小心,并希望作者不要做类似的事情?

package main

import (
    "fmt"
    "time"
)

func main() {
    defer func() {
        r := recover()
        if r != nil {
            fmt.Println("panic caught")
        }
    }()

    badLibrary()
}

func badLibrary() {
    go recklessFunction()
    time.Sleep(time.Second)
}

func recklessFunction() {
    panic("something went wrong")
}
Run Code Online (Sandbox Code Playgroud)

go goroutine

3
推荐指数
1
解决办法
396
查看次数

如何在 Go 中清除和重用数组(不是切片)?

如何在 Go 中清除和重用数组?将所有值分配给默认值的手动 for 循环是唯一的解决方案吗?

package main

import (
    "fmt"
)

func main() {
    arr := [3]int{1,2,3}
    fmt.Println(arr) // Output: [1 2 3]

    // clearing an array - is there a faster/easier/less verbose way?
    for i := range arr {
        arr[i] = 0
    }
    
    fmt.Println(arr) // Output: [0 0 0]
}
Run Code Online (Sandbox Code Playgroud)

arrays go

1
推荐指数
2
解决办法
382
查看次数

Jetbrains Goland HTML 模板格式设置和代码完成

我在 Jetbrains Goland 中使用 Go HTML 模板。如何获得所有 3 个内容:HTML 格式设置、模板代码完成以及模板的模板格式设置?

假设我安装了 Go Templates 插件并且使用“*.tpl”作为模板的文件扩展名,我有两个选择:

  1. 设置 - 编辑器 - 文件类型 - HTML - 添加“*.tpl”作为 HTML 类型。优点:我有 HTML 代码完成和语法突出显示,但有一个警告(请参阅缺点 2) 缺点 1:我在模板项上没有代码完成,编辑器根本不知道模板 缺点 2:模板代码块被视为文本,即我没有 RANGE 块的代码缩进,例如当我尝试格式化代码时。

  2. 设置 - 编辑器 - 文件类型 - Go 模板 - 添加“*.tpl”作为注册类型,使用“HTML”作为基础类型(“模板数据语言”) 优点:我有“点”的代码完成功能,并且可以查看属性和方法它们(请参阅https://www.jetbrains.com/help/go/integration-with-go-templates.html) 缺点:没有 HTML 突出显示、自动完成或格式设置...

go go-templates goland

1
推荐指数
1
解决办法
1916
查看次数