在Debian上配置Golang日志可按以下方式操作,主要涉及日志库选择、输出配置及轮转管理:
log
:轻量级,适合基础日志需求,支持输出到文件或控制台。log
package main
import (
"log"
"os"
)
func main() {
// 输出到文件
file, err := os.OpenFile("app.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
if err != nil {
log.Fatal(err)
}
defer file.Close()
log.SetOutput(file) // 设置输出目标
log.SetFlags(log.Ldate | log.Ltime | log.Lshortfile) // 设置日志格式
log.Println("This is a log message.") // 记录日志
}
package main
import (
"github.com/sirupsen/logrus"
"os"
)
func main() {
logrus.SetLevel(logrus.InfoLevel) // 设置日志级别
logrus.SetFormatter(&logrus.JSONFormatter{}) // 设置JSON格式
file, err := os.OpenFile("app.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
if err != nil {
logrus.Fatal(err)
}
defer file.Close()
logrus.SetOutput(file) // 输出到文件
logrus.Info("This is an info log.") // 记录日志
}
package main
import (
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
"os"
)
func main() {
config := zap.NewProductionConfig()
config.OutputPaths = []string{"stdout", "app.log"} // 同时输出到控制台和文件
logger, err := config.Build()
if err != nil {
panic(err)
}
defer logger.Sync()
logger.Info("This is an info log.", zap.String("key", "value")) // 结构化日志
}
使用 logrotate
工具防止日志文件过大:
logrotate
:sudo apt install logrotate
/etc/logrotate.d/myapp
:/path/to/app.log {
daily
rotate 7
compress
missingok
notifempty
create 640 root adm
}
sudo logrotate -vf /etc/logrotate.d/myapp
若需将Golang日志接入系统日志(如 journalctl
):
syslog
(以logrus为例):import (
"github.com/sirupsen/logrus"
"gopkg.in/gemnasium/logrus-airbrake-hook.v2" // 可选:集成第三方服务
)
func main() {
hook, err := logrus_syslog.NewSyslogHook("udp", "localhost:514", logrus.LOG_INFO, "myapp")
if err == nil {
logrus.AddHook(hook)
}
logrus.Info("This log will be sent to syslog.")
}
journalctl
查看日志:sudo journalctl -u myapp -f
rotate
、compress
)。参考来源: