商城首页欢迎来到中国正版软件门户

您的位置: 首页 > 文章列表 > 编程开发 > Golang日志如何与数据库结合使用

Golang日志如何与数据库结合使用

  发布于2026-07-07 阅读(0)

扫一扫,手机访问

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

Golang日志如何与数据库结合使用

先搞定依赖。两个库必须装上:

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做可视化。这可比翻日志文件爽多了。

当然,这只是一个入门示例。生产环境中你还得考虑日志写入的性能、异步写入、批量插入、日志轮转策略等等。不过,先把这条路打通,后面的事情就好办了。

本文转载于:https://www.yisu.com/ask/8567012.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注