Skip to content

Commit

Permalink
feat: log
Browse files Browse the repository at this point in the history
  • Loading branch information
labasubagia committed Sep 14, 2023
1 parent 7e90894 commit 483246d
Show file tree
Hide file tree
Showing 23 changed files with 269 additions and 73 deletions.
1 change: 1 addition & 0 deletions .env.example
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
ENVIRONMENT=development # production
POSTGRES_SOURCE=postgres://postgres:postgres@0.0.0.0:5432/realworld?sslmode=disable
POSTGRES_MIGRATION_URL=file://internal/adapter/repository/sql/db/migration
MONGO_SOURCE=mongodb://root:root@0.0.0.0:27017/realworld?authSource=admin
Expand Down
1 change: 1 addition & 0 deletions .env.test
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
ENVIRONMENT=development
POSTGRES_SOURCE=postgres://postgres:postgres@0.0.0.0:5432/realworld?sslmode=disable
POSTGRES_MIGRATION_URL=file://../../../internal/adapter/repository/sql/db/migration
MONGO_SOURCE=mongodb://root:root@0.0.0.0:27017/realworld?authSource=admin
Expand Down
4 changes: 3 additions & 1 deletion .vscode/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
"jackc",
"labasubagia",
"mapstructure",
"Msgf",
"notnull",
"nullzero",
"oklog",
Expand All @@ -22,7 +23,8 @@
"stretchr",
"Upsert",
"uptrace",
"writeconcern"
"writeconcern",
"zerolog"
],
"go.testFlags": [
"-count=1"
Expand Down
6 changes: 4 additions & 2 deletions cmd/root.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
package cmd

import (
"log"
"fmt"
"os"

"github.com/labasubagia/realworld-backend/internal/core/util"
"github.com/spf13/cobra"
Expand All @@ -20,7 +21,8 @@ func init() {

config, err = util.LoadConfig(".env")
if err != nil {
log.Fatal("failed to load env config", err)
fmt.Fprintf(os.Stderr, "failed to load env config: %s", err)
os.Exit(1)
}
}

Expand Down
24 changes: 14 additions & 10 deletions cmd/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@ package cmd

import (
"fmt"
"log"
"strings"

"github.com/labasubagia/realworld-backend/internal/adapter/handler/restful"
"github.com/labasubagia/realworld-backend/internal/adapter/logger"
"github.com/labasubagia/realworld-backend/internal/adapter/repository"
"github.com/labasubagia/realworld-backend/internal/core/service"
"github.com/spf13/cobra"
Expand All @@ -29,35 +29,39 @@ var serverCmd = &cobra.Command{
Long: "Run gin server restful API",
Run: func(cmd *cobra.Command, args []string) {

logger := logger.NewLogger(config)

port, err := cmd.Flags().GetInt("port")
if err != nil {
log.Fatal("failed get port flag", err)
logger.Fatal().Err(err).Msg("failed to get flag port")
}
config.HTTPServerPort = port

dbType, err := cmd.Flags().GetString("database")
if err != nil {
log.Fatal("failed get database flag", err)
logger.Fatal().Err(err).Msg("failed to get flag database")
}
dbType = strings.ToLower(dbType)

newRepo, exist := repository.RepoFnMap[dbType]
if !exist {
log.Fatal("invalid database", dbType)
fmt.Println()
logger.Fatal().Err(err).Msg("failed to get flag port")
}

repo, err := newRepo(config)
repo, err := newRepo(config, logger)
if err != nil {
log.Fatal("failed to load repository", err)
logger.Fatal().Err(err).Msg("failed to load repository")
}
service, err := service.NewService(config, repo)

service, err := service.NewService(config, repo, logger)
if err != nil {
log.Fatal("failed to load service", err)
logger.Fatal().Err(err).Msg("failed to load service")
}
server := restful.NewServer(config, service)

server := restful.NewServer(config, service, logger)
if server.Start(); err != nil {
log.Fatal("failed to load server", err)
logger.Fatal().Err(err).Msg("failed to load service")
}
},
}
3 changes: 1 addition & 2 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@ require (
github.com/bytedance/sonic v1.10.0 // indirect
github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect
github.com/chenzhuoyu/iasm v0.9.0 // indirect
github.com/fatih/color v1.15.0 // indirect
github.com/fsnotify/fsnotify v1.6.0 // indirect
github.com/gabriel-vasile/mimetype v1.4.2 // indirect
github.com/gin-contrib/sse v0.1.0 // indirect
Expand Down Expand Up @@ -74,10 +73,10 @@ require (
github.com/jinzhu/inflection v1.0.0 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/rogpeppe/go-internal v1.11.0 // indirect
github.com/rs/zerolog v1.30.0
github.com/spf13/cobra v1.7.0
github.com/spf13/viper v1.16.0
github.com/tmthrgd/go-hex v0.0.0-20190904060850-447a3041c3bc // indirect
github.com/uptrace/bun/extra/bundebug v1.1.14
github.com/vmihailenco/msgpack/v5 v5.3.5 // indirect
github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect
golang.org/x/sys v0.12.0 // indirect
Expand Down
11 changes: 7 additions & 4 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
Expand All @@ -83,8 +84,6 @@ github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1m
github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po=
github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs=
github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw=
github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY=
github.com/frankban/quicktest v1.14.4/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=
github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY=
Expand Down Expand Up @@ -118,6 +117,7 @@ github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/me
github.com/goccy/go-json v0.9.7/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU=
github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
github.com/golang-migrate/migrate/v4 v4.16.2 h1:8coYbMKUyInrFk1lfGfRovTLAW7PhWp8qQDT2iKfuoA=
Expand Down Expand Up @@ -236,6 +236,7 @@ github.com/lib/pq v1.10.2 h1:AqzbZs4ZoCBp+GtejcpCpcxM3zlSMx29dXbUSeVtJb8=
github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY=
github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0=
github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
Expand Down Expand Up @@ -276,6 +277,9 @@ github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTE
github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE=
github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M=
github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA=
github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=
github.com/rs/zerolog v1.30.0 h1:SymVODrcRsaRaSInD9yQtKbtWqwsfoPcRff/oRXLj4c=
github.com/rs/zerolog v1.30.0/go.mod h1:/tk+P47gFdPXq4QYjvCmT5/Gsug2nagsFWBWhAiSi1w=
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/sirupsen/logrus v1.9.2 h1:oxx1eChJGI6Uks2ZC4W1zpLlVgqB8ner4EuQwV4Ik1Y=
github.com/sirupsen/logrus v1.9.2/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
Expand Down Expand Up @@ -322,8 +326,6 @@ github.com/uptrace/bun v1.1.14 h1:S5vvNnjEynJ0CvnrBOD7MIRW7q/WbtvFXrdfy0lddAM=
github.com/uptrace/bun v1.1.14/go.mod h1:RHk6DrIisO62dv10pUOJCz5MphXThuOTpVNYEYv7NI8=
github.com/uptrace/bun/dialect/pgdialect v1.1.14 h1:b7+V1KDJPQSFYgkG/6YLXCl2uvwEY3kf/GSM7hTHRDY=
github.com/uptrace/bun/dialect/pgdialect v1.1.14/go.mod h1:v6YiaXmnKQ2FlhRD2c0ZfKd+QXH09pYn4H8ojaavkKk=
github.com/uptrace/bun/extra/bundebug v1.1.14 h1:9OCGfP9ZDlh41u6OLerWdhBtJAVGXHr0xtxO4xWi6t0=
github.com/uptrace/bun/extra/bundebug v1.1.14/go.mod h1:lto3guzS2v6mnQp1+akyE+ecBLOltevDDe324NXEYdw=
github.com/vmihailenco/msgpack/v5 v5.3.5 h1:5gO0H1iULLWGhs2H5tbAHIZTV8/cYafcFOr9znI5mJU=
github.com/vmihailenco/msgpack/v5 v5.3.5/go.mod h1:7xyJ9e+0+9SaZT0Wt1RGleJXzli6Q/V5KbhBonMG9jc=
github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAhO7/IwNM9g=
Expand Down Expand Up @@ -493,6 +495,7 @@ golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
Expand Down
4 changes: 2 additions & 2 deletions internal/adapter/handler/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,6 @@ import (
"github.com/labasubagia/realworld-backend/internal/core/util"
)

func NewServer(config util.Config, service port.Service) port.Server {
return restful.NewServer(config, service)
func NewServer(config util.Config, service port.Service, logger port.Logger) port.Server {
return restful.NewServer(config, service, logger)
}
37 changes: 37 additions & 0 deletions internal/adapter/handler/restful/logger.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package restful

import (
"io"
"net/http"
"time"

"github.com/gin-gonic/gin"
)

func (s *Server) Logger() gin.HandlerFunc {
return func(c *gin.Context) {
// process request
startTime := time.Now()
c.Next()
duration := time.Since(startTime)

// log
logger := s.logger.Info()
if c.Writer.Status() >= 500 {
logger = s.logger.Error()
if c.Request != nil && c.Request.Body != nil {
if body, err := io.ReadAll(c.Request.Body); err == nil {
logger.Field("body", body)
}
}
}
logger.
Field("protocol", "http").
Field("method", c.Request.Method).
Field("path", c.Request.URL.Path).
Field("status_code", c.Writer.Status()).
Field("status", http.StatusText(c.Writer.Status())).
Field("duration", duration).
Msg("received http request")
}
}
4 changes: 2 additions & 2 deletions internal/adapter/handler/restful/middleware.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,9 @@ const (
authorizationArgKey = "authorization_arg"
)

func (s *Server) AuthMiddleware(autoDenied bool) gin.HandlerFunc {
func (server *Server) AuthMiddleware(autoDenied bool) gin.HandlerFunc {
return func(c *gin.Context) {
authArg, err := s.parseToken(c)
authArg, err := server.parseToken(c)
if err != nil {
if autoDenied {
errorHandler(c, err)
Expand Down
20 changes: 11 additions & 9 deletions internal/adapter/handler/restful/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ package restful
import (
"context"
"fmt"
"log"
"net/http"
"os"
"os/signal"
Expand All @@ -20,21 +19,24 @@ type Server struct {
config util.Config
router *gin.Engine
service port.Service
logger port.Logger
}

func NewServer(config util.Config, service port.Service) port.Server {
func NewServer(config util.Config, service port.Service, logger port.Logger) port.Server {
server := &Server{
config: config,
service: service,
logger: logger,
}
server.setupRouter()
return server
}

func (server *Server) setupRouter() {

router := gin.Default()
router.Use(cors.Default())
gin.SetMode(gin.ReleaseMode)
router := gin.New()
router.Use(server.Logger(), gin.Recovery(), cors.Default())

router.GET("/", func(ctx *gin.Context) {
ctx.JSON(http.StatusOK, gin.H{"message": "Hello World!"})
Expand Down Expand Up @@ -85,27 +87,27 @@ func (server *Server) Start() error {

go func() {
if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
log.Fatalf("listen: %s\n", err)
server.logger.Fatal().Err(err).Msg("failed listen")
}
}()

quit := make(chan os.Signal)
signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
<-quit
log.Printf("Shutdown server...")
server.logger.Info().Msg("shutdown server...")

ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()

if err := srv.Shutdown(ctx); err != nil {
log.Fatal("Server shutdown:", err)
server.logger.Fatal().Err(err).Msg("failed shutdown server")
}

select {
case <-ctx.Done():
log.Println("timeout of 5 seconds")
server.logger.Info().Msg("timeout in 5 seconds")
}
log.Println("Server existing")
server.logger.Info().Msg("server exiting")

return nil
}
10 changes: 10 additions & 0 deletions internal/adapter/logger/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package logger

import (
"github.com/labasubagia/realworld-backend/internal/core/port"
"github.com/labasubagia/realworld-backend/internal/core/util"
)

func NewLogger(config util.Config) port.Logger {
return NewZeroLogLogger(config)
}
67 changes: 67 additions & 0 deletions internal/adapter/logger/zerolog.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
package logger

import (
"fmt"
"os"
"time"

"github.com/labasubagia/realworld-backend/internal/core/port"
"github.com/labasubagia/realworld-backend/internal/core/util"
"github.com/rs/zerolog"
)

type zeroLogLogger struct {
log zerolog.Logger
event *zerolog.Event
}

func NewZeroLogLogger(config util.Config) port.Logger {
logger := zerolog.New(os.Stderr)
if !config.IsProduction() {
output := zerolog.ConsoleWriter{Out: os.Stderr, TimeFormat: time.RFC3339}
logger = zerolog.New(output).With().Timestamp().Logger()
}
return &zeroLogLogger{
log: logger,
event: logger.Info(),
}
}

// Log Level

func (l *zeroLogLogger) Info() port.Logger {
l.event = l.log.Info()
return l
}

func (l *zeroLogLogger) Error() port.Logger {
l.event = l.log.Error()
return l
}

func (l *zeroLogLogger) Fatal() port.Logger {
l.event = l.log.Fatal()
return l
}

// Set Attributes

func (l *zeroLogLogger) Err(err error) port.Logger {
l.event = l.event.Err(err)
return l
}

func (l *zeroLogLogger) Field(key string, value any) port.Logger {
l.event = l.event.Any(key, value)
return l
}

// Send

func (l *zeroLogLogger) Msg(v ...any) {
l.event.Msg(fmt.Sprint(v...))
}

func (l *zeroLogLogger) Msgf(format string, v ...any) {
l.event.Msgf(format, v...)
}
Loading

0 comments on commit 483246d

Please sign in to comment.