]> git.maquefel.me Git - brevno-suite/hugo/commitdiff
resources/image: Add some image decode/encode debug logging
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Sun, 1 Feb 2026 21:46:01 +0000 (22:46 +0100)
committerGitHub <noreply@github.com>
Sun, 1 Feb 2026 21:46:01 +0000 (22:46 +0100)
Fixes #14337
Closes #14460

common/loggers/logger.go
resources/images/codec.go
resources/images/image.go
resources/resource_spec.go

index a013049f77017f72a1ce1cb766453a1202bc56ed..785405033e817c372869f8bef4b4af9e1cf9b71b 100644 (file)
@@ -173,6 +173,7 @@ func LevelLoggerToWriter(l logg.LevelLogger) io.Writer {
 
 type Logger interface {
        Debug() logg.LevelLogger
+       DebugCommand(command string) logg.LevelLogger
        Debugf(format string, v ...any)
        Debugln(v ...any)
        Error() logg.LevelLogger
@@ -221,6 +222,10 @@ func (l *logAdapter) Debug() logg.LevelLogger {
        return l.debugl
 }
 
+func (l *logAdapter) DebugCommand(command string) logg.LevelLogger {
+       return l.debugl.WithField(FieldNameCmd, command)
+}
+
 func (l *logAdapter) Debugf(format string, v ...any) {
        l.debugl.Logf(format, v...)
 }
index 16840ac341ea90986400bd3c929d22412bba4596..3b1e0f3832270733173f0cf9fb9c36a9e07694cf 100644 (file)
@@ -27,6 +27,7 @@ import (
        "io"
 
        "github.com/bep/imagemeta"
+       "github.com/bep/logg"
        "github.com/gohugoio/hugo/common/himage"
        "golang.org/x/image/bmp"
        "golang.org/x/image/tiff"
@@ -56,14 +57,23 @@ type EncodeDecoder interface {
 
 // Codec is a generic image codec supporting multiple formats.
 type Codec struct {
-       webp EncodeDecoder
+       webp   EncodeDecoder
+       debugl logg.LevelLogger
 }
 
-func newCodec(webp EncodeDecoder) *Codec {
-       return &Codec{webp: webp}
+func newCodec(webp EncodeDecoder, debugl logg.LevelLogger) *Codec {
+       return &Codec{webp: webp, debugl: debugl}
 }
 
 func (d *Codec) EncodeTo(conf ImageConfig, w io.Writer, img image.Image) error {
+       d.debugl.Log(
+               // This construct looks odd, but the func will only be called if debug is enabled.
+               logg.StringFunc(
+                       func() string {
+                               return fmt.Sprintf("Encoding image to format %s with config %+v", conf.TargetFormat, conf)
+                       },
+               ),
+       )
        switch conf.TargetFormat {
        case JPEG:
                var rgba *image.RGBA
@@ -144,6 +154,13 @@ func (d *Codec) EncodeTo(conf ImageConfig, w io.Writer, img image.Image) error {
 }
 
 func (d *Codec) DecodeFormat(f Format, r io.Reader) (image.Image, error) {
+       d.debugl.Log(
+               logg.StringFunc(
+                       func() string {
+                               return fmt.Sprintf("Decoding image from format %s", f)
+                       },
+               ),
+       )
        switch f {
        case JPEG, PNG:
                // We reworked this decode/encode setup to get full WebP support in v0.153.0.
@@ -192,6 +209,13 @@ func (d *Codec) DecodeFormat(f Format, r io.Reader) (image.Image, error) {
 }
 
 func (d *Codec) Decode(r io.Reader) (image.Image, error) {
+       d.debugl.Log(
+               logg.StringFunc(
+                       func() string {
+                               return "Decoding image from unknown format"
+                       },
+               ),
+       )
        rr := toPeekReader(r)
        format, err := formatFromImage(rr)
        if err != nil {
index 80648f5f282da700436a7621117c82985965cba4..24519c1f18f4bc4fffd1c6fe36a69adee8a54d80 100644 (file)
@@ -124,7 +124,7 @@ func (i *Image) initConfig() error {
        return nil
 }
 
-func NewImageProcessor(warnl logg.LevelLogger, wasmDispatchers *warpc.Dispatchers, cfg *config.ConfigNamespace[ImagingConfig, ImagingConfigInternal]) (*ImageProcessor, error) {
+func NewImageProcessor(debugl, warnl logg.LevelLogger, wasmDispatchers *warpc.Dispatchers, cfg *config.ConfigNamespace[ImagingConfig, ImagingConfigInternal]) (*ImageProcessor, error) {
        e := cfg.Config.Imaging.Exif
        exifDecoder, err := meta.NewDecoder(
                meta.WithDateDisabled(e.DisableDate),
@@ -154,7 +154,7 @@ func NewImageProcessor(warnl logg.LevelLogger, wasmDispatchers *warpc.Dispatcher
        if webpCodec == nil {
                return nil, errors.New("webp codec is not available")
        }
-       imageCodec := newCodec(webpCodec)
+       imageCodec := newCodec(webpCodec, debugl)
 
        return &ImageProcessor{
                Cfg:         cfg,
index 70ec2cf0a7a5279943fdd80acbd1547222491c8e..c80a0bbf9430ed6daae548bbb8050f6953e986b4 100644 (file)
@@ -62,9 +62,10 @@ func NewSpec(
        conf := s.Cfg.GetConfig().(*allconfig.Config)
        imgConfig := conf.Imaging
 
+       imagesDebugl := logger.DebugCommand("images")
        imagesWarnl := logger.WarnCommand("images")
 
-       imaging, err := images.NewImageProcessor(imagesWarnl, wasmDispatchers, imgConfig)
+       imaging, err := images.NewImageProcessor(imagesDebugl, imagesWarnl, wasmDispatchers, imgConfig)
        if err != nil {
                return nil, err
        }