Skip to content

Commit

Permalink
Add new example: logging with the log and log/slog packages
Browse files Browse the repository at this point in the history
  • Loading branch information
eliben committed Aug 22, 2023
1 parent 146bd9c commit 15d8fe7
Show file tree
Hide file tree
Showing 8 changed files with 379 additions and 3 deletions.
1 change: 1 addition & 0 deletions examples.txt
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ Command-Line Arguments
Command-Line Flags
Command-Line Subcommands
Environment Variables
Logging
HTTP Client
HTTP Server
Context
Expand Down
77 changes: 77 additions & 0 deletions examples/logging/logging.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
// The Go standard library provides straightforward
// tools for outputting logs from Go programs, with
// the [log](https://pkg.go.dev/log) package for
// free-form output and the
// [log/slog](https://pkg.go.dev/log/slog) package for
// structured output.
package main

import (
"bytes"
"fmt"
"log"
"os"

"log/slog"
)

func main() {

// Simply invoking functions like `Println` from the
// `log` package uses the _standard_ logger, which
// is already pre-configured for reasonable logging
// output to `os.Stderr`. Additional methods like
// `Fatal*` or `Panic*` will exit the program after
// logging.
log.Println("standard logger")

// Loggers can be configured with _flags_ to set
// their output format. By default, the standard
// logger has the `log.Ldate` and `log.Ltime` flags
// set, and these are collected in `log.LstdFlags`.
// We can change its flags to emit time with
// microsecond accuracy, for example.
log.SetFlags(log.LstdFlags | log.Lmicroseconds)
log.Println("with micro")

// It also supports emitting the file name and
// line from which the `log` function is called.
log.SetFlags(log.LstdFlags | log.Lshortfile)
log.Println("with file/line")

// It may be useful to create a custom logger and
// pass it around. When creating a new logger, we
// can set a _prefix_ to distinguish its output
// from other loggers.
mylog := log.New(os.Stdout, "my:", log.LstdFlags)
mylog.Println("from mylog")

// We can set the prefix
// on existing loggers (including the standard one)
// with the `SetPrefix` method.
mylog.SetPrefix("ohmy:")
mylog.Println("from mylog")

// Loggers can have custom output targets;
// any `io.Writer` works.
var buf bytes.Buffer
buflog := log.New(&buf, "buf:", log.LstdFlags)

// This call writes the log output into `buf`.
buflog.Println("hello")

// This will actually show it on standard output.
fmt.Print("from buflog:", buf.String())

// The `slog` package provides
// _structured_ log output. For example, logging
// in JSON format is straightforward.
jsonHandler := slog.NewJSONHandler(os.Stderr, nil)
myslog := slog.New(jsonHandler)
myslog.Info("hi there")

// In addition to the message, `slog` output can
// contain an arbitrary number of key=value
// pairs.
myslog.Info("hello again", "key", "val", "age", 25)
}
2 changes: 2 additions & 0 deletions examples/logging/logging.hash
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
38a7ef451859bb4c163df938b3a9d0e5ac293bef
Qd0uCqBlYUn
18 changes: 18 additions & 0 deletions examples/logging/logging.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Sample output; the date and time
# emitted will depend on when the example ran.
$ go run logging.go
2023/08/22 10:45:16 standard logger
2023/08/22 10:45:16.904141 with micro
2023/08/22 10:45:16 logging.go:40: with file/line
my:2023/08/22 10:45:16 from mylog
ohmy:2023/08/22 10:45:16 from mylog
from buflog:buf:2023/08/22 10:45:16 hello

# These are wrapped for clarity of presentation
# on the website; in reality they are emitted
# on a single line.
{"time":"2023-08-22T10:45:16.904166391-07:00",
"level":"INFO","msg":"hi there"}
{"time":"2023-08-22T10:45:16.904178985-07:00",
"level":"INFO","msg":"hello again",
"key":"val","age":25}
4 changes: 2 additions & 2 deletions public/environment-variables

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion public/http-client

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions public/index.html

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading

0 comments on commit 15d8fe7

Please sign in to comment.