Golang应用中使用log/syslog遇到的问题如何解决
Golang应用中使用log/syslog遇到的问题如何解决 我编写了一个示例Golang代码,用于将应用程序日志发送到系统日志服务器。
示例Go代码:
package main
import (
"fmt"
"log/syslog"
"time"
)
type syslogImpl struct {
Writer *syslog.Writer
SyslogNetwork string
SyslogRaddr string
}
var (
logWriter *syslogImpl
)
func main() {
fmt.Println("inside main …")
fmt.Println("\n**Logging application information to syslog.**")
rADDR := "localhost:514"
fmt.Println("Syslog server address : " + rADDR)
hook, err := logHook("tcp", rADDR, syslog.LOG_ERR|syslog.LOG_INFO, "TESTING")
if err != nil {
fmt.Println("Error initializing syslog Address : ", rADDR, " , Error : ", err)
}
logWriter = hook
fmt.Println("Writing to location " + logWriter.SyslogRaddr)
logWriter.Writer.Info("main …")
time.Sleep(5 * time.Second)
fmt.Println("Program Termination")
}
func logHook(network string, raddr string, priority syslog.Priority, tag string) (*syslogImpl, error) {
hook, err := syslog.Dial(network, raddr, priority, tag)
if err != nil {
fmt.Println("Error while attempting to connect syslog server at ", network, ". Please check syslog configuration value.")
panic(err)
}
fmt.Fprintf(hook, "This is a daemon warning with demotag.")
hook.Emerg("And this is a daemon emergency with demotag.")
return &syslogImpl{hook, network, raddr}, err
}
输出详情: 我在 “localhost:514” 上获得了输出。但是在应用程序终止5秒后才收到消息。 我希望在调用 Info() 方法 时就能收到消息。 有没有什么方法可以解决这个问题? 急切等待有人回复。
谢谢。
更多关于Golang应用中使用log/syslog遇到的问题如何解决的实战教程也可以访问 https://www.itying.com/category-94-b0.html
尝试过了。 仍然没有按照预期工作。
更多关于Golang应用中使用log/syslog遇到的问题如何解决的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
根据文档syslog包 - log/syslog - Go语言包
Priority是syslog设施和严重性的组合。例如,LOG_ALERT | LOG_FTP表示从FTP设施发送警报严重级别的消息。默认严重性为LOG_EMERG;默认设施为LOG_KERN。
但你使用了两个严重性级别。建议改为使用syslog.LOG_INFO | syslog.LOG_USER
func main() {
fmt.Println("hello world")
}
在你的代码中,日志消息延迟5秒才收到是因为使用了time.Sleep(5 * time.Second),这会导致程序在日志写入后等待5秒才退出。系统日志通常使用缓冲机制,程序正常退出时会自动刷新缓冲区,但使用sleep会延迟这个过程。
以下是修改后的代码,移除了sleep并添加了显式的连接关闭,确保日志能及时发送:
package main
import (
"fmt"
"log/syslog"
)
type syslogImpl struct {
Writer *syslog.Writer
SyslogNetwork string
SyslogRaddr string
}
var (
logWriter *syslogImpl
)
func main() {
fmt.Println("inside main …")
fmt.Println("\n**Logging application information to syslog.**")
rADDR := "localhost:514"
fmt.Println("Syslog server address : " + rADDR)
hook, err := logHook("tcp", rADDR, syslog.LOG_ERR|syslog.LOG_INFO, "TESTING")
if err != nil {
fmt.Println("Error initializing syslog Address : ", rADDR, " , Error : ", err)
return
}
logWriter = hook
fmt.Println("Writing to location " + logWriter.SyslogRaddr)
// 立即写入日志
logWriter.Writer.Info("main …")
// 显式关闭连接以确保日志发送
if err := logWriter.Writer.Close(); err != nil {
fmt.Println("Error closing syslog connection:", err)
}
fmt.Println("Program Termination")
}
func logHook(network string, raddr string, priority syslog.Priority, tag string) (*syslogImpl, error) {
hook, err := syslog.Dial(network, raddr, priority, tag)
if err != nil {
fmt.Println("Error while attempting to connect syslog server at ", network, ". Please check syslog configuration value.")
return nil, err
}
fmt.Fprintf(hook, "This is a daemon warning with demotag.")
hook.Emerg("And this is a daemon emergency with demotag.")
return &syslogImpl{hook, network, raddr}, err
}
关键修改:
- 移除了
time.Sleep(5 * time.Second) - 添加了
logWriter.Writer.Close()来显式关闭syslog连接,这会强制刷新缓冲区并发送所有待处理的日志消息 - 将
panic(err)改为返回错误,使错误处理更合理
这样修改后,日志消息会在调用Info()方法后立即发送,不需要等待程序终止。

