log

package
v1.2.3 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 26, 2025 License: MIT Imports: 24 Imported by: 32

README

Pango Log

A Go Log library like Log4j. It can use many log writers. This package is inspired by https://github.com/pandafw/panda/tree/master/panda-core/src/main/java/panda/log .

How to install?
go get github.com/askasoft/pango
What writers are supported?

As of now this log support stream(console), file, smtp, connection(tcp), webhook(slack, teams).

How to use it?

First you must import it

import (
	"github.com/askasoft/pango/log"
)

Then init a Log (example with console writer)

log := log.NewLog()
log.SetWriter(log.NewSyncWriter(&log.StreamWriter{Color:true}))

Use it like this:

log.Trace("trace")
log.Debug("debug")
log.Info("info")
log.Warn("warning")
log.Fatal("fatal")
File writer

Configure file writer like this:

import (
	"github.com/askasoft/pango/log"
)

func main() {
	log := log.NewLog()
	log.SetWriter(log.NewSyncWriter(&log.FileWriter{Path:"test.log"}))
}
Conn writer

Configure like this:

import (
	"github.com/askasoft/pango/log"
)

func main() {
	log := log.NewLog()
	log.SetWriter(log.NewSyncWriter(&log.ConnWriter{Net:"tcp",Addr:":7020"}))
	log.Info("info")
}
Slack writer

Configure like this:

import (
	"github.com/askasoft/pango/log"
	"github.com/askasoft/pango/log/writers/slacklog"
)

func main() {
	log := log.NewLog()
	log.SetWriter(log.NewSyncWriter(&slacklog.SlackWriter{
		Webhook: "https://hooks.slack.com/services/...",
		Channel: "alert",
		Username: "gotest",
	}))
	log.Error("error")
}
SMTP writer

Configure like this:

import (
	"github.com/askasoft/pango/log"
	"github.com/askasoft/pango/log/writers/smtplog"
)

func main() {
	log := log.NewLog()
	log.SetWriter(log.NewSyncWriter(&smtplog.SMTPWriter{
		Host: "smtp.gmail.com",
		Port: 587,
		Username: "pangotest@gmail.com",
		Password: "xxxxxxxx",
		From: "xxxx@gmail.com",
		Tos: []string{"someone@gmail.com"},
	}))
	log.Fatal("oh my god!")
}
Teams writer

Configure like this:

import (
	"github.com/askasoft/pango/log"
	"github.com/askasoft/pango/log/writers/teamslog"
)

func main() {
	log := log.NewLog()
	log.SetWriter(log.NewSyncWriter(&teamslog.TeamsWriter{
		Webhook: "https://xxx.webhook.office.com/webhookb2/...",
	}))
	log.Error("error")
}
HTTP writer

Configure like this:

import (
	"github.com/askasoft/pango/log"
	"github.com/askasoft/pango/log/httplog"
)

func main() {
	log := log.NewLog()
	hw := &httplog.HTTPWriter{
		URL: "http://localhost:9200/pango_logs/_doc",
		ContentType: "application/json",
		Timeout: time.Second*5,
	}
	hw.SetFormat(`json:{"time": %t{2006-01-02T15:04:05.000Z07:00}, "level": %l, "name": %c, "file": %S, "line": %L, "func": %F, "msg": %m, "trace": %T}%n`)

	log.SetWriter(log.NewSyncWriter(hw))
	log.Fatal("fatal error!")
}
HTTP batch writer

Configure like this:

import (
	"github.com/askasoft/pango/log"
	"github.com/askasoft/pango/log/httplog"
)

func main() {
	log := log.NewLog()
	hw := &httplog.HTTPWriter{
		URL: "http://localhost:9200/pango_logs/_bulk",
		ContentType: "application/json",
		Timeout: time.Second*5,
		BatchSupport: log.BatchSupport{
			BatchCount: 3,
			CacheCount: 6,
			FlushLevel: LevelWarn,
			FlushDelta: time.Second,
		},
	}
	hw.SetFormat(`json:{"create": {}}%n{"time": %t{2006-01-02T15:04:05.000Z07:00}, "level": %l, "name": %c, "file": %S, "line": %L, "func": %F, "msg": %m, "trace": %T}%n`)

	log.SetWriter(log.NewSyncWriter(hw))
	log.Fatal("fatal error!")
}
Multiple writer

Configure like this:

import (
	"github.com/askasoft/pango/log"
	"github.com/askasoft/pango/log/httplog"
)

func main() {
	log := log.NewLog()
	fw := &log.FileWriter{Path:"test.log"}
	hw := &log.HTTPWriter{
		URL: "http://localhost:9200/pango_logs/_doc",
		ContentType: "application/json",
		Timeout: time.Second*5,
	}
	log.SetWriter(log.NewSyncWriter(log.NewMultiWriter(fw, hw)))
	log.Fatal("fatal error!")
}
Async writer

