Logging

  • Ada dua issue log yang kita gunakan saat ini, yaitu menggunakan variabel global dan hanya support teks (bukan log terstruktur).

  • Saat ini log menggunakan sebuah variabel di level paket. Kita akan mengubahnya menjadi variabel lokal yang kita suntikkan ke paket-paket yang membutuhkan dengan pattern dependency injection.

  • log.Logger merupakan log berbasis teks yang ramah untuk dibaca mata manusia, namun tool monioring lebih mudah membaca log terstruktur, misalnya dalam format json.

  • Kita akan mengganti penggunaan log.Logger dengan slog.Logger karena mempunyai kelebihan bisa digunakan dalam format teks maupun terstruktur. slog.Logger juga mempunyai fitur yang lebih kaya seperti fitur leveling log (Debug, Info, Warning, Error).

  • Untuk kemudahan penggunaan slog.Logger, saya sudah membuat library untuk wrapping slog.Logger di slog-library

  • Ubah file cmd/cli/main.go menjadi seperti berikut:

package main

import (
	"context"
	"flag"
	"fmt"
	"log/slog"
	"os"
	"workshop/config"
	"workshop/pkg/database"

	"github.com/jacky-htg/go-libs/logger"
	"github.com/jacky-htg/go-libs/migration"
	_ "github.com/lib/pq"
)

func main() {
	log := logger.InitLogger(nil)
	if err := run(log); err != nil {
		log.Debug(context.Background(), "application error", slog.Any("error", err))
		os.Exit(1)
	}
}

func run(log logger.Logger) error {

	cfg, err := config.LoadConfig()
	if err != nil {
		return fmt.Errorf("error: loading config: %s", err)
	}

	db, err := database.OpenDB(cfg)
	if err != nil {
		return fmt.Errorf("error: opening database: %s", err)
	}
	defer db.Close()

	flag.Parse()

	if len(flag.Args()) > 0 && flag.Arg(0) == "migrate" {
		if err := migration.Migrate(db, "migration"); err != nil {
			return fmt.Errorf("error: running migrations: %s", err)
		}
		log.Info(context.Background(), "migrations completed successfully")
	}

	return nil
}
  • Log akan kita inisiasi di bootstrap, ubah file internal/bootstrap/app.go menjadi:

  • Semua pemakaian log akan menggunakan logger.Logger yang telah dibuat.

  • Lewatkan logger.Logger ke service yang membutuhkan dengan pattern dependency injection

  • Ubah file cmd/server/main.go menjadi:

  • File internal/handler/user_handler.go berubah menjadi

  • File internal/service/users.go berubah menjadi

  • File internal/repository/user_repository.go berubah menjadi:

Last updated