admin-dashboard-backend/modules/logger/logger.go

272 lines
6.1 KiB
Go

package logger
import (
"encoding/json"
"fmt"
"jannex/admin-dashboard-backend/modules/config"
"os"
"time"
"github.com/gofiber/fiber/v2"
"github.com/rs/zerolog"
"github.com/rs/zerolog/log"
)
func InitLogger() {
zerolog.TimeFieldFormat = zerolog.TimeFormatUnix
if config.Cfg.Debug {
zerolog.SetGlobalLevel(zerolog.DebugLevel)
} else {
zerolog.SetGlobalLevel(zerolog.InfoLevel)
}
if config.Cfg.ColorizedOutput {
log.Logger = log.Output(zerolog.ConsoleWriter{Out: os.Stderr, TimeFormat: "15:04:05"})
}
}
func getTime() string {
return time.Now().Format("15:04:05 02-01-2006") + " "
}
func AddSystemLog(format string, v ...any) {
go LogManagerRequestClient(fiber.MethodPost, config.Cfg.LogManagerServerUrl+"/v1/log", LogManagerRequestBody{
Type: "system",
Logs: []string{"I " + getTime() + fmt.Sprintf(format, v...)}})
}
func AddGroupTasksLog(format string, v ...any) {
go LogManagerRequestClient(fiber.MethodPost, config.Cfg.LogManagerServerUrl+"/v1/log", LogManagerRequestBody{
Type: "grouptasks",
Logs: []string{"I " + getTime() + fmt.Sprintf(format, v...)}})
}
type LogManagerRequestBody struct {
Type string
Logs []string
}
func LogManagerRequestClient(requestMethod string, url string, body interface{}) {
a := fiber.AcquireAgent()
req := a.Request()
req.Header.SetMethod(requestMethod)
req.SetRequestURI(url)
req.Header.SetContentType("application/json")
reqestBodyBytes, err := json.Marshal(body)
if err != nil {
log.Error().Msgf("Failed to marshal request body, err: %s", err)
return
}
req.SetBody(reqestBodyBytes)
if err := a.Parse(); err != nil {
log.Error().Msgf("Failed to parse request, err: %s", err)
return
}
code, body, _ := a.Bytes()
log.Info().Msgf("Log manager request, code: %d, body: %s", code, body)
}
/*
func addLog(logMessage structs.LogMessage, systemLog bool) {
year, month, day := time.Now().Date()
path := config.Cfg.FolderPaths.LogsSystem
if !systemLog {
path = config.Cfg.FolderPaths.LogsGroupTasks
}
f, err := os.OpenFile(path+strconv.Itoa(day)+"-"+strconv.Itoa(int(month))+"-"+strconv.Itoa(year)+".json", os.O_APPEND|os.O_WRONLY|os.O_CREATE, 0644)
if err != nil {
log.Error().Msgf("Failed to open log file %s", err.Error())
return
}
defer f.Close()
logMessage.Time = time.Now()
file, _ := json.Marshal(logMessage)
if _, err = fmt.Fprintln(f, string(file)); err != nil {
log.Error().Msgf("Failed to write to log file %s", err.Error())
}
}
func ReadLogs(date string, systemLogs bool, language string) []structs.LogListMessage {
path := config.Cfg.FolderPaths.LogsSystem
if !systemLogs {
path = config.Cfg.FolderPaths.LogsGroupTasks
}
file, err := os.Open(path + date + ".json")
if err != nil {
log.Error().Msgf("Failed to read log file %s", err.Error())
return nil
}
defer file.Close()
fileScanner := bufio.NewScanner(file)
var logMessages []structs.LogListMessage
for fileScanner.Scan() {
var logMessage structs.LogMessage
if err := json.Unmarshal(fileScanner.Bytes(), &logMessage); err != nil {
log.Error().Msgf("Failed to unmarshal log message %v", err.Error())
}
var languageLogMessages []structs.LanguageLogMessages
if systemLogs {
languageLogMessages = systemLanguageLogMessages
} else {
languageLogMessages = grouptasksLanguageLogMessages
}
logMessages = append(logMessages, getLogMessage(languageLogMessages, logMessage, language))
}
if err := fileScanner.Err(); err != nil {
log.Error().Msgf("Error while reading file: %s", err)
return nil
}
return logMessages
}
func getLogMessage(languageLogMessages []structs.LanguageLogMessages, logMessage structs.LogMessage, language string) structs.LogListMessage {
logListMessage := structs.LogListMessage{
Time: logMessage.Time,
Type: logMessage.Type,
LogData: logMessage.Messages,
}
for _, systemLanguageLogMessage := range languageLogMessages {
if logMessage.Id == systemLanguageLogMessage.Id {
logListMessage.Message = getLogLanguageMessage(systemLanguageLogMessage.Languages, language)
return logListMessage
}
}
return logListMessage
}
func getLogLanguageMessage(languages []structs.LanguageLogMessagesLanguage, language string) string {
englishIndex := 0
for i, l := range languages {
if l.Lang == language {
return l.Message
}
if l.Lang == "en" {
englishIndex = i
}
}
return languages[englishIndex].Message
}
func GetAllLogMessagesDates(systemLogs bool) []string {
path := config.Cfg.FolderPaths.LogsSystem
if !systemLogs {
path = config.Cfg.FolderPaths.LogsGroupTasks
}
files, err := os.ReadDir(path)
if err != nil {
log.Error().Msgf("Failed to read log messages directory %s", err.Error())
return []string{}
}
var dates []string
for _, file := range files {
dates = append(dates, strings.Split(file.Name(), ".")[0])
}
layout := "2-1-2006"
parsedDates := make([]time.Time, len(dates))
for i, dateStr := range dates {
parsedDate, err := time.Parse(layout, dateStr)
if err != nil {
log.Error().Msgf("Failed to parse date %s", err.Error())
return []string{}
}
parsedDates[i] = parsedDate
}
sort.Slice(parsedDates, func(i, j int) bool {
return parsedDates[i].Before(parsedDates[j])
})
sortedDates := []string{}
for _, date := range parsedDates {
sortedDates = append(sortedDates, date.Format(layout))
}
return sortedDates
}
func InitLanguageLogMessages() {
readLanguageLogMessages(true)
readLanguageLogMessages(false)
AddSystemLog(structs.LogMessage{
Id: 8,
Type: utils.LogTypeInfo,
})
AddGroupTasksLog(structs.LogMessage{
Id: 6,
Type: utils.LogTypeInfo,
})
}
func readLanguageLogMessages(systemLogs bool) {
path := config.Cfg.LogLanguageSystem
if !systemLogs {
path = config.Cfg.LogLanguageGroupTasks
}
content, err := os.ReadFile(path)
if err != nil {
panic("Could not read language log messages: " + err.Error())
}
var langLogMessages []structs.LanguageLogMessages
if err = json.Unmarshal(content, &langLogMessages); err != nil {
panic("Failed to unmarshal: " + err.Error())
}
if systemLogs {
systemLanguageLogMessages = langLogMessages
} else {
grouptasksLanguageLogMessages = langLogMessages
}
}
*/