Configure like this:

import (
	"github.com/askasoft/pango/log"
	"github.com/askasoft/pango/log/httplog"
)

func main() {
	log := log.NewLog()
	hw := &log.HTTPWriter{
		URL: "http://localhost:9200/pango_logs/_doc",
		ContentType: "application/json",
		Timeout: time.Second*5,
	}
	log.SetWriter(log.NewAsyncWriter(hw, 1000))
	log.Fatal("fatal error!")
}
Configure from ini file
import (
	"github.com/askasoft/pango/log"
	_ "github.com/askasoft/pango/log/httplog"
	_ "github.com/askasoft/pango/log/slacklog"
	_ "github.com/askasoft/pango/log/smtplog"
	_ "github.com/askasoft/pango/log/teamslog"
)

func main() {
	log := log.NewLog()
	log.Config("log.ini")
}
log.ini
### log async ###
# > 0 : do asynchronize wrap 
# < 0 : do synchronize wrap
# = 0 : do nothing (default)
async = 1000

### global log format ###
#format = json:{"level":%l, "file":%S, "func":%F, "msg": %m}%n
format = text:%l %S %F() - %m%n%T

### log writer ###
writer = stdout, stderr, tcp, dailyfile, slack, smtp, opensearch

### log level ###
[level]
* = info
sql = debug
http = trace

### stdout writer ###
[writer.stdout]
format = %l - %m%n%T
filter = name:out level:debug

### tcp writer ###
[writer.tcp]
_async = 1000
addr = localhost:9999
timeout = 5s
format = %l - %m%n%T
filter = level:error

### file writer ###
[writer.dailyfile]
_ = file
path = /tmp/gotest/logs/test.log
dirPerm = 0777
maxDays = 7
format = %l %S:%L %F() - %m%n%T
filter = level:error

### slack writer ###
[writer.slack]
_async = 1000
subject = %l - %m 
channel = develop
username = gotest
webhook = https://hooks.slack.com/services/...
timeout = 5s
format = %l - %m%n%T
filter = level:error

### smtp writer ###
[writer.smtp]
_async = 1000
host = localhost
port = 25
username = -----
password = xxxxxxx
from = pango@google.com
to = to1@test.com, to2@test.com
cc = cc1@test.com, cc2@test.com
timeout = 5s
subject = %l - %m 
format = %l - %m%n%T
filter = level:error

### teams writer ###
[writer.teams]
_async = 1000
webhook = https://xxx.webhook.office.com/webhookb2/...
timeout = 5s
format = %l - %m%n%T
filter = level:error

### opensearch writer ###
[writer.opensearch]
_ = http
_async = 1000
url = http://localhost:9200/pango_logs/_bulk
contentType = application/json
timeout = 5s
batchCount = 10
cacheCount = 20
flushLevel = ERROR
flushDelta = 5s
format = json:{"create": {}}%n{"time": %t{2006-01-02T15:04:05.000Z07:00}, "level": %l, "name": %c, "file": %S, "line": %L, "func": %F, "msg": %m, "trace": %T}%n
filter = level:debug

Documentation

Overview

Package log provide a general log interface Usage:

import "github.com/askasoft/pango/log"

log := log.NewLog()
log.SetWriter(log.NewAsyncWriter(log.NewConsoleWriter()))

Use it like this:

log.Fatal("fatal")
log.Error("error")
log.Warn("warning")
log.Info("info")
log.Debug("debug")
log.Trace("trace")

A Logger with name:

log := log.GetLogger("foo")
log.Debug("hello")

Index

Constants

This section is empty.

Variables

View Source
var EOL = iox.EOL

EOL windows: "\r\n" other: "\n"

View Source
var JSONFmtDefault = newJSONFormatter(`{"time": %t, "level": %l, "name": %c, "host": %h, "file": %S, "line": %L, "func": %F, "msg": %m, "trace": %T}%n`)

JSONFmtDefault default log format `{"time": %t, "level": %l, "name": %c, "host": %h, "file": %S, "line": %L, "func": %F, "msg": %m, "trace": %T}%n`

View Source
var (
	MaxCallerFrames = 50
)
View Source
var TextFmtDefault = newTextFormatter("%t %l{-5s} %c %S:%L %F() - %m%n%T")

TextFmtDefault default log format "%t %l{-5s} %c %S:%L %F() - %m%n%T"

View Source
var TextFmtSimple = newTextFormatter("[%p] %m%n")

TextFmtSimple simple log format "[%p] %m%n"

View Source
var TextFmtSubject = newTextFormatter("[%l] %m")

TextFmtSubject subject log format "[%l] %m"

Functions

func Close

func Close()

