Перейти к содержимому

Запись логов в файл

Запись логов в файл необходима для продакшн-приложений, где нужно сохранять историю запросов для отладки, аудита или мониторинга. По умолчанию Gin записывает весь вывод логов в os.Stdout. Вы можете перенаправить его, установив gin.DefaultWriter до создания маршрутизатора.

package main
import (
"io"
"os"
"github.com/gin-gonic/gin"
)
func main() {
// Disable Console Color, you don't need console color when writing the logs to file.
gin.DisableConsoleColor()
// Logging to a file.
f, _ := os.Create("gin.log")
gin.DefaultWriter = io.MultiWriter(f)
// Use the following code if you need to write the logs to file and console at the same time.
// gin.DefaultWriter = io.MultiWriter(f, os.Stdout)
router := gin.Default()
router.GET("/ping", func(c *gin.Context) {
c.String(200, "pong")
})
router.Run(":8080")
}

Запись одновременно в файл и консоль

Функция io.MultiWriter из стандартной библиотеки Go принимает несколько значений io.Writer и дублирует записи во все из них. Это полезно при разработке, когда вы хотите видеть логи в терминале, одновременно сохраняя их на диск:

f, _ := os.Create("gin.log")
gin.DefaultWriter = io.MultiWriter(f, os.Stdout)

При такой настройке каждая запись лога записывается одновременно в gin.log и в консоль.

Ротация логов в продакшне

Пример выше использует os.Create, который обрезает файл логов при каждом запуске приложения. В продакшне обычно нужно дописывать в существующие логи и ротировать файлы по размеру или времени. Рассмотрите использование библиотеки ротации логов, такой как lumberjack:

import "gopkg.in/natefinch/lumberjack.v2"
func main() {
gin.DisableConsoleColor()
gin.DefaultWriter = &lumberjack.Logger{
Filename: "gin.log",
MaxSize: 100, // megabytes
MaxBackups: 3,
MaxAge: 28, // days
}
router := gin.Default()
router.GET("/ping", func(c *gin.Context) {
c.String(200, "pong")
})
router.Run(":8080")
}

Смотрите также