Skip to content

Commit

Permalink
setup logger
Browse files Browse the repository at this point in the history
  • Loading branch information
aradwann committed Jan 6, 2024
1 parent 1c94ad5 commit c9fd98c
Show file tree
Hide file tree
Showing 5 changed files with 87 additions and 27 deletions.
15 changes: 8 additions & 7 deletions db/store/migrate.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ import (
"path/filepath"
"strings"

"log/slog"

"github.com/golang-migrate/migrate/v4"
"github.com/golang-migrate/migrate/v4/database/pgx"
_ "github.com/golang-migrate/migrate/v4/source/file"
Expand All @@ -18,33 +20,33 @@ func RunDBMigrations(db *sql.DB, migrationsURL string) {
driver, err := pgx.WithInstance(db, &pgx.Config{})
if err != nil {
// log.Fatal().Msg("cannot create postgres driver")
fmt.Printf("cannot create postgres driver %s", err)
slog.Error("cannot create postgres driver %s", err)
}
migration, err := migrate.NewWithDatabaseInstance(
migrationsURL,
"eenergy", driver)
if err != nil {
// log.Fatal().Msg("cannot create new migrate instance")
fmt.Printf("cannot create new migrate instance %s", err)
slog.Error("cannot create new migrate instance %s", err)
}
migration.Up()
if err = migration.Up(); err != nil && err != migrate.ErrNoChange {
// log.Fatal().Msg("failed to run migrate up")
fmt.Printf("failed to run migrate up %s", err)
slog.Error("failed to run migrate up %s", err)

}

// log.Info().Msg("DB migrated successfully")
fmt.Println("DB migrated successfully")
slog.Info("DB migrated successfully")

// Run unversioned migrations
err = runUnversionedMigrations(db, "./db/migrations/procs")
if err != nil {
fmt.Println("Error applying unversioned migrations:", err)
slog.Error("Error applying unversioned migrations:", err)
os.Exit(1)
}

fmt.Println("Unversioned migrations applied successfully")
slog.Info("Unversioned migrations applied successfully")

}

Expand Down Expand Up @@ -100,7 +102,6 @@ func runUnversionedMigrations(db *sql.DB, migrationDir string) error {
return fmt.Errorf("error executing SQL file %s: %w", file, err)
}

fmt.Printf("Executed migration: %s\n", file)
}

return nil
Expand Down
40 changes: 40 additions & 0 deletions gapi/logger.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package gapi

import (
"context"
"log/slog"
"time"

"google.golang.org/grpc"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
)

