Skip to content
Snippets Groups Projects
Commit 00387092 authored by Tucker Gary Siegel's avatar Tucker Gary Siegel
Browse files

custom logging

parent f2ddc772
No related branches found
No related tags found
No related merge requests found
app: app:
name: dawn-server name: dawn-server
# logType: json
server: server:
host: "localhost" host: "localhost"
...@@ -8,4 +9,4 @@ server: ...@@ -8,4 +9,4 @@ server:
db: db:
uri: "mongodb://127.0.0.1:27017/" uri: "mongodb://127.0.0.1:27017/"
database: "weather-service" database: "weather-service"
\ No newline at end of file
package errors package errors
import ( import (
"encoding/json"
"fmt" "fmt"
"log"
"os" "os"
"strconv" "strconv"
...@@ -17,7 +17,7 @@ type BaseError interface { ...@@ -17,7 +17,7 @@ type BaseError interface {
type DawnError struct { type DawnError struct {
Name string `json:"name"` Name string `json:"name"`
Description string `json:"description"` Description string `json:"description"`
LogDetails string `json:"log_details,omitempty"` LogDetails string `json:"log_details"`
Code int `json:"code"` Code int `json:"code"`
} }
...@@ -33,7 +33,11 @@ type StandardError struct { ...@@ -33,7 +33,11 @@ type StandardError struct {
} }
func (err *DawnError) Error() string { func (err *DawnError) Error() string {
return err.Name + ": " + err.Description str := err.Name + ": " + err.Description
if err.LogDetails != "" {
str += " - " + err.LogDetails
}
return str
} }
func (err *DawnError) BuildStandardError(ctx *fiber.Ctx) StandardError { func (err *DawnError) BuildStandardError(ctx *fiber.Ctx) StandardError {
...@@ -47,13 +51,27 @@ func (err *DawnError) AddLogDetails(logDetails string) *DawnError { ...@@ -47,13 +51,27 @@ func (err *DawnError) AddLogDetails(logDetails string) *DawnError {
return err return err
} }
func (err *StandardError) LogJson() { func Build(err error) *DawnError {
log.Println(err) return &DawnError{
Name: "INTERNAL_SERVER_ERROR",
Description: err.Error(),
Code: 500,
}
}
func (err *DawnError) LogJson(c *fiber.Ctx) {
jsonErrBytes, _ := json.Marshal(err)
fmt.Println(string(jsonErrBytes))
} }
func (err *DawnError) LogString(c *fiber.Ctx) { func (err *DawnError) LogString(c *fiber.Ctx) {
requestId := c.Locals("requestId") requestId := c.Locals("requestId")
output := strconv.Itoa(os.Getpid()) + " " + fmt.Sprintf("%s", requestId) + " " + strconv.Itoa(err.Code) + " - " + c.Method() + " " + c.Route().Path + " - " + err.Error() + " - " + err.LogDetails // requestBody := c.Request()
// requestBodyStr, _ := json.Marshal(requestBody)
output := strconv.Itoa(os.Getpid()) + " " + fmt.Sprintf("%s", requestId) + " " + strconv.Itoa(err.Code) + " - " + c.Method() + " " + c.Route().Path + " - " + err.Error()
if err.LogDetails != "" {
output += " - " + err.LogDetails
}
fmt.Println(output) fmt.Println(output)
} }
...@@ -78,8 +96,21 @@ var NO_DATA_FOUND = &DawnError{ ...@@ -78,8 +96,21 @@ var NO_DATA_FOUND = &DawnError{
} }
// 500s // 500s
var INTERNAL_SERVER_STANDARD_ERROR = &DawnError{
Name: "INTERNAL_SERVER_ERROR",
Description: "Unkown internal server error occurred",
Code: 500,
}
var DATE_PARSE_FAILURE = &DawnError{ var DATE_PARSE_FAILURE = &DawnError{
Name: "DATE_PARSE_FAILURE", Name: "DATE_PARSE_FAILURE",
Description: "Date parse failure", Description: "Date parse failure",
Code: 500, Code: 500,
} }
var FILE_CREATION_ERROR = &DawnError{
Name: "FILE_CREATION_ERROR",
Description: "Could not create file",
Code: 500,
}
package logger
import (
"dawn-weather/errors"
"encoding/json"
"fmt"
"os"
"strconv"
"time"
"github.com/gofiber/fiber/v2"
"github.com/spf13/viper"
"github.com/valyala/fasthttp"
)
type LogMessage struct {
Date string
PID string
RequestId string
Error *errors.DawnError
StatusCode string
Method string
Path string
}
type Request struct {
Headers fasthttp.RequestHeader
}
func cleanRequest(c *fiber.Ctx, r *fasthttp.Request) Request {
headers := fasthttp.AcquireRequest().Header
r.Header.CopyTo(&headers)
fmt.Println(headers.String())
return Request{
Headers: headers,
}
}
func BuildMessage(c *fiber.Ctx) LogMessage {
const layout = "2006-01-02 03:04:05"
requestId := c.Locals("requestId")
message := LogMessage{
Date: time.Now().UTC().Format(layout),
RequestId: fmt.Sprintf("%s", requestId),
StatusCode: strconv.Itoa(c.Response().StatusCode()),
Method: c.Method(),
Path: c.Route().Path,
PID: strconv.Itoa(os.Getpid()),
}
return message
}
func Log(message LogMessage) {
logString := ""
if viper.GetString("app.logType") == "json" {
tempLogString, _ := json.MarshalIndent(message, "", " ")
logString = string(tempLogString)
} else {
logString = fmt.Sprintf("%s %s %s %s - %s %s", message.Date, message.PID, message.RequestId, message.StatusCode, message.Method, message.Path) //strconv.Itoa(os.Getpid()) + " " + fmt.Sprintf("%s", requestId) + " " + strconv.Itoa(err.Code) + " - " + c.Method() + " " + c.Route().Path + " - " + err.Error()
if message.Error != nil {
logString += " - " + message.Error.Error()
}
}
fmt.Println(logString)
}
func New() fiber.Handler {
return func(c *fiber.Ctx) error {
errHandler := c.App().Config().ErrorHandler
chainErr := c.Next()
message := BuildMessage(c)
if chainErr != nil {
dawnError := ErrorHandler(c, chainErr)
message.Error = dawnError
}
Log(message)
if chainErr != nil {
if err := errHandler(c, chainErr); err != nil {
_ = c.SendStatus(fiber.StatusInternalServerError)
}
}
return nil
}
}
func ErrorHandler(ctx *fiber.Ctx, err error) *errors.DawnError {
var returnError *errors.DawnError
if e, ok := err.(*errors.DawnError); ok {
returnError = e
} else {
returnError = errors.Build(err)
}
return returnError
}
...@@ -3,14 +3,14 @@ package main ...@@ -3,14 +3,14 @@ package main
import ( import (
"dawn-weather/config" "dawn-weather/config"
"dawn-weather/errors" "dawn-weather/errors"
"dawn-weather/logger"
"dawn-weather/persistence" "dawn-weather/persistence"
"fmt" "strconv"
"github.com/ansrivas/fiberprometheus/v2" "github.com/ansrivas/fiberprometheus/v2"
swagger "github.com/arsmn/fiber-swagger/v2" swagger "github.com/arsmn/fiber-swagger/v2"
"github.com/gofiber/fiber/v2" "github.com/gofiber/fiber/v2"
"github.com/gofiber/fiber/v2/middleware/cors" "github.com/gofiber/fiber/v2/middleware/cors"
"github.com/gofiber/fiber/v2/middleware/logger"
"github.com/gofiber/fiber/v2/middleware/recover" "github.com/gofiber/fiber/v2/middleware/recover"
"github.com/gofiber/fiber/v2/middleware/requestid" "github.com/gofiber/fiber/v2/middleware/requestid"
"github.com/gofiber/fiber/v2/utils" "github.com/gofiber/fiber/v2/utils"
...@@ -46,9 +46,17 @@ func registerLogging(app *fiber.App) { ...@@ -46,9 +46,17 @@ func registerLogging(app *fiber.App) {
ContextKey: "requestId", ContextKey: "requestId",
})) }))
app.Use(logger.New(logger.Config{ // app.Use(logger.New(logger.Config{
Format: "${pid} ${locals:requestId} ${status} - ${method} ${path}\n", // Format: "${pid} ${locals:requestId} ${status} - ${method} ${path}\n",
})) // }))
// app.Use(func(c *fiber.Ctx) error {
// fmt.Println(c.Response().StatusCode())
// fmt.Println("hey!")
// return c.Next()
// })
app.Use(logger.New())
} }
func registerPrometheus(app *fiber.App) { func registerPrometheus(app *fiber.App) {
...@@ -62,17 +70,25 @@ func createFiberConfig() fiber.Config { ...@@ -62,17 +70,25 @@ func createFiberConfig() fiber.Config {
ErrorHandler: func(ctx *fiber.Ctx, err error) error { ErrorHandler: func(ctx *fiber.Ctx, err error) error {
code := fiber.StatusInternalServerError code := fiber.StatusInternalServerError
message := errors.StandardError{Source: viper.GetString("app.name"), ErrorCode: "UNKNOWN_ERROR", message := errors.StandardError{Source: viper.GetString("app.name"), ErrorCode: "INTERNAL_SERVER",
Description: "Unknown error occurred", Details: errors.ErrorDetails{RequestId: ""}} Description: "Internal Server Error Occurred", Details: errors.ErrorDetails{RequestId: ""}}
if e, ok := err.(*errors.DawnError); ok { if e, ok := err.(*errors.DawnError); ok {
code = e.Code code = e.Code
message = err.(*errors.DawnError).BuildStandardError(ctx) message = err.(*errors.DawnError).BuildStandardError(ctx)
err.(*errors.DawnError).LogString(ctx)
} else { } else {
fmt.Println(err) err = errors.Build(err)
}
logMessage := logger.BuildMessage(ctx)
logMessage.Error = err.(*errors.DawnError)
logMessage.StatusCode = strconv.Itoa(code)
logger.Log(logMessage)
if code == 500 {
message = errors.INTERNAL_SERVER_STANDARD_ERROR.BuildStandardError(ctx)
} }
// message.LogJson()
err = ctx.Status(code).JSON(message) err = ctx.Status(code).JSON(message)
......
...@@ -107,11 +107,3 @@ func (r CSVRequest) Build(c *fiber.Ctx) CSVRequest { ...@@ -107,11 +107,3 @@ func (r CSVRequest) Build(c *fiber.Ctx) CSVRequest {
return newRequest return newRequest
} }
// func (r GddRequest) BuildLocation() entities.Location {
// l := entities.Location{
// Type: "Point",
// Coordinates: []float64{r.Longitude, r.Latitude},
// }
// return l
// }
...@@ -430,7 +430,7 @@ func GetDataDownload(request models.CSVRequest) string { ...@@ -430,7 +430,7 @@ func GetDataDownload(request models.CSVRequest) string {
f, err := os.Create(fileId.String() + ".csv") f, err := os.Create(fileId.String() + ".csv")
if err != nil { if err != nil {
panic(errors.BAD_REQUEST) panic(errors.FILE_CREATION_ERROR.AddLogDetails("Could not create file"))
} }
w := csv.NewWriter(f) w := csv.NewWriter(f)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment