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

3 回复

尝试过了。 仍然没有按照预期工作。

更多关于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
}

关键修改:

  1. 移除了time.Sleep(5 * time.Second)
  2. 添加了logWriter.Writer.Close()来显式关闭syslog连接,这会强制刷新缓冲区并发送所有待处理的日志消息
  3. panic(err)改为返回错误,使错误处理更合理

这样修改后,日志消息会在调用Info()方法后立即发送,不需要等待程序终止。

回到顶部