发布于2026-07-07 阅读(0)
扫一扫,手机访问
在Golang的实际开发中,日志与数据库的配合往往被低估——很多人觉得“把日志写到文件里就行了”,但真正遇到线上问题排查时,才发现分散的日志文件简直是一场噩梦。把日志直接存入数据库,不仅能实现集中查询,还能结合时间、级别、关键字做多维分析,这才是现代应用运维的硬核玩法。下面我们就用一个具体的例子,把logrus和MySQL串起来,看看这件事到底怎么落地。

先搞定依赖。两个库必须装上:
go get github.com/sirupsen/logrus
go get github.com/go-sql-driver/mysql
然后,打开编辑器,新建一个 main.go,把下面的代码贴进去(注意替换数据库连接信息)。
package main
import (
"database/sql"
"fmt"
"github.com/sirupsen/logrus"
_ "github.com/go-sql-driver/mysql"
)
func initLogger() {
logrus.SetFormatter(&logrus.JSONFormatter{})
logrus.SetLevel(logrus.DebugLevel)
}
func initDB() (*sql.DB, error) {
db, err := sql.Open("mysql", "username:password@tcp(localhost:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local")
if err != nil {
return nil, err
}
err = db.Ping()
if err != nil {
return nil, err
}
logrus.Infof("Connected to the database: %s", db.DSN())
return db, nil
}
func main() {
initLogger()
db, err := initDB()
if err != nil {
logrus.Fatalf("Failed to connect to the database: %v", err)
}
defer db.Close()
// 示例:将日志记录到数据库
query := `INSERT INTO logs (message, level, created_at) VALUES (?, ?, NOW())`
stmt, err := db.Prepare(query)
if err != nil {
logrus.Fatalf("Failed to prepare statement: %v", err)
}
defer stmt.Close()
logrus.WithFields(logrus.Fields{
"message": "This is an info log",
"level": "info",
}).Info("Logging to database")
logrus.WithFields(logrus.Fields{
"message": "This is a warning log",
"level": "warn",
}).Warn("Logging to database")
logrus.WithFields(logrus.Fields{
"message": "This is an error log",
"level": "error",
}).Error("Logging to database")
}
流程很清晰:先初始化logrus,设置JSON格式和Debug级别;接着连接MySQL,顺便检查下连通性;然后准备一条INSERT语句,把日志的message、level和创建时间写进去。最后,分别用Info、Warn、Error三个级别各写一条日志,看看效果。
需要注意的地方有两处。第一,数据库连接字符串里的用户名、密码、地址、库名,务必换成你自己的真实信息。第二,数据库里要提前建好表,表名和字段名跟上边的SQL对上。比如建表语句可以这样:
CREATE TABLE logs (
id INT AUTO_INCREMENT PRIMARY KEY,
message TEXT,
level VARCHAR(16),
created_at DATETIME
);
跑起来之后,去数据库里查一下,你大概会看到这样一张表:
+----------------------------------+----------+---------------------+
| message | level | created_at |
+----------------------------------+----------+---------------------+
| This is an info log | info | 2022-01-01 00:00:00 |
| This is a warning log | warn | 2022-01-01 00:00:00 |
| This is an error log | error | 2022-01-01 00:00:00 |
+----------------------------------+----------+---------------------+
这样一来,Golang应用里的每一条日志都变成了数据库里的一条记录。通过SQL查询,你可以按时间范围、按级别过滤,甚至对接上Grafana、Kibana做可视化。这可比翻日志文件爽多了。
当然,这只是一个入门示例。生产环境中你还得考虑日志写入的性能、异步写入、批量插入、日志轮转策略等等。不过,先把这条路打通,后面的事情就好办了。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8