结构化日志(如JSON格式)能提升日志的可读性与可分析性,便于后续用工具过滤、聚合。推荐使用zap(高性能)或logrus(易扩展)第三方库,避免标准库log的结构化能力不足问题。
WithFields添加上下文信息(如请求ID、模块名),便于快速定位问题模块。package main
import (
"go.uber.org/zap"
)
func main() {
logger, _ := zap.NewProduction()
defer logger.Sync()
logger.Info("User login success",
zap.String("userID", "123"),
zap.String("ip", "192.168.1.1"),
)
}
package main
import (
"github.com/sirupsen/logrus"
"os"
)
func main() {
logger := logrus.New()
logger.SetFormatter(&logrus.JSONFormatter{})
logger.SetOutput(os.Stdout)
logger.WithFields(logrus.Fields{
"module": "auth",
"status": "success",
}).Info("User logged in")
}
使用tail命令实时监控日志文件的最新内容,结合grep过滤关键信息(如ERROR级别、特定模块),快速缩小问题范围。
tail -f /var/log/golang-app.log
grep "ERROR" /var/log/golang-app.log
awk提取特定时间段日志(如2025-10-31 14:00至15:00):awk '/2025-10-31 14:00:00/,/2025-10-31 15:00:00/' /var/log/golang-app.log
当日志文件过大时,使用logrotate工具自动切割、压缩归档旧日志,防止占用过多磁盘空间(如CentOS默认日志目录/var/log空间耗尽)。
/etc/logrotate.d/golang-app中添加以下配置(按天切割,保留7天,压缩旧日志):/var/log/golang-app.log {
daily
rotate 7
compress
missingok
notifempty
create 0640 root root
}
sudo logrotate -f /etc/logrotate.d/golang-app
通过Prometheus+Grafana搭建日志监控体系,收集Golang应用的日志指标(如ERROR日志数量、请求延迟),设置阈值告警(如ERROR日志每分钟超过10条时发送邮件/短信)。
/etc/prometheus/prometheus.yml,添加Golang应用的metrics端点(需在应用中集成Prometheus客户端,如prometheus/client_golang):scrape_configs:
- job_name: 'golang-app'
static_configs:
- targets: ['localhost:9090'] # 应用的metrics端口
当日志信息不足以定位问题(如内存泄漏、死锁)时,使用Delve(Golang专用调试工具)进行代码级调试,逐步执行代码并观察变量状态。
go install github.com/go-delve/delve/cmd/dlv@latest
dlv debug /path/to/your/golang-app
break main.main:在main函数入口设置断点;continue:继续执行程序;next:单步执行(跳过函数调用);print variable:打印变量值(如print userID)。若应用日志无明显错误,需检查系统环境与依赖服务是否正常:
journalctl查看应用所属服务的系统日志(如应用以systemd方式运行),排查系统级错误(如权限不足、端口冲突):journalctl -u your-golang-app.service
top、free -m、df -h分别查看CPU、内存、磁盘空间使用情况,排除资源耗尽导致的故障(如内存泄漏导致OOM)。ping、telnet或nc检查网络连通性,确保依赖服务正常运行(如数据库端口是否可达)。若以上步骤均无法定位问题,需通过代码审查找出潜在bug(如空指针引用、死循环),或回滚到之前的稳定版本(使用Git等版本控制工具),通过对比差异定位引入问题的代码变更。
if err != nil遗漏)。git checkout <stable-commit-hash> # 回滚到指定提交
go build && ./your-golang-app # 重新编译运行