From 95ce47a4063b53b5b4caba20d57891bde16d9b9c Mon Sep 17 00:00:00 2001 From: Habib Fatkhul Rohman Date: Tue, 9 Dec 2025 11:28:20 +0700 Subject: [PATCH] feat: implement ReadAppLog and ReadQueryLog methods in MonitoringController and update routes --- .../controller/monitor_controller.go | 115 ++++++++++++++++++ modules/monitoring/routes.go | 3 + 2 files changed, 118 insertions(+) diff --git a/modules/monitoring/controller/monitor_controller.go b/modules/monitoring/controller/monitor_controller.go index 452ff5c..b6f5a19 100644 --- a/modules/monitoring/controller/monitor_controller.go +++ b/modules/monitoring/controller/monitor_controller.go @@ -4,6 +4,7 @@ import ( "net/http" "os" "strings" + "time" "github.com/gin-gonic/gin" ) @@ -11,10 +12,124 @@ import ( type MonitoringController interface { HealthCheck(ctx *gin.Context) ReadErrorLog(ctx *gin.Context) + ReadQueryLog(ctx *gin.Context) + ReadAppLog(ctx *gin.Context) } type monitoringController struct{} +// ReadAppLog implements MonitoringController. +func (c *monitoringController) ReadAppLog(ctx *gin.Context) { + // Ambil query param 'month', default ke bulan sekarang jika tidak ada + month := ctx.Query("month") + if month == "" { + month = time.Now().Format("January") // contoh: "December" + } else { + // Pastikan format bulan sesuai dengan nama bulan bahasa Inggris + // Misal: "december" -> "December" + month = strings.Title(strings.ToLower(month)) + } + + logFile := strings.ToLower(month) + "_app.log" // contoh: "december_app.log" + + // Cari file log di beberapa lokasi + locations := []string{ + "config/logs/query_log/" + logFile, // lokasi log sesuai permintaan + "./logs/" + logFile, + "/tmp/" + logFile, + "/var/log/" + logFile, + "./" + logFile, + } + + var content string + var found bool + + for _, location := range locations { + if data, err := os.ReadFile(location); err == nil { + content = string(data) + found = true + break + } + } + + if !found { + ctx.JSON(http.StatusNotFound, gin.H{ + "error": "App log file not found", + }) + return + } + + // Return sebagai plain text atau JSON + if strings.Contains(ctx.GetHeader("Accept"), "application/json") { + lines := strings.Split(strings.ReplaceAll(content, "\r\n", "\n"), "\n") + if len(lines) > 0 && lines[len(lines)-1] == "" { + lines = lines[:len(lines)-1] + } + ctx.JSON(http.StatusOK, gin.H{ + "log_entries": lines, + "total_lines": len(lines), + }) + } else { + ctx.Data(http.StatusOK, "text/plain; charset=utf-8", []byte(content)) + } +} + +// ReadQueryLog implements MonitoringController. +func (c *monitoringController) ReadQueryLog(ctx *gin.Context) { + // Ambil query param 'month', default ke bulan sekarang jika tidak ada + month := ctx.Query("month") + if month == "" { + month = time.Now().Format("January") // contoh: "December" + } else { + // Pastikan format bulan sesuai dengan nama bulan bahasa Inggris + // Misal: "december" -> "December" + month = strings.Title(strings.ToLower(month)) + } + + logFile := strings.ToLower(month) + "_query.log" // contoh: "december_query.log" + + // Lokasi file log + locations := []string{ + "config/logs/query_log/" + logFile, + "./logs/" + logFile, + "/tmp/" + logFile, + "/var/log/" + logFile, + "./" + logFile, + } + + var content string + var found bool + + for _, location := range locations { + if data, err := os.ReadFile(location); err == nil { + content = string(data) + found = true + break + } + } + + if !found { + ctx.JSON(http.StatusNotFound, gin.H{ + "error": "Query log file not found", + }) + return + } + + // Return sebagai plain text atau JSON + if strings.Contains(ctx.GetHeader("Accept"), "application/json") { + lines := strings.Split(strings.ReplaceAll(content, "\r\n", "\n"), "\n") + if len(lines) > 0 && lines[len(lines)-1] == "" { + lines = lines[:len(lines)-1] + } + ctx.JSON(http.StatusOK, gin.H{ + "log_entries": lines, + "total_lines": len(lines), + }) + } else { + ctx.Data(http.StatusOK, "text/plain; charset=utf-8", []byte(content)) + } +} + func NewMonitoringController() MonitoringController { return &monitoringController{} } diff --git a/modules/monitoring/routes.go b/modules/monitoring/routes.go index 5b2833b..240900e 100644 --- a/modules/monitoring/routes.go +++ b/modules/monitoring/routes.go @@ -13,5 +13,8 @@ func RegisterRoutes(server *gin.Engine) { { monitoring.GET("/health", monitoringController.HealthCheck) monitoring.GET("/errors", monitoringController.ReadErrorLog) + // get log query_log and app_log + monitoring.GET("/logs/query", monitoringController.ReadQueryLog) + monitoring.GET("/logs/app", monitoringController.ReadAppLog) } }