Close will remove all writers and stop async goroutine

func Config

func Config(filename string) error

Config config log by configuration file

func ConfigWriter

func ConfigWriter(w Writer, c map[string]any) error

ConfigWriter config the writer by the configuration map 'c'

func Debug

func Debug(v ...any)

Debug print a message at debug level.

func Debugf

func Debugf(f string, v ...any)

Debugf format and print a message at debug level.

func Error

func Error(v ...any)

Error print a message at error level.

func Errorf

func Errorf(f string, v ...any)

Errorf format and print a message at error level.

func Fatal

func Fatal(code int, v ...any)

Fatal print a message at fatal level, close the logs and call os.Exit(code).

func Fatalf

func Fatalf(code int, f string, v ...any)

Fatalf format and print a message at fatal level, close the logs and call os.Exit(code).

func Flush added in v1.0.27

func Flush()

Flush flush all chan data.

func GetCallerSkip added in v1.0.27

func GetCallerSkip() int

GetCallerSkip return the logger's caller skip

func GetProp

func GetProp(k string) any

GetProp get logger property

func GetProps

func GetProps() map[string]any

GetProps get logger properties

func Info

func Info(v ...any)

Info print a message at info level.

func Infof

func Infof(f string, v ...any)

Infof format and print a message at info level.

func IsDebugEnabled

func IsDebugEnabled() bool

IsDebugEnabled is DEBUG level enabled

func IsErrorEnabled

func IsErrorEnabled() bool

IsErrorEnabled is ERROR level enabled

func IsFatalEnabled

func IsFatalEnabled() bool

IsFatalEnabled is FATAL level enabled

func IsInfoEnabled

func IsInfoEnabled() bool

IsInfoEnabled is INFO level enabled

func IsTraceEnabled

func IsTraceEnabled() bool

IsTraceEnabled is TRACE level enabled

func IsWarnEnabled

func IsWarnEnabled() bool

IsWarnEnabled is WARN level enabled

func Perror added in v1.1.0

func Perror(a any)

Perror print error message to stderr

func Perrorf added in v1.1.0

func Perrorf(format string, a ...any)

Perrorf print formatted error message to stderr

func RegisterFilter

func RegisterFilter(name string, fc FilterCreator)

RegisterFilter register log filter type

func RegisterWriter

func RegisterWriter(name string, wc WriterCreator)

RegisterWriter register log writer type

func SetCallerSkip added in v1.0.27

func SetCallerSkip(n int)

SetCallerSkip set the logger's caller skip (!!SLOW!!), 0: disable runtime.Caller()

func SetLevel

func SetLevel(lvl Level)

SetLevel set the logger's level

func SetLevels

func SetLevels(lvls map[string]Level)

SetLevels set the logger levels

func SetProp

func SetProp(k string, v any)

SetProp set logger property

func SetProps

func SetProps(props map[string]any)

SetProps set logger properties

func SetWriter

func SetWriter(lw Writer)

SetWriter set the writer.

func SwitchWriter added in v1.0.27

func SwitchWriter(lw Writer)

SwitchWriter use lw to replace the log writer

func Trace

func Trace(v ...any)

Trace print a message at trace level.

func Tracef

func Tracef(f string, v ...any)

Tracef format and print a message at trace level.

func Warn

func Warn(v ...any)

Warn print a message at warning level.

func Warnf

func Warnf(f string, v ...any)

Warnf format and print a message at warning level.

Types

type AndFilter added in v1.0.27

type AndFilter struct {
	Filters []Filter
}

AndFilter a AND multiple filter

func NewAndFilter added in v1.0.27

func NewAndFilter(fs ...Filter) *AndFilter

NewAndFilter create a AND multiple filter

func (*AndFilter) Reject added in v1.0.27

func (af *AndFilter) Reject(le *Event) bool

Reject reject event if any filter reject it

type AsyncWriter

type AsyncWriter struct {
	// contains filtered or unexported fields
}

AsyncWriter wrapper a log writer to implement asynchrous write

func NewAsyncWriter

func NewAsyncWriter(w Writer, size int) *AsyncWriter

NewAsyncWriter create a async writer and start go routine

func (*AsyncWriter) Close

func (aw *AsyncWriter) Close()

Close Close the underlying writer and wait it for done

func (*AsyncWriter) Flush

func (aw *AsyncWriter) Flush()

Flush async flush the underlying writer

func (*AsyncWriter) SetWriter

func (aw *AsyncWriter) SetWriter(w Writer)

SetWriter send a "switch" signal to switch the writer to `w` and close the old writer

func (*AsyncWriter) Start

func (aw *AsyncWriter) Start()

Start start async log go-routine

func (*AsyncWriter) Stop

func (aw *AsyncWriter) Stop()

Stop send a "stop" signal to the run() go-routine

