golang实现systemd Journal原生API日志记录的插件库journald的使用
Golang实现systemd Journal原生API日志记录的插件库journald的使用
journald
包提供了Golang对systemd Journal原生API的实现,用于日志记录。主要特性包括:
- 基于无连接套接字
- 可以处理任意大小和类型的消息
- 客户端可以使用任意数量的独立套接字
安装
使用以下命令安装该包:
go get github.com/ssgreg/journald
最佳使用方式
使用结构化日志(systemd Journal等)的最佳方式是logf - Go中快速、异步、结构化的日志记录器,具有零分配计数,以及它的journald驱动logfjournald。这个驱动使用了journald
包。
以下示例创建一个新的logf
日志记录器,带有logfjournald
附加器:
package main
import (
"runtime"
"github.com/ssgreg/logf"
"github.com/ssgreg/logfjournald"
)
func main() {
// 使用默认的journald编码器创建journald附加器
appender, appenderClose := logfjournald.NewAppender(logfjournald.NewEncoder.Default())
defer appenderClose()
// 使用journald编码器创建ChannelWriter
writer, writerClose := logf.NewChannelWriter(logf.ChannelWriterConfig{
Appender: appender,
})
defer writerClose()
// 使用ChannelWriter创建Logger
logger := logf.NewLogger(logf.LevelInfo, writer)
logger.Info("got cpu info", logf.Int("count", runtime.NumCPU()))
}
这个生成的journal条目的JSON表示:
{
"TS": "2018-11-01T07:25:18Z",
"PRIORITY": "6",
"LEVEL": "info",
"MESSAGE": "got cpu info",
"COUNT": "4",
}
直接使用方式
让我们看看journald
作为Go API提供了哪些日志记录功能:
package main
import (
"github.com/ssgreg/journald"
)
func main() {
journald.Print(journald.PriorityInfo, "Hello World!")
}
这个生成的journal条目的JSON表示:
{
"PRIORITY": "6",
"MESSAGE": "Hello World!",
"_PID": "3965",
"_COMM": "simple",
"...": "..."
}
使用Journal原生日志API的主要原因不仅仅是普通日志:它允许从程序向journal传递额外的结构化日志消息。这些额外的日志数据可用于搜索journal,可供其他程序使用,并可能帮助管理员跟踪超出人类可读消息文本所表达的问题。以下是如何使用journals.Send
实现这一点的示例:
package main
import (
"os"
"runtime"
"github.com/ssgreg/journald"
)
func main() {
journald.Send("Hello World!", journald.PriorityInfo, map[string]interface{}{
"HOME": os.Getenv("HOME"),
"TERM": os.Getenv("TERM"),
"N_GOROUTINE": runtime.NumGoroutine(),
"N_CPUS": runtime.NumCPU(),
"TRACE": runtime.ReadTrace(),
})
}
这将向journal写入一条日志消息,类似于前面的示例。但是,这次附加了一些额外的结构化字段:
{
"PRIORITY": "6",
"MESSAGE": "Hello World!",
"HOME": "/root",
"TERM": "xterm",
"N_GOROUTINE": "2",
"N_CPUS": "4",
"TRACE": [103,111,32,49,46,56,32,116,114,97,99,101,0,0,0,0],
"_PID": "4037",
"_COMM": "send",
"...": "..."
}
我们的结构化消息包含七个字段。前两个是我们传递的众所周知的字段:
MESSAGE=
是结构化消息中实际的人类可读消息部分。PRIORITY=
是从BSD syslog中已知的数字消息优先级值,格式化为整数字符串。
应用程序可以相对自由地根据需要定义其他字段(在我们的示例中定义了四个相当随意的字段)。当前所有已知字段的完整列表可在此处获得。
更多关于golang实现systemd Journal原生API日志记录的插件库journald的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html