Docs / Libraries
Go
Use the justlog3 Go module: loggers, options, cloud sending and why Shutdown() matters.
The justlog3 Go module writes log lines to a file from a background goroutine and, once you set an API token, sends them to JustLog3 Cloud. It uses only the standard library.
Install
go get github.com/OAzizjon/justlog3/go
Go 1.23 or newer. The package name is justlog3. Reference: pkg.go.dev.
Log to a file and the cloud
package main
import (
"log"
"os"
justlog3 "github.com/OAzizjon/justlog3/go"
)
func main() {
err := justlog3.SetAPIToken(os.Getenv("JUSTLOG3_TOKEN"),
justlog3.WithURL("https://jl3-cloud.site/api/logs/"))
if err != nil {
log.Fatal(err)
}
defer justlog3.Shutdown() // flushes files and sends what is left
logger, err := justlog3.NewLogger("app.log")
if err != nil {
log.Fatal(err)
}
logger.Log("Hi...")
logger.Log("There is some error!", justlog3.Red())
logger.Log("OK", justlog3.Green())
logger.Log("There is critical error!", justlog3.Red(), justlog3.Prefix("CRITICAL!!"))
}
Always call Shutdown
Go has no exit hook. Without justlog3.Shutdown() (or logger.Flush() / logger.Close()) the last buffered lines are lost. log.Fatal and os.Exit skip deferred calls, so flush before them.
Levels
logger, _ := justlog3.NewBasicLogger("app.log", justlog3.WithConsoleLevel("INFO"))
logger.Debug("only in the file and cloud")
logger.Info("started")
logger.Successf("processed %d items", 42)
logger.Error("payment failed")
WithConsoleLevel only filters the console. Every level has an f variant (Infof, Errorf, ...).
How cloud sending works
- Each logger keeps a cloud buffer of up to 10,000 lines; the oldest lines are dropped on overflow.
- Batches go out when
WithCloudCycles(n)lines are waiting (default 75) or every flush interval (default 5 s), at mostWithMaxBatch(n)lines (default 100) and 512 KB of text each. Bodies from 1 KB are gzip-compressed. - No answer or HTTP 5xx: the batch is resent unchanged with the same
X-JustLog-Seq, so the server stores it once. - HTTP 429: nothing is sent until
Retry-After. HTTP 413: later batches carry half as many lines. - HTTP 401 / 403: cloud sending stops and files keep being written. Call
SetAPITokenagain to resume.
Cloud options: WithURL(url), WithFlushInterval(d), WithTimeout(d), WithMaxBatch(n).
Logger options
| Option | Default | Meaning |
|---|---|---|
WithTime(bool) |
true |
timestamp in every line |
WithFilemode("a" or "w") |
"a" |
"w" truncates the file once on creation |
WithCycles(n) |
50 |
lines per disk write |
WithCloudCycles(n) |
75 |
waiting lines that wake the cloud sender |
WithConsoleLevel(level) |
"DEBUG" |
BasicLogger only |
The file stays open and is reopened if it is renamed or deleted, so log rotation works, on Windows too.