func (*AsyncWriter) Wait added in v1.0.27

func (aw *AsyncWriter) Wait()

Wait wait for the run() go-routine exit

func (*AsyncWriter) Write

func (aw *AsyncWriter) Write(le *Event)

Write async write the log event

type BatchSupport added in v1.0.27

type BatchSupport struct {
	BatchCount  int           // flush events if events count >= BatchCount
	CacheCount  int           // the maximun cacheable event count
	FlushLevel  Level         // flush events if event <= FlushLevel
	FlushDelta  time.Duration // flush events if [time.Now()] - [first log event time] >= FlushDelta
	BatchBuffer EventBuffer
}

BatchSupport support event cache and flush events on FlushLevel or BatchCount reached.

func (*BatchSupport) BatchFlush added in v1.0.27

func (bs *BatchSupport) BatchFlush(flush func(*EventBuffer) error)

func (*BatchSupport) BatchWrite added in v1.0.27

func (bs *BatchSupport) BatchWrite(le *Event, flush func(*EventBuffer) error)

func (*BatchSupport) SetFlushLevel added in v1.0.27

func (bs *BatchSupport) SetFlushLevel(lvl string)

SetFlushLevel set the flush level

type BridgeWriter added in v1.0.10

type BridgeWriter struct {
	Logger Logger
}

func NewBridgeWriter added in v1.0.10

func NewBridgeWriter(logger Logger) *BridgeWriter

func (*BridgeWriter) Close added in v1.0.10

func (bw *BridgeWriter) Close()

func (*BridgeWriter) Flush added in v1.0.10

func (bw *BridgeWriter) Flush()

func (*BridgeWriter) Write added in v1.0.10

func (bw *BridgeWriter) Write(le *Event)

type ConnWriter

type ConnWriter struct {
	FilterSupport
	FormatSupport

	Net     string
	Addr    string
	Timeout time.Duration
	// contains filtered or unexported fields
}

ConnWriter implements Writer. it writes messages in keep-live tcp connection.

func (*ConnWriter) Close

func (cw *ConnWriter) Close()

Close close the connection.

func (*ConnWriter) Flush

func (cw *ConnWriter) Flush()

Flush do nothing.

func (*ConnWriter) SetTimeout

func (cw *ConnWriter) SetTimeout(timeout string) error

SetTimeout set timeout

func (*ConnWriter) Write

func (cw *ConnWriter) Write(le *Event)

Write write logger message to connection.

type Event

type Event struct {
	Name    string
	Props   map[string]any
	Level   Level
	Time    time.Time
	Message string
	File    string
	Line    int
	Func    string
	Trace   string
}

Event log event

func NewEvent added in v1.0.22

func NewEvent(logger Logger, lvl Level, msg string) *Event

NewEvent create a log event without caller information

func (*Event) CallerSkip added in v1.0.27

func (le *Event) CallerSkip(skip int, trace bool)

CallerSkip get caller filename and line number

func (*Event) CallerStop added in v1.0.10

func (le *Event) CallerStop(stop string, trace bool)

CallerStop get caller filename and line number

type EventBuffer

type EventBuffer = ringbuffer.RingBuffer[*Event]

EventBuffer a event buffer

type FileWriter

type FileWriter struct {
	FilterSupport
	FormatSupport

	Path      string // Log file path name
	DirPerm   uint32 // Log dir permission
	FilePerm  uint32 // Log file permission
	MaxSplit  int    // Max split files
	MaxSize   int64  // Rotate at size
	MaxDays   int    // Max daily files
	MaxHours  int    // Max hourly files
	Gzip      bool   // Compress rotated log files
	SyncLevel Level  // Call File.Sync() if level <= SyncLevel
	// contains filtered or unexported fields
}

FileWriter implements Writer. It writes messages and rotate by file size limit, daily, hourly.

func (*FileWriter) Close

func (fw *FileWriter) Close()

Close close the file description, close file writer.

func (*FileWriter) Flush

func (fw *FileWriter) Flush()

Flush flush file logger. there are no buffering messages in file logger in memory. flush file means sync file to disk.

func (*FileWriter) SetMaxSize

func (fw *FileWriter) SetMaxSize(maxSize string)

SetMaxSize set the MaxSize

func (*FileWriter) SetSyncLevel

func (fw *FileWriter) SetSyncLevel(lvl string)

SetSyncLevel set the sync level

func (*FileWriter) Write

func (fw *FileWriter) Write(le *Event)

Write write logger message into file.

type Filter

type Filter interface {
	Reject(le *Event) bool
}

Filter log filter

func CreateFilter

func CreateFilter(name string, conf string) Filter

CreateFilter create a log filter by name and config

func NewLogFilter

func NewLogFilter(expr string) Filter

NewLogFilter parse filter expression to create a log filter

