Skip to content

Instantly share code, notes, and snippets.

@febriliankr
Created March 6, 2024 13:11
Show Gist options
  • Save febriliankr/54a7dd98eb88730fa016ba521eae1237 to your computer and use it in GitHub Desktop.
Save febriliankr/54a7dd98eb88730fa016ba521eae1237 to your computer and use it in GitHub Desktop.
Loki Logrus Hook: Error
package server
import (
"context"
"fmt"
"net/http"
"os"
"os/signal"
"path/filepath"
"time"
"github.com/go-playground/validator"
"github.com/labstack/echo/v4"
"github.com/labstack/echo/v4/middleware"
echoLog "github.com/labstack/gommon/log"
"github.com/neko-neko/echo-logrus/v2/log"
"github.com/rifflock/lfshook"
logrusloki "github.com/schoentoon/logrus-loki"
"github.com/sirupsen/logrus"
)
func NewLogrusLogger() (*logrus.Logger, error) {
hook, err := logrusloki.NewLokiDefaults("http://127.0.0.1:3100/loki/api/v1/push")
if err != nil {
return nil, err
}
defer hook.Close()
log := logrus.New()
log.Hooks.Add(lfshook.NewHook(
lfshook.PathMap{
logrus.InfoLevel: filepath.Join(os.TempDir(), "log", "http_info.log"),
logrus.ErrorLevel: filepath.Join(os.TempDir(), "log", "http_error.log"),
logrus.FatalLevel: filepath.Join(os.TempDir(), "log", "http_fatal.log"),
},
&logrus.JSONFormatter{},
))
log.AddHook(hook)
return log, nil
}
// NewServer instantiates new Echo server
func NewServer(cfg config.Config) *echo.Echo {
e := echo.New()
logrusLogger, err := NewLogrusLogger()
if err != nil {
fmt.Println("error initiating loki log hook")
panic(err)
}
e.Use(middlewarex.CORS(), middlewarex.Headers(), middlewarex.Session(cfg), middlewarex.RateLimiter(cfg), middlewarex.Logger(logrusLogger), middleware.Recover(), middleware.RequestID())
e.Pre(middleware.RemoveTrailingSlash())
// Logger https://github.com/neko-neko/echo-logrus
log.Logger().SetOutput(os.Stdout)
log.Logger().SetLevel(echoLog.INFO)
log.Logger().SetFormatter(&logrus.JSONFormatter{
TimestampFormat: time.RFC3339,
})
log.Logger().Hooks.Add(lfshook.NewHook(
lfshook.PathMap{
logrus.InfoLevel: filepath.Join(os.TempDir(), "log", "info.log"),
logrus.ErrorLevel: filepath.Join(os.TempDir(), "log", "error.log"),
logrus.FatalLevel: filepath.Join(os.TempDir(), "log", "fatal.log"),
},
&logrus.JSONFormatter{},
))
e.Logger = log.Logger()
e.Validator = &CustomValidator{V: validator.New()}
customErr := &customErrHandler{e: e}
e.HTTPErrorHandler = customErr.handler
e.Binder = &CustomBinder{b: &echo.DefaultBinder{}}
return e
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment