在 CentOS 上做 Golang 项目的日志管理,其实有不少成熟的套路。下面梳理了几个最常用的方法,从轻量到重型,按需选择就好。

-
直接用标准库
log包
Golang 自带的log包虽然简单,但对于很多场景完全够用。比如,你只需要往标准输出写日志,或者想快速调试,它是最轻量的选择。示例:package main import ( "log" "os" ) func main() { log.SetOutput(os.Stdout) log.Println("Hello, World!") } -
引入第三方日志库,比如 logrus 或 zap
如果标准库满足不了你对日志级别、格式化、结构化输出的需求,那第三方库就是好帮手。以logrus为例,先安装:go get github.com/sirupsen/logrus然后在代码里用起来:
package main import ( "github.com/sirupsen/logrus" ) func main() { logrus.SetFormatter(&logrus.TextFormatter{ FullTimestamp: true, }) logrus.Info("Hello, World!") }这类库自带字段、钩子、格式化扩展,生产环境里用得最多。
-
日志轮转,别让日志撑爆磁盘
不管用哪个库,日志文件总会越攒越大。Linux 下最省事的方案就是logrotate。前提是日志文件名里包含日期或时间戳(或者按大小切分),这样logrotate才能准确识别。写一个配置文件,比如
/etc/logrotate.d/myapp:/path/to/your/logs/*.log { daily rotate 7 compress missingok notifempty create 0640 root root }配置的意思是:每天轮转一次,保留最近7天的日志,旧日志压缩起来,不存在的问题不报错,空的日志文件不处理,轮转后重新创建一个权限为0640的文件。直接扔到
/etc/logrotate.d/目录下,系统就会自动执行。 -
集中式日志管理,适合多机协作
当项目扩展到多台服务器,分散的日志会让问题排查变得头疼。这时候搭建一套集中式日志系统就比较实用。常见的方案有 ELK(Elasticsearch + Logstash + Kibana)和 EFK(Elasticsearch + Fluentd + Kibana)。思路很简单:在 CentOS 上装好 Elasticsearch、Logstash 或 Fluentd、Kibana,然后调整 Golang 项目的日志输出,让它把日志发给集中式系统。比如用 logrus 配合 Elasticsearch 客户端:
package main import ( "github.com/sirupsen/logrus" "github.com/elastic/go-elasticsearch/v7" "github.com/elastic/go-elasticsearch/v7/client" ) func main() { es, err := client.NewDefaultClient() if err != nil { logrus.Fatal(err) } logrus.SetFormatter(&logrus.JSONFormatter{}) logrus.Info("Hello, World!") // Send log to Elasticsearch req := esapi.IndexRequest{ Index: "myapp-logs", DocumentID: "1", Body: strings.NewReader(`{"message": "Hello, World!"}`), } res, err := req.Do(context.Background(), es) if err != nil { logrus.Fatal(err) } defer res.Body.Close() if res.IsError() { logrus.Errorf("Error indexing log: %s", res.String()) } else { logrus.Info("Log indexed successfully") } }这样每个应用实例的日志都会进入 Elasticsearch,再通过 Kibana 做可视化或搜索,效率会高很多。
以上四种方案,从个人开发到企业集群基本都能覆盖。选哪一种,主要看你的项目规模、运维要求以及团队习惯。小项目标准库 + logrotate 就够,中大型项目不妨试试 logrus 加集中式日志,收益相当明显。