func NewNameNotFilter

func NewNameNotFilter(name string) Filter

NewNameNotFilter create a name filter (not equal)

func ParseFilter added in v1.0.27

func ParseFilter(expr string) Filter

ParseFilter parse filter expression "name:condition" to create a log filter

type FilterCreator

type FilterCreator func(s string) Filter

FilterCreator filter create function

type FilterSupport added in v1.0.27

type FilterSupport struct {
	Filter Filter // log filter
}

func (*FilterSupport) Reject added in v1.0.27

func (fs *FilterSupport) Reject(le *Event) bool

func (*FilterSupport) SetFilter added in v1.0.27

func (fs *FilterSupport) SetFilter(filter string)

SetFilter set the log filter

type FormatSupport added in v1.0.27

type FormatSupport struct {
	Formatter Formatter    // log formatter
	Buffer    bytes.Buffer // log buffer
}

func (*FormatSupport) Append added in v1.0.27

func (fs *FormatSupport) Append(le *Event, df ...Formatter)

Append format the log event and append to buffer

func (*FormatSupport) Format added in v1.0.27

func (fs *FormatSupport) Format(le *Event, df ...Formatter) []byte

Format format the log event

func (*FormatSupport) GetFormatter added in v1.0.27

func (fs *FormatSupport) GetFormatter(le *Event, df ...Formatter) Formatter

Format format the log event

func (*FormatSupport) SetFormat added in v1.0.27

func (fs *FormatSupport) SetFormat(format string)

SetFormat set the log formatter

type Formatter

type Formatter interface {
	Write(w io.Writer, le *Event)
}

Formatter log formatter interface

func NewLogFormatter

func NewLogFormatter(format string) Formatter

NewLogFormatter create a text or json formatter text:[%p] %m%n -> TextFormatter json:{"level":%l, "msg": %m}%n -> JSONFormatter

type JSONFormatter

type JSONFormatter struct {
	// contains filtered or unexported fields
}

JSONFormatter json formatter

func NewJSONFormatter

func NewJSONFormatter(format string) *JSONFormatter

NewJSONFormatter create a Json Formatter instance JSON Format %t{format}: time, if {format} is omitted, '2006-01-02T15:04:05.000Z07:00' will be used %c{format}: logger name %p{format}: log level prefix %l{format}: log level string %h{format}: hostname %e{key}: os environment variable %x{key}: logger property %X: logger properties (json format) %S: caller source file name %L: caller source line number %F: caller function name %T: caller stack trace %m: message %n: EOL(Windows: "\r\n", Other: "\n")

func (*JSONFormatter) SetFormat added in v1.0.12

func (jf *JSONFormatter) SetFormat(format string)

SetFormat initialize the json formatter

func (*JSONFormatter) Write

func (jf *JSONFormatter) Write(w io.Writer, le *Event)

Write format the log event as a json string to the writer w

type Level

type Level uint32

Level log level

const (
	LevelNone Level = iota
	LevelFatal
	LevelError
	LevelWarn
	LevelInfo
	LevelDebug
	LevelTrace
)

Log level

func GetLevel

func GetLevel() Level

GetLevel return the logger's level

func ParseLevel

func ParseLevel(lvl string) Level

ParseLevel parse level from string

func (Level) Prefix

func (l Level) Prefix() string

Prefix return level prefix

func (Level) String

func (l Level) String() string

String return level string

type LevelFilter

type LevelFilter struct {
	Level Level
}

LevelFilter log level filter

func NewLevelFilter

func NewLevelFilter(lvl Level) *LevelFilter

NewLevelFilter create a level filter

func (*LevelFilter) Reject

func (lf *LevelFilter) Reject(le *Event) bool

Reject filter event by logger name

type Log

type Log struct {
	// contains filtered or unexported fields
}

Log is default logger in application. it can contain several writers and log message into all writers.

func Default

func Default() *Log

Default returns the default Log instance used by the package-level functions.

func NewLog

func NewLog() *Log

NewLog returns a new Log.

func (*Log) Close

func (log *Log) Close()

Close close logger, flush all data and close the writer.

func (*Log) Config

func (log *Log) Config(filename string) error

Config config log by configuration file

func (*Log) Debug

func (log *Log) Debug(v ...any)

Debug print a message at debug level.

func (*Log) Debugf

func (log *Log) Debugf(f string, v ...any)

Debugf format and print a message at debug level.

func (*Log) Error

func (log *Log) Error(v ...any)

Error print a message at error level.

func (*Log) Errorf

func (log *Log) Errorf(f string, v ...any)

Errorf format and print a message at error level.

func (*Log) Fatal

func (log *Log) Fatal(code int, v ...any)

Fatal print a message at fatal level, close the logs and call os.Exit(code).

func (*Log) Fatalf