func GrpcLogger(ctx context.Context, req any, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (resp any, err error) {

startTime := time.Now()
res, err := handler(ctx, req)
duration := time.Since(startTime)
statusCode := codes.Unknown
if st, ok := status.FromError(err); ok {
statusCode = st.Code()
}
logLevel := slog.LevelInfo
var errForLog slog.Attr
if err != nil {
logLevel = slog.LevelError
errForLog = slog.String("error", err.Error())
}
slog.LogAttrs(context.Background(),
logLevel,
"received grpc req",
slog.String("protocol", "grpc"),
slog.String("method", info.FullMethod),
slog.Int("status_code", int(statusCode)),
slog.String("status_text", statusCode.String()),
errForLog,
slog.Duration("duration", duration),
)

return res, err
}
3 changes: 2 additions & 1 deletion gapi/rpc_login_user.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package gapi

import (
"context"
"database/sql"
"errors"

db "github.com/aradwann/eenergy/db/store"
Expand All @@ -23,7 +24,7 @@ func (server *Server) LoginUser(ctx context.Context, req *pb.LoginUserRequest) (

user, err := server.store.GetUser(ctx, req.GetUsername())
if err != nil {
if errors.Is(err, db.ErrRecordNotFound) {
if errors.Is(err, sql.ErrNoRows) {
return nil, status.Errorf(codes.NotFound, "user not found")

}
Expand Down
3 changes: 0 additions & 3 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,6 @@ github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+l
github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=
github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
github.com/jackc/chunkreader v1.0.0 h1:4s39bBR8ByfqH+DKm8rQA3E1LHZWB9XWcrz8fqaZbe0=
github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo=
github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk=
github.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8=
Expand All @@ -86,7 +85,6 @@ github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65 h1:DadwsjnMwFjfWc9y5W
github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65/go.mod h1:5R2h2EEX+qri8jOWMbJCtaPWkrrNc7OHwsp2TCqp7ak=
github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM=
github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg=
github.com/jackc/pgproto3 v1.1.0 h1:FYYE4yRw+AgI8wXIinMlNjBbp/UitDJwfj5LqqewP1A=
github.com/jackc/pgproto3 v1.1.0/go.mod h1:eR5FA3leWg7p9aeAqi37XOTgTIbkABlvcPB3E5rlc78=
github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190420180111-c116219b62db/go.mod h1:bhq50y+xrl9n5mRYyCBFKkpRVTLYJVWeCc+mEAI3yXA=
github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190609003834-432c2951c711/go.mod h1:uH0AWtUmuShn0bcesswc4aBTWGvw0cAxIJp+6OB//Wg=
Expand Down Expand Up @@ -117,7 +115,6 @@ github.com/jackc/pgx/v5 v5.5.1/go.mod h1:Ig06C2Vu0t5qXC60W8sqIthScaEnFvojjj9dSlj
github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
github.com/jackc/puddle v1.3.0 h1:eHK/5clGOatcjX3oWGBO/MpxpbHzSwud5EWTSCI+MX0=
github.com/jackc/puddle v1.3.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
github.com/jackc/puddle/v2 v2.2.1 h1:RhxXJtFG022u4ibrCSMSiu5aOq1i77R3OHKNJj77OAk=
github.com/jackc/puddle/v2 v2.2.1/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4=
Expand Down
53 changes: 37 additions & 16 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import (
"database/sql"
"embed"
"fmt"
"log"
"log/slog"
"net"
"net/http"
"os"
Expand All @@ -27,19 +27,39 @@ import (
var content embed.FS

func main() {

config, err := util.LoadConfig(".", "app")
if err != nil {
fmt.Fprintf(os.Stderr, "error loading config: %v\n", err)
slog.Error("error loading config: %v\n", err)
os.Exit(1)
}

// if config.Environment == "development" {
// log.Logger = log.Output(zerolog.ConsoleWriter{Out: os.Stderr})
// }
var logHandler slog.Handler
if config.Environment == "development" {
// use simple text output for development
logHandler = slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{
AddSource: false,
Level: nil,
ReplaceAttr: func(groups []string, a slog.Attr) slog.Attr {
// Remove time.
if a.Key == slog.TimeKey && len(groups) == 0 {
return slog.Attr{}
}
return a
},
})
} else {
// use JSON Log Handler for production
logHandler = slog.NewJSONHandler(os.Stdout, nil)

}
logger := slog.New(logHandler)

slog.SetDefault(logger)

dbConn, err := sql.Open(config.DBDriver, config.DBSource)
if err != nil {
fmt.Fprintf(os.Stderr, "Unable to connect to database: %v\n", err)
slog.Error("Unable to connect to database: %v\n", err)
os.Exit(1)
}
defer dbConn.Close()
Expand All @@ -54,31 +74,32 @@ func main() {
func runGrpcServer(config util.Config, store db.Store) {
server, err := gapi.NewServer(config, store)
if err != nil {
log.Fatalf("cannot create server: %s", err)
slog.Error("cannot create server: %s", err)
}

grpcLogger := grpc.UnaryInterceptor(gapi.GrpcLogger)
// gprcLogger := grpc.UnaryInterceptor(gapi.GrpcLogger)
grpcServer := grpc.NewServer()
grpcServer := grpc.NewServer(grpcLogger)
pb.RegisterEenergyServiceServer(grpcServer, server)
reflection.Register(grpcServer)

listener, err := net.Listen("tcp", config.GRPCServerAddress)
if err != nil {
log.Fatalf("cannot create listener: %s", err)
slog.Error("cannot create listener: %s", err)
}

log.Printf("start gRPC server at %s", listener.Addr().String())
slog.Info(fmt.Sprintf("start gRPC server at %s", listener.Addr().String()))
err = grpcServer.Serve(listener)
if err != nil {
log.Fatalf("cannot start gRPC server: %s", err)
slog.Error("cannot start gRPC server: %s", err)
}
}

// runGateServer uses in-process translation avoiding extra network hopping, but only allow unary grpc request/response
func runGatewayServer(config util.Config, store db.Store) {
server, err := gapi.NewServer(config, store)
if err != nil {
log.Fatalf("cannot create server: %s", err)
slog.Error("cannot create server: %s", err)
}
jsonOpts := runtime.WithMarshalerOption(runtime.MIMEWildcard, &runtime.JSONPb{
MarshalOptions: protojson.MarshalOptions{
Expand All @@ -93,7 +114,7 @@ func runGatewayServer(config util.Config, store db.Store) {
defer cancel()
err = pb.RegisterEenergyServiceHandlerServer(ctx, grpcMux, server)
if err != nil {
log.Fatalf("cannot register handler server: %s", err)
slog.Error("cannot register handler server: %s", err)
}

mux := http.NewServeMux()
Expand All @@ -104,12 +125,12 @@ func runGatewayServer(config util.Config, store db.Store) {

listener, err := net.Listen("tcp", config.HTTPServerAddress)
if err != nil {
log.Fatalf("cannot create listener: %s", err)
slog.Error("cannot create listener: %s", err)
}

log.Printf("start HTTP gateway server at %s", listener.Addr().String())
slog.Info(fmt.Sprintf("start HTTP gateway server at %s", listener.Addr().String()))
err = http.Serve(listener, mux)
if err != nil {
log.Fatalf("cannot start http gateway server: %s", err)
slog.Error("cannot start http gateway server: %s", err)
}
}

0 comments on commit c9fd98c

Please sign in to comment.