diff --git a/docs/QuickStart.md b/docs/QuickStart.md index 5379596..44c7df6 100644 --- a/docs/QuickStart.md +++ b/docs/QuickStart.md @@ -83,6 +83,31 @@ This will: - "PDF generation failed": Check HTML template validity - "Storage error": Verify storage configuration and permissions +## Logger Setup +The `ILogger` interface present inside `/lib/logger.go` supports the following log levels: + +- `Info` +- `Warn` +- `Error` +- `Debug` + +Each method accepts: + +- `ctx`: A `context.Context` for request-scoped logging or tracing +- `msg`: Log message string +- `fields`: Key-value pairs for structured logging + +#### Setting Up Logger + +1. Implement the `ILogger` interface using your preferred logger. +2. Call `log.Initialize(yourLoggerInstance)` inside `/service/main.go` +3. Use `log.Logger.Info()`, `log.Logger.Error()`, etc., throughout your code. + +#### Example: Using Zerolog +A sample implementation of ILogger interface can be found at `/service/utils/zerolog.go` and initialized in `service/main.go` + +
+ ## Next Steps - Check the API documentation for more endpoints diff --git a/lib/browser_manager/initialize.go b/lib/browser_manager/initialize.go index b77f28a..bec111e 100644 --- a/lib/browser_manager/initialize.go +++ b/lib/browser_manager/initialize.go @@ -5,6 +5,7 @@ import ( "fmt" "os" + log "github.com/Zomato/espresso/lib/logger" "github.com/go-rod/rod" "github.com/go-rod/rod/lib/launcher" ) @@ -14,7 +15,8 @@ var ( ) func Init(ctx context.Context, tabPool int) error { - fmt.Println("Initializing browser...") + log.Logger.Info(ctx, "Initializing Browser...", nil) + browserPath := os.Getenv("ROD_BROWSER_BIN") if browserPath == "" { return fmt.Errorf("ROD_BROWSER_BIN environment variable not set") @@ -82,7 +84,7 @@ func Init(ctx context.Context, tabPool int) error { } Browser = browser - fmt.Println("Browser connected successfully") + log.Logger.Info(ctx, "Browser Connected Successfully", nil) InitializeTabManager(ctx, tabPool) diff --git a/lib/browser_manager/tabManager.go b/lib/browser_manager/tabManager.go index 8019400..18b33f4 100644 --- a/lib/browser_manager/tabManager.go +++ b/lib/browser_manager/tabManager.go @@ -5,6 +5,7 @@ import ( "fmt" "sync" + log "github.com/Zomato/espresso/lib/logger" "github.com/go-rod/rod" ) @@ -25,7 +26,9 @@ func InitializeTabManager(ctx context.Context, tabPool int) { } func NewTabPool(ctx context.Context, browser *rod.Browser, tabPool int) *TabPool { - fmt.Println("Initializing tab pool with ", tabPool, " tabs") + + log.Logger.Info(ctx, "Initializing tab pool", map[string]any{"totalTabs": tabPool}) + numTabs = tabPool if tabPool == 0 { return nil @@ -48,7 +51,8 @@ func NewTabPool(ctx context.Context, browser *rod.Browser, tabPool int) *TabPool // if the `browser.tabs` is 0 then we are creating a new tab on each request func GetTab() *rod.Page { - fmt.Println("Getting tab") + log.Logger.Info(context.Background(), "Getting tab", nil) + if numTabs == 0 { return Browser.MustPage("about:blank") } @@ -58,7 +62,7 @@ func GetTab() *rod.Page { } func ReleaseTab(page *rod.Page) { - fmt.Println("Releasing tab") + log.Logger.Info(context.Background(), "Releasing Tab", nil) if numTabs == 0 { page.MustClose() return diff --git a/lib/certmanager/certmanager.go b/lib/certmanager/certmanager.go index 6ec4ed9..df726ef 100644 --- a/lib/certmanager/certmanager.go +++ b/lib/certmanager/certmanager.go @@ -44,7 +44,6 @@ func LoadSigningCredentials(ctx context.Context, certConfig *CertificateConfig) } func getCertificate(certPath string) (*x509.Certificate, error) { - certBytes, err := os.ReadFile(certPath) if err != nil { return nil, fmt.Errorf("failed to read certificate file: %v", err) @@ -63,7 +62,6 @@ func getCertificate(certPath string) (*x509.Certificate, error) { } func getKey(keyPath, password string) (crypto.Signer, error) { - keyBytes, err := os.ReadFile(keyPath) if err != nil { return nil, fmt.Errorf("failed to read private key file: %v", err) diff --git a/lib/logger/logger.go b/lib/logger/logger.go new file mode 100644 index 0000000..ae03017 --- /dev/null +++ b/lib/logger/logger.go @@ -0,0 +1,33 @@ +package log + +import ( + "context" +) + +var ( + + // Assigning default no-op logger. Later it will be replaced by actual logger(if provided) inside init function. + Logger ILogger = newNoOpLogger() +) + +type Level uint8 + +const ( + DebugLevel Level = iota + Info + Warn + Error +) + +type Fields map[string]any + +type ILogger interface { + Info(ctx context.Context, msg string, fields Fields) + Warn(ctx context.Context, msg string, fields Fields) + Error(ctx context.Context, msg string, err error, fields Fields) + Debug(ctx context.Context, msg string, fields Fields) +} + +func Initialize(loggerInstance ILogger) { + Logger = loggerInstance +} diff --git a/lib/logger/no-op.go b/lib/logger/no-op.go new file mode 100644 index 0000000..d521480 --- /dev/null +++ b/lib/logger/no-op.go @@ -0,0 +1,23 @@ +/* + Default no operation logger for no overhead. It is assigned default to ILogger instance in logger.go file. +*/ + +package log + +import ( + "context" +) + +type NoOpLogger struct{} + +func newNoOpLogger() NoOpLogger { + return NoOpLogger{} +} + +func (n NoOpLogger) Info(ctx context.Context, msg string, fields Fields) {} + +func (n NoOpLogger) Warn(ctx context.Context, msg string, fields Fields) {} + +func (n NoOpLogger) Error(ctx context.Context, msg string, err error, fields Fields) {} + +func (n NoOpLogger) Debug(ctx context.Context, msg string, fields Fields) {} diff --git a/lib/renderer/pdf.go b/lib/renderer/pdf.go index d97e7ee..2d5421b 100644 --- a/lib/renderer/pdf.go +++ b/lib/renderer/pdf.go @@ -8,6 +8,7 @@ import ( "time" "github.com/Zomato/espresso/lib/browser_manager" + log "github.com/Zomato/espresso/lib/logger" "github.com/Zomato/espresso/lib/templatestore" "github.com/go-rod/rod" ) @@ -20,7 +21,9 @@ func GetHtmlPdf(ctx context.Context, params *GetHtmlPdfInput, storeAdapter *temp } duration := time.Since(startTime) - fmt.Println("starting template parsing at :: ", duration) + + log.Logger.Info(ctx, "starting template parsing at", map[string]any{"time": duration}) + var err error var templateFile *template.Template if storeAdapter != nil { @@ -40,7 +43,7 @@ func GetHtmlPdf(ctx context.Context, params *GetHtmlPdfInput, storeAdapter *temp } duration = time.Since(startTime) - fmt.Println("starting unmarshaling data at :: ", duration) + log.Logger.Info(ctx, "starting unmarshaling data at", map[string]any{"time": duration}) data := params.Data @@ -57,16 +60,16 @@ func GetHtmlPdf(ctx context.Context, params *GetHtmlPdfInput, storeAdapter *temp page := browser_manager.GetTab() defer func() { duration = time.Since(startTime) - fmt.Println("closing tab at :: ", duration) + log.Logger.Info(ctx, "closing tab at", map[string]any{"time": duration}) browser_manager.ReleaseTab(page) }() duration = time.Since(startTime) - fmt.Println("prefetching images at :: ", duration) + log.Logger.Info(ctx, "prefetching images at", map[string]any{"time": duration}) unmarshaledData = PrefetchImages(ctx, unmarshaledData) duration = time.Since(startTime) - fmt.Println("unmarshaled data & started template execution at :: ", duration) + log.Logger.Info(ctx, "unmarshaled data & started template execution at", map[string]any{"time": duration}) htmlContent, err := ExecuteTemplate(ctx, templateFile, unmarshaledData) if err != nil { @@ -76,7 +79,7 @@ func GetHtmlPdf(ctx context.Context, params *GetHtmlPdfInput, storeAdapter *temp htmlContent = AddImagesFromMetaData(ctx, htmlContent, unmarshaledData) duration = time.Since(startTime) - fmt.Println("template executed and requesting new tab at :: ", duration) + log.Logger.Info(ctx, "template executed and requesting new tab at", map[string]any{"time": duration}) if params.IsSinglePage { page.MustSetViewport(794, 1124, 1.0, false) @@ -86,7 +89,7 @@ func GetHtmlPdf(ctx context.Context, params *GetHtmlPdfInput, storeAdapter *temp } duration = time.Since(startTime) - fmt.Println("rendering data in new tab at :: ", duration) + log.Logger.Info(ctx, "rendering data in new tab at", map[string]any{"time": duration}) err = page.SetDocumentContent(string(htmlContent)) if err != nil { @@ -120,7 +123,7 @@ func GetHtmlPdf(ctx context.Context, params *GetHtmlPdfInput, storeAdapter *temp } duration = time.Since(startTime) - fmt.Println("generating pdf at :: ", duration) + log.Logger.Info(ctx, "generating pdf at", map[string]any{"time": duration}) pdfStream, err := page.PDF(pdfParams) if err != nil { @@ -128,7 +131,7 @@ func GetHtmlPdf(ctx context.Context, params *GetHtmlPdfInput, storeAdapter *temp } duration = time.Since(startTime) - fmt.Println("pdf generated at :: ", duration) + log.Logger.Info(ctx, "pdf generated at", map[string]any{"time": duration}) return pdfStream, nil } diff --git a/lib/renderer/prefetchImages.go b/lib/renderer/prefetchImages.go index 3d57ff6..d99f78c 100644 --- a/lib/renderer/prefetchImages.go +++ b/lib/renderer/prefetchImages.go @@ -11,6 +11,7 @@ import ( "sync" "time" + log "github.com/Zomato/espresso/lib/logger" "github.com/Zomato/espresso/lib/workerpool" ) @@ -45,23 +46,26 @@ func PrefetchImages(ctx context.Context, data map[string]interface{}) map[string wg.Done() if r := recover(); r != nil { err := fmt.Errorf("panic: %v and stacktrace %s", r, string(debug.Stack())) - fmt.Println("Recovered from panic: ", err) + log.Logger.Info(ctx, "recovered from panic", map[string]any{"error": err}) + } }() var dataURI string var err error if strings.HasPrefix(v, "https://") { duration := time.Since(startTime) - fmt.Printf("fetching %s image at :: %s\n", v, duration) + log.Logger.Info(ctx, "fetching image at", map[string]any{"name": v, "time": duration}) + dataURI, err = fetchImageAsDataURIFromURL(v) if err != nil { - fmt.Printf("failed to download image for key %s: %v\n", k, err) + log.Logger.Error(ctx, "failed to download image", err, map[string]any{"key": k}) return } } if dataURI == "" { - fmt.Printf("failed to download image for key %s: dataURI is empty\n", k) + log.Logger.Error(ctx, "failed to download image. data uri is empty", nil, map[string]any{"key": k}) + mu.Lock() parentData[k] = "" mu.Unlock() @@ -69,15 +73,15 @@ func PrefetchImages(ctx context.Context, data map[string]interface{}) map[string } duration := time.Since(startTime) - fmt.Printf("fetched %s image data at :: %s\n", v, duration) + log.Logger.Info(ctx, "fetched image data at", map[string]any{"time": duration, "image": v}) mu.Lock() parentData[k] = dataURI mu.Unlock() - fmt.Printf("replaced image data for key %s at :: %s, error :: %v\n", k, duration, err) + log.Logger.Info(ctx, "replaced image data at", map[string]any{"time": duration, "key": k, "error": err}) }, key, strValue, current.data) if err != nil { - fmt.Printf("failed to submit task to worker pool: %v\n", err) + log.Logger.Error(ctx, "failed to submit task to worker pool", err, nil) } } else if nestedMap, ok := value.(map[string]interface{}); ok { stack = append(stack, stackItem{key: key, data: nestedMap}) @@ -94,12 +98,12 @@ func PrefetchImages(ctx context.Context, data map[string]interface{}) map[string } duration := time.Since(startTime) - fmt.Println("prefetching images completed at :: ", duration) + log.Logger.Info(ctx, "prefetching images completed at", map[string]any{"time": duration}) wg.Wait() duration = time.Since(startTime) - fmt.Println("all worker pool tasks completed at :: ", duration) + log.Logger.Info(ctx, "all worker pool tasks completed at", map[string]any{"time": duration}) return data } @@ -109,7 +113,7 @@ func fetchImageAsDataURIFromURL(url string) (string, error) { startTime := time.Now() duration := time.Since(startTime) - fmt.Printf("fetching %s image at :: %s\n", url, duration) + log.Logger.Info(context.Background(), "fetching image at", map[string]any{"time": duration, "url": url}) resp, err := http.Get(url) if err != nil { @@ -117,7 +121,7 @@ func fetchImageAsDataURIFromURL(url string) (string, error) { } duration = time.Since(startTime) - fmt.Printf("fetched %s image data at :: %s\n", url, duration) + log.Logger.Info(context.Background(), "fetched image at", map[string]any{"time": duration, "url": url}) defer resp.Body.Close() @@ -140,6 +144,7 @@ func fetchImageAsDataURIFromURL(url string) (string, error) { dataURI := fmt.Sprintf("data:%s;base64,%s", contentType, base64.StdEncoding.EncodeToString(imageBytes)) duration = time.Since(startTime) - fmt.Printf("returning %s image data at :: %s\n", url, duration) + log.Logger.Info(context.Background(), "returning image at", map[string]any{"time": duration, "url": url}) + return dataURI, nil } diff --git a/lib/signer/appearance.go b/lib/signer/appearance.go index bca66ac..5b593b0 100644 --- a/lib/signer/appearance.go +++ b/lib/signer/appearance.go @@ -119,6 +119,7 @@ func (context *SignContext) createIncPageUpdate(pageNumber, annot uint32) ([]byt } func (context *SignContext) createAppearance(rect [4]float64) ([]byte, error) { + text := context.SignData.Signature.Info.Name rectWidth := rect[2] - rect[0] diff --git a/lib/signer/object.go b/lib/signer/object.go index 84247eb..8bca7d3 100644 --- a/lib/signer/object.go +++ b/lib/signer/object.go @@ -6,6 +6,7 @@ import ( ) func (context *SignContext) addObject(object []byte) (uint32, error) { + if context.lastXrefID == 0 { lastXrefID, err := context.getLastObjectIDFromXref() if err != nil { diff --git a/lib/signer/signature.go b/lib/signer/signature.go index 03edc3a..08bb69d 100644 --- a/lib/signer/signature.go +++ b/lib/signer/signature.go @@ -7,14 +7,17 @@ import ( "encoding/asn1" "encoding/hex" "fmt" - "log" + "strconv" "strings" + log "github.com/Zomato/espresso/lib/logger" "github.com/digitorus/pkcs7" "github.com/digitorus/timestamp" "golang.org/x/crypto/cryptobyte" + cContext "context" + cryptobyte_asn1 "golang.org/x/crypto/cryptobyte/asn1" ) @@ -154,6 +157,7 @@ func (context *SignContext) createTimestampPlaceholder() []byte { } func (context *SignContext) createSignature() ([]byte, error) { + if _, err := context.OutputBuffer.Seek(0, 0); err != nil { return nil, err } @@ -275,6 +279,7 @@ func (context *SignContext) createSigningCertificateAttribute() (*pkcs7.Attribut } func (context *SignContext) updateByteRange() error { + if _, err := context.OutputBuffer.Seek(0, 0); err != nil { return err } @@ -319,6 +324,7 @@ func (context *SignContext) updateByteRange() error { } func (context *SignContext) replaceSignature() error { + signature, err := context.createSignature() if err != nil { return fmt.Errorf("failed to create signature: %w", err) @@ -328,7 +334,7 @@ func (context *SignContext) replaceSignature() error { hex.Encode(dst, signature) if uint32(len(dst)) > context.SignatureMaxLength { - log.Println("Signature too long, retrying with increased buffer size.") + log.Logger.Info(cContext.Background(), "Signature too long, retrying with increased buffer size", nil) context.SignatureMaxLengthBase += (uint32(len(dst)) - context.SignatureMaxLength) + 1 return context.SignPDF() diff --git a/lib/signer/signer.go b/lib/signer/signer.go index 9f47201..02934f3 100644 --- a/lib/signer/signer.go +++ b/lib/signer/signer.go @@ -41,7 +41,6 @@ func Sign(input io.ReadSeeker, output io.Writer, rdr *pdf.Reader, size int64, si } func (context *SignContext) SignPDF() error { - if context.SignData.Signature.CertType == 0 { context.SignData.Signature.CertType = 1 } diff --git a/lib/signer/timestamp.go b/lib/signer/timestamp.go index cb109c6..b6639f4 100644 --- a/lib/signer/timestamp.go +++ b/lib/signer/timestamp.go @@ -12,6 +12,7 @@ import ( ) func (context *SignContext) GetTSA(sign_content []byte) (timestamp_response []byte, err error) { + sign_reader := bytes.NewReader(sign_content) ts_request, err := timestamp.CreateRequest(sign_reader, ×tamp.RequestOptions{ Hash: context.SignData.DigestAlgorithm, diff --git a/lib/signer/xref.go b/lib/signer/xref.go index e6f4fb6..f86d0dd 100644 --- a/lib/signer/xref.go +++ b/lib/signer/xref.go @@ -12,6 +12,7 @@ import ( ) func (context *SignContext) writeXref() error { + if _, err := context.OutputBuffer.Write([]byte("\n")); err != nil { return fmt.Errorf("failed to write newline before xref: %w", err) } @@ -79,6 +80,7 @@ func (context *SignContext) writeIncrXrefTable() error { } func (context *SignContext) writeXrefStream() error { + var buffer bytes.Buffer predictor := context.PDFReader.Trailer().Key("DecodeParms").Key("Predictor").Int64() diff --git a/lib/templatestore/mysqlstore.go b/lib/templatestore/mysqlstore.go index b79d9d6..7df0fcf 100644 --- a/lib/templatestore/mysqlstore.go +++ b/lib/templatestore/mysqlstore.go @@ -7,6 +7,7 @@ import ( "io" "text/template" + log "github.com/Zomato/espresso/lib/logger" _ "github.com/go-sql-driver/mysql" "github.com/google/uuid" ) @@ -208,7 +209,7 @@ func (m *MySQLTemplateStorage) CreateTemplate(ctx context.Context, req *CreateTe } if count > 0 { - fmt.Println("template ID already exists: ", templateID) + log.Logger.Info(ctx, "template ID already exists: ", map[string]any{"id": templateID}) return "", fmt.Errorf("server error, failed at id generation") } diff --git a/lib/workerpool/pool.go b/lib/workerpool/pool.go index 594e172..a87c035 100644 --- a/lib/workerpool/pool.go +++ b/lib/workerpool/pool.go @@ -1,9 +1,10 @@ package workerpool import ( - "fmt" + "context" "time" + log "github.com/Zomato/espresso/lib/logger" "github.com/panjf2000/ants/v2" ) @@ -30,7 +31,7 @@ func Initialize(size int, expiryDuration time.Duration) { ants.WithExpiryDuration(expiryDuration), ) if err != nil { - fmt.Printf("could not initialize worker pool: %v\n", err) + log.Logger.Error(context.Background(), "could not initialize worker pool", err, nil) panic(err) } pool = &WorkerPool{Pool: workerPool} diff --git a/service/Dockerfile b/service/Dockerfile index 3e9131d..be8d93c 100644 --- a/service/Dockerfile +++ b/service/Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=$BUILDPLATFORM golang:1.22.4-bullseye +FROM --platform=$BUILDPLATFORM golang:1.23.1-bullseye WORKDIR /app/espresso/ @@ -66,4 +66,4 @@ USER chrome EXPOSE 8081 # Change the CMD to run the Go application directly -CMD ["go", "run","-mod=mod", "/app/espresso/service/main.go"] \ No newline at end of file +CMD ["go", "run","-mod=mod", "/app/espresso/service/main.go"] diff --git a/service/go.mod b/service/go.mod index 2f17ca4..8e081b7 100644 --- a/service/go.mod +++ b/service/go.mod @@ -1,10 +1,13 @@ module github.com/Zomato/espresso/service -go 1.22.4 +go 1.23.0 + +toolchain go1.23.1 require ( - github.com/Zomato/espresso/lib v0.0.0-20250316142812-954ffe9efdb5 + github.com/Zomato/espresso/lib v0.0.0-20250321161824-082e62c67636 github.com/go-rod/rod v0.116.2 + github.com/rs/zerolog v1.34.0 github.com/spf13/viper v1.19.0 github.com/stretchr/testify v1.10.0 ) @@ -44,6 +47,8 @@ require ( github.com/hashicorp/hcl v1.0.0 // indirect github.com/magiconair/properties v1.8.7 // indirect github.com/mattetti/filebuffer v1.0.1 // indirect + github.com/mattn/go-colorable v0.1.14 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/panjf2000/ants/v2 v2.11.2 // indirect github.com/pelletier/go-toml/v2 v2.2.2 // indirect @@ -64,7 +69,7 @@ require ( golang.org/x/crypto v0.33.0 // indirect golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect golang.org/x/sync v0.11.0 // indirect - golang.org/x/sys v0.30.0 // indirect + golang.org/x/sys v0.31.0 // indirect golang.org/x/text v0.22.0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/service/go.sum b/service/go.sum index 4c740ff..06cfb15 100644 --- a/service/go.sum +++ b/service/go.sum @@ -1,7 +1,5 @@ filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= -github.com/Zomato/espresso/lib v0.0.0-20250316142812-954ffe9efdb5 h1:EV7367gnsGq9gCKTa2CXfmZoo9bMkHG4k9fSUqKkxYA= -github.com/Zomato/espresso/lib v0.0.0-20250316142812-954ffe9efdb5/go.mod h1:kLwZ8Pdcx3k5UepIeNTCTKT0+/T78gYLmXFO9O+Ew54= github.com/aws/aws-sdk-go-v2 v1.36.3 h1:mJoei2CxPutQVxaATCzDUjcZEjVRdpsiiXi2o38yqWM= github.com/aws/aws-sdk-go-v2 v1.36.3/go.mod h1:LLXuLpgzEbD766Z5ECcRmi8AzSwfZItDtmABVkRLGzg= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.10 h1:zAybnyUQXIZ5mok5Jqwlf58/TFE7uvd3IAsa1aF9cXs= @@ -40,6 +38,7 @@ github.com/aws/aws-sdk-go-v2/service/sts v1.33.17 h1:PZV5W8yk4OtH1JAuhV2PXwwO9v5 github.com/aws/aws-sdk-go-v2/service/sts v1.33.17/go.mod h1:cQnB8CUnxbMU82JvlqjKR2HBOm3fe9pWorWBza6MBJ4= github.com/aws/smithy-go v1.22.2 h1:6D9hW43xKFrRx/tXXfAlIZc4JI+yQe6snnWcQyxSyLQ= github.com/aws/smithy-go v1.22.2/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg= +github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= @@ -59,6 +58,7 @@ github.com/go-rod/rod v0.116.2 h1:A5t2Ky2A+5eD/ZJQr1EfsQSe5rms5Xof/qj296e+ZqA= github.com/go-rod/rod v0.116.2/go.mod h1:H+CMO9SCNc2TJ2WfrG+pKhITz57uGNYU43qYHh438Mg= github.com/go-sql-driver/mysql v1.9.0 h1:Y0zIbQXhQKmQgTp44Y1dp3wTXcn804QoTptLZT1vtvo= github.com/go-sql-driver/mysql v1.9.0/go.mod h1:pDetrLJeA3oMujJuvXc8RJoasr589B6A9fwzD3QMrqw= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= @@ -73,17 +73,28 @@ github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0V github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/mattetti/filebuffer v1.0.1 h1:gG7pyfnSIZCxdoKq+cPa8T0hhYtD9NxCdI4D7PTjRLM= github.com/mattetti/filebuffer v1.0.1/go.mod h1:YdMURNDOttIiruleeVr6f56OrMc+MydEnTcXwtkxNVs= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= +github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/panjf2000/ants/v2 v2.11.2 h1:AVGpMSePxUNpcLaBO34xuIgM1ZdKOiGnpxLXixLi5Jo= github.com/panjf2000/ants/v2 v2.11.2/go.mod h1:8u92CYMUc6gyvTIw8Ru7Mt7+/ESnJahz5EVtqfrilek= github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM= github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +github.com/rs/xid v1.6.0/go.mod h1:7XoLgs4eV+QndskICGsho+ADou8ySMSjJKDIan90Nz0= +github.com/rs/zerolog v1.34.0 h1:k43nTLIwcTVQAncfCw4KZ2VY6ukYoZaBPNOE8txlOeY= +github.com/rs/zerolog v1.34.0/go.mod h1:bJsvje4Z08ROH4Nhs5iH600c3IkWhwp44iRc54W6wYQ= github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ= github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4= github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE= @@ -135,8 +146,11 @@ golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjs golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w= golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= -golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik= +golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM= golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/service/main.go b/service/main.go index 8dbe2d7..6c90914 100644 --- a/service/main.go +++ b/service/main.go @@ -9,15 +9,20 @@ import ( "github.com/Zomato/espresso/lib/browser_manager" + customLogger "github.com/Zomato/espresso/lib/logger" "github.com/Zomato/espresso/lib/workerpool" "github.com/Zomato/espresso/service/controller/pdf_generation" "github.com/Zomato/espresso/service/internal/pkg/viperpkg" + "github.com/Zomato/espresso/service/utils" "github.com/spf13/viper" ) func main() { ctx := context.Background() + zeroLogger := utils.NewZeroLogger() + customLogger.Initialize(zeroLogger) + viperpkg.InitConfig() log.Printf("Template storage type: %s", viper.GetString("template_storage.storage_type")) diff --git a/service/utils/zerolog.go b/service/utils/zerolog.go new file mode 100644 index 0000000..1dd4d1d --- /dev/null +++ b/service/utils/zerolog.go @@ -0,0 +1,48 @@ +package utils + +import ( + "context" + "os" + "time" + + customLogger "github.com/Zomato/espresso/lib/logger" + "github.com/rs/zerolog" + "github.com/rs/zerolog/log" +) + +type ZeroLog struct { + logger zerolog.Logger +} + +func NewZeroLogger() ZeroLog { + log.Logger = log.Output(zerolog.ConsoleWriter{Out: os.Stderr, TimeFormat: time.RFC3339}) + zerolog.SetGlobalLevel(zerolog.DebugLevel) + + return ZeroLog{ + logger: log.Logger, + } +} + +func addFields(event *zerolog.Event, fields map[string]any) *zerolog.Event { + for k, v := range fields { + event.Interface(k, v) + } + + return event +} + +func (l ZeroLog) Info(ctx context.Context, msg string, fields customLogger.Fields) { + addFields(l.logger.Info(), fields).Msg(msg) +} + +func (l ZeroLog) Warn(ctx context.Context, msg string, fields customLogger.Fields) { + addFields(l.logger.Warn(), fields).Msg(msg) +} + +func (l ZeroLog) Error(ctx context.Context, msg string, err error, fields customLogger.Fields) { + addFields(l.logger.Err(err), fields).Msg(msg) +} + +func (l ZeroLog) Debug(ctx context.Context, msg string, fields customLogger.Fields) { + addFields(l.logger.Debug(), fields).Msg(msg) +}