func (log *Log) Fatalf(code int, f string, v ...any)

Fatalf format and print a message at fatal level, close the logs and call os.Exit(code).

func (*Log) Flush

func (log *Log) Flush()

Flush flush all chan data.

func (*Log) GetCallerSkip added in v1.0.27

func (log *Log) GetCallerSkip() int

GetCallerSkip return the logger's caller skip

func (*Log) GetLevel

func (log *Log) GetLevel() Level

GetLevel return the logger's level

func (*Log) GetLogger

func (log *Log) GetLogger(name string) Logger

GetLogger returns a new Logger with name

func (*Log) GetLoggerLevel added in v1.0.27

func (log *Log) GetLoggerLevel(name string) Level

GetLoggerLevel get the named logger level

func (*Log) GetName

func (log *Log) GetName() string

GetName return the logger's name

func (*Log) GetOutputer

func (log *Log) GetOutputer(name string, lvl Level, callerSkip ...int) Outputer

Outputer return a io.Writer for go log.SetOutput callerSkip: default is 1 (means +1) if the outputer is used by go std log, set callerSkip to 2 example:

import (
  golog "log"
  "github.com/askasoft/pango/log"
)
golog.SetOutput(log.Outputer("GO", log.LevelInfo, 3))

func (*Log) GetProp

func (log *Log) GetProp(k string) any

GetProp get logger property

func (*Log) GetProps

func (log *Log) GetProps() map[string]any

GetProps get logger properties

func (*Log) GetTraceLevel

func (log *Log) GetTraceLevel() Level

GetTraceLevel return the logger's trace level

func (*Log) GetWriter

func (log *Log) GetWriter() Writer

GetWriter get the log writer

func (*Log) Info

func (log *Log) Info(v ...any)

Info print a message at info level.

func (*Log) Infof

func (log *Log) Infof(f string, v ...any)

Infof format and print a message at info level.

func (*Log) IsDebugEnabled

func (log *Log) IsDebugEnabled() bool

IsDebugEnabled is DEBUG level enabled

func (*Log) IsErrorEnabled

func (log *Log) IsErrorEnabled() bool

IsErrorEnabled is ERROR level enabled

func (*Log) IsFatalEnabled

func (log *Log) IsFatalEnabled() bool

IsFatalEnabled is FATAL level enabled

func (*Log) IsInfoEnabled

func (log *Log) IsInfoEnabled() bool

IsInfoEnabled is INFO level enabled

func (*Log) IsLevelEnabled

func (log *Log) IsLevelEnabled(lvl Level) bool

IsLevelEnabled is specified level enabled

func (*Log) IsTraceEnabled

func (log *Log) IsTraceEnabled() bool

IsTraceEnabled is TRACE level enabled

func (*Log) IsWarnEnabled

func (log *Log) IsWarnEnabled() bool

IsWarnEnabled is WARN level enabled

func (*Log) Log

func (log *Log) Log(lvl Level, v ...any)

Log print a message at specified level.

func (*Log) Logf

func (log *Log) Logf(lvl Level, f string, v ...any)

Logf format and print a message at specified level.

func (*Log) SetCallerSkip added in v1.0.27

func (log *Log) SetCallerSkip(n int)

SetCallerSkip set the logger's caller skip (!!SLOW!!), 0: disable runtime.Caller()

func (*Log) SetLevel

func (log *Log) SetLevel(lvl Level)

SetLevel set the logger's level

func (*Log) SetLevels

func (log *Log) SetLevels(lvls map[string]Level)

SetLevels set the logger levels

func (*Log) SetProp

func (log *Log) SetProp(k string, v any)

SetProp set logger property

func (*Log) SetProps

func (log *Log) SetProps(props map[string]any)

SetProps set logger properties

func (*Log) SetTraceLevel

func (log *Log) SetTraceLevel(lvl Level)

SetTraceLevel set the logger's trace level

func (*Log) SetWriter

func (log *Log) SetWriter(lw Writer)

SetWriter set the log writer

func (*Log) SwitchWriter

func (log *Log) SwitchWriter(lw Writer)

SwitchWriter use lw to replace the log writer

func (*Log) Trace

func (log *Log) Trace(v ...any)

Trace print a message at trace level.

func (*Log) Tracef

func (log *Log) Tracef(f string, v ...any)

Tracef format and print a message at trace level.

func (*Log) Warn

func (log *Log) Warn(v ...any)

Warn print a message at warning level.

func (*Log) Warnf

func (log *Log) Warnf(f string, v ...any)

Warnf format and print a message at warning level.

func (*Log) Write added in v1.0.10

func (log *Log) Write(le *Event)

Write write a log event

type Logger

