Code Monkey home page Code Monkey logo

Comments (3)

lmittmann avatar lmittmann commented on August 21, 2024 1

Yes, this would definitely break with the conventions of TextHandler. Although what you describe is the default behavior of the JSONHandler.

However, I think there is a good equivalent solution to zerolog, the slog.LogValuer.

func (p Person) LogValue() slog.Value {
	return slog.GroupValue(
		slog.String("name", p.Name),
		slog.Int("age", A.age))
}

The output format is a little different though. ..., "person", p,... would become person.name=John person.age=30

from tint.

fgimian avatar fgimian commented on August 21, 2024 1
func (p Person) LogValue() slog.Value {
	return slog.GroupValue(
		slog.String("name", p.Name),
		slog.Int("age", A.age))
}

Actually, that's perfect and honestly nicer output than the JSON output as it is more human friendly. Thanks so much for the reply and tip, I wasn't aware of this method.

I'm happy to close this issue 😄
Fotis

from tint.

fgimian avatar fgimian commented on August 21, 2024

Just to give you an idea of how I accomplished this locally while testing:

handler.go

...
func appendValue(buf *buffer, v slog.Value, quote bool) {
...
-               if tm, ok := v.Any().(encoding.TextMarshaler); ok {
-                       data, err := tm.MarshalText()
-                       if err != nil {
-                               break
-                       }
-                       appendString(buf, string(data), quote)
-                       break
+               if jm, err := json.Marshal(v.Any()); err == nil {
+                       appendString(buf, string(jm), false)
+               } else {
+                       appendString(buf, fmt.Sprintf("%+v", v.Any()), false)
                }
-               appendString(buf, fmt.Sprint(v.Any()), quote)
...

And my example:

type Person struct {
	Name string `json:"name"`
	Age  int    `json:"age"`
}

func main() {
	tintOptions := tint.Options{
		Level:      slog.LevelDebug,
		TimeFormat: time.DateTime,
	}
	slog.SetDefault(slog.New(tintOptions.NewHandler(os.Stdout)))

	person := Person{
		Name: "John",
		Age:  30,
	}
	slog.Info("This is the person", slog.Any("person", person))
}

Resulting in the following output:

image

As compared to:

image

And slog's TextHandler looks like this:

image

Notice they've also adopted %+v too so it may be worth switching that style either way 😄

Cheers
Fotis

from tint.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.