type Logger interface {
	// GetLogger create a new logger with name
	GetLogger(name string) Logger

	// Outputer return a io.Writer for go log.SetOutput
	// callerSkip: default is 1 (means +1)
	// if the outputer is used by go std log, set callerSkip to 2
	// example:
	//
	//	import (
	//	  golog "log"
	//	  "github.com/askasoft/pango/log"
	//	)
	//	golog.SetOutput(log.Outputer("GO", log.LevelInfo, 3))
	GetOutputer(name string, lvl Level, callerSkip ...int) Outputer

	// GetName return the logger's name
	GetName() string

	// GetLevel return the logger's level
	GetLevel() Level

	// GetTraceLevel return the logger's trace level
	GetTraceLevel() Level

	// GetCallerSkip return the logger's caller skip
	GetCallerSkip() int

	// SetCallerSkip set the logger's caller skip (!!SLOW!!), 0: disable runtime.Caller()
	SetCallerSkip(n int)

	// GetProp get logger property
	GetProp(k string) any

	// SetProp set logger property
	SetProp(k string, v any)

	// GetProps get logger properties
	GetProps() map[string]any

	// SetProps set logger properties
	SetProps(map[string]any)

	// IsLevelEnabled is specified level enabled
	IsLevelEnabled(lvl Level) bool

	// IsFatalEnabled is FATAL level enabled
	IsFatalEnabled() bool

	// Fatal print a fatal message, close the logs and call [os.Exit](code)
	Fatal(code int, v ...any)

	// Fatalf format and print a fatal message, close the logs and call [os.Exit](code)
	Fatalf(code int, f string, v ...any)

	// IsErrorEnabled is ERROR level enabled
	IsErrorEnabled() bool

	// Error print a message at error level.
	Error(v ...any)

	// Errorf format and print a message at error level.
	Errorf(f string, v ...any)

	// IsWarnEnabled is WARN level enabled
	IsWarnEnabled() bool

	// Warn print a message at warning level.
	Warn(v ...any)

	// Warnf format and print a message at warning level.
	Warnf(f string, v ...any)

	// IsInfoEnabled is INFO level enabled
	IsInfoEnabled() bool

	// Info print a message at info level.
	Info(v ...any)

	// Infof format and print a message at info level.
	Infof(f string, v ...any)

	// IsDebugEnabled is DEBUG level enabled
	IsDebugEnabled() bool

	// Debug print a message at debug level.
	Debug(v ...any)

	// Debugf format and print a message at debug level.
	Debugf(f string, v ...any)

	// IsTraceEnabled is TRACE level enabled
	IsTraceEnabled() bool

	// Trace print a message at trace level.
	Trace(v ...any)

	// Tracef format and print a message at trace level.
	Tracef(f string, v ...any)

	// Log print a message at specified level.
	Log(lvl Level, v ...any)

	// Logf format and print a message at specified level.
	Logf(lvl Level, f string, v ...any)

	// Write write a log event
	Write(le *Event)
}

Logger logger interface

func GetLogger

func GetLogger(name string) Logger

GetLogger returns a new logger

type MultiWriter

type MultiWriter struct {
	Writers []Writer
}

MultiWriter write log to multiple writers.

func NewMultiWriter

func NewMultiWriter(ws ...Writer) *MultiWriter

NewMultiWriter create a multi writer

func (*MultiWriter) Close

func (mw *MultiWriter) Close()

Close close multiple writers.

func (*MultiWriter) Flush

func (mw *MultiWriter) Flush()

Flush flush multiple writers.

func (*MultiWriter) Write

func (mw *MultiWriter) Write(le *Event)

Write write log event to multiple writers.

type NameFilter

type NameFilter struct {
	Name string
}

NameFilter logger name filter

func NewNameFilter

func NewNameFilter(name string) *NameFilter

NewNameFilter create a name filter

func (*NameFilter) Reject

func (nf *NameFilter) Reject(le *Event) bool

Reject filter event by logger name

type NameNotFilter

type NameNotFilter struct {
	Name string
}

NameNotFilter logger name filter

func (*NameNotFilter) Reject

func (nnf *NameNotFilter) Reject(le *Event) bool

Reject filter event by logger name

type NopWriter

type NopWriter struct {
}

NopWriter implements Writer. Do nothing.

func (*NopWriter) Close

func (nw *NopWriter) Close()

Close do nothing.

func (*NopWriter) Flush

func (nw *NopWriter) Flush()

Flush do nothing.

func (*NopWriter) Write

func (nw *NopWriter) Write(le *Event)

Write do nothing.

type OrFilter added in v1.0.27

type OrFilter struct {
	Filters []Filter
}

OrFilter a OR multiple filter

func NewOrFilter added in v1.0.27

func NewOrFilter(fs ...Filter) *OrFilter

NewOrFilter create a OR multiple filter

func (*OrFilter) Reject added in v1.0.27

func (of *OrFilter) Reject(le *Event) bool

Reject accept event if any filter accept it

type Outputer

type Outputer interface {
	io.Writer
	Printf(format string, args ...any)
}

Outputer interface for io.Writer

func GetOutputer

func GetOutputer(name string, lvl Level, callerSkip ...int) Outputer

GetOutputer return a io.Writer for go log.SetOutput callerSkip: default is 1 (means +1) if the outputer is used by go std log, set callerSkip to 2 example:

import (
  golog "log"
  "github.com/askasoft/pango/log"
)
golog.SetOutput(log.Outputer("GO", log.LevelInfo, 2))

type RetrySupport added in v1.0.27

type RetrySupport struct {
	Retries     int
	RetryBuffer EventBuffer
}

RetrySupport cache event if write failed, and retry write when the next log event come.

func (*RetrySupport) RetryFlush added in v1.0.27

func (rs *RetrySupport) RetryFlush(write func(*Event) error)

func (*RetrySupport) RetryWrite added in v1.0.27

func (rs *RetrySupport) RetryWrite(le *Event, write func(*Event) error)

type StreamWriter

type StreamWriter struct {
	FilterSupport
	FormatSupport

	Color  bool      // this field is useful only when system's terminal supports color.
	Output io.Writer // output writer. if nil, use os.Stdout as default or os.Stderr at Error level.
}

StreamWriter implements log Writer Interface and writes messages to terminal.

func NewConsoleWriter

func NewConsoleWriter() *StreamWriter

NewConsoleWriter create a color console log writer

func NewStderrWriter

func NewStderrWriter() *StreamWriter

NewStderrWriter create a stderr writer

func NewStdoutWriter

func NewStdoutWriter() *StreamWriter

NewStdoutWriter create a stdout log writer

func (*StreamWriter) Close

func (sw *StreamWriter) Close()

Close implementing method. empty.

func (*StreamWriter) Flush

func (sw *StreamWriter) Flush()

Flush implementing method. empty.

func (*StreamWriter) Write

func (sw *StreamWriter) Write(le *Event)

Write write message to output writer. If Output is nil, use os.Stdout as default or os.Stderr at Error level.

type SubjectSuport added in v1.0.27

type SubjectSuport struct {
	Subjecter Formatter    // log formatter
	SubBuffer bytes.Buffer // log buffer
}

func (*SubjectSuport) SetSubject added in v1.0.27

func (ss *SubjectSuport) SetSubject(format string)

SetSubject set the subject formatter

func (*SubjectSuport) SubFormat added in v1.0.27

func (ss *SubjectSuport) SubFormat(le *Event) []byte

GetFormatter get Formatter

type SyncWriter

type SyncWriter struct {
	// contains filtered or unexported fields
}

SyncWriter synchronized log writer

func NewSyncWriter

func NewSyncWriter(w Writer) *SyncWriter

NewSyncWriter create a synchronized writer

func (*SyncWriter) Close

func (sw *SyncWriter) Close()

Close synchronize close the underlying writer

func (*SyncWriter) Flush

func (sw *SyncWriter) Flush()

Flush synchronize flush the underlying writer

func (*SyncWriter) SetWriter

func (sw *SyncWriter) SetWriter(w Writer)

SetWriter synchronize close the old log writer then set the new log writer

func (*SyncWriter) Write

func (sw *SyncWriter) Write(le *Event)

Write synchronize write log event

type TextFormatter

type TextFormatter struct {
	// contains filtered or unexported fields
}

TextFormatter text formatter

func NewTextFormatter

func NewTextFormatter(format string) *TextFormatter

NewTextFormatter create a Text Formatter instance Text Format %t{format}: time, if {format} is omitted, '2006-01-02T15:04:05.000Z07:00' will be used %c{format}: logger name %p{format}: log level prefix %l{format}: log level string %h{format}: hostname %e{key}: os environment variable %x{key}: logger property %X{=| }: logger properties (operator|separator) %S: caller source file name %L: caller source line number %F: caller function name %T: caller stack trace %m: message %q: quoted message %n: EOL(Windows: "\r\n", Other: "\n")

func (*TextFormatter) SetFormat added in v1.0.12

func (tf *TextFormatter) SetFormat(format string)

SetFormat initialize the text formatter

func (*TextFormatter) Write

func (tf *TextFormatter) Write(w io.Writer, le *Event)

Format format the log event to the writer w

type Writer

type Writer interface {
	Write(le *Event)
	Flush()
	Close()
}

Writer log writer interface

func CreateWriter

func CreateWriter(name string) Writer

CreateWriter create a writer by name

func GetWriter

func GetWriter() Writer

GetWriter get the writer

type WriterCreator

type WriterCreator func() Writer

WriterCreator writer create function

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL