log

package
v1.0.14 Latest Latest
Warning

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

Go to latest
Published: Mar 19, 2024 License: MIT Imports: 30 Imported by: 7

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:

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

Configure like this:

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

Configure like this:

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

Configure like this:

	log := log.NewLog()
	log.SetWriter(log.NewSyncWriter(&log.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:

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

Configure like this:

	log := log.NewLog()
	hw := &log.HTTPWriter{
		URL: "http://localhost:9200/pango_logs/_doc",
		ContentType: "application/json",
		Timeout: time.Second*5,
	}
	hw.SetFormat(`json:{"when": %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:

	log := log.NewLog()
	hw := &log.HTTPWriter{
		URL: "http://localhost:9200/pango_logs/_bulk",
		ContentType: "application/json",
		Timeout: time.Second*5,
		BatchWriter: BatchWriter{
			CacheCount: 6,
			BatchCount: 3,
			FlushLevel: LevelWarn,
			FlushDelta: time.Second,
		},
	}
	hw.SetFormat(`json:{"create": {}}%n{"when": %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:

	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:

	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
	log := log.NewLog()
	log.Config("log.ini")
log.ini
# log configuration #

### 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, webhook

### 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{"when": %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(`{"when": %t, "level": %l, "name": %c, "file": %S, "line": %L, "func": %F, "msg": %m, "trace": %T}%n`)

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

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 log a message at debug level.

func Debugf

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

Debugf format log a message at debug level.

func Error

func Error(v ...any)

Error log a message at error level.

func Errorf

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

Errorf format and log a message at error level.

func Fatal

func Fatal(v ...any)

Fatal log a message at fatal level.

func Fatalf

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

Fatalf format and log a message at fatal level.

func GetCallerDepth

func GetCallerDepth() int

GetCallerDepth return the logger's caller depth

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 log a message at info level.

func Infof

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

Infof format and log 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 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 SetCallerDepth

func SetCallerDepth(d int)

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

func SetFormat added in v1.0.10

func SetFormat(format string)

SetFormat set logger format

func SetFormatter

func SetFormatter(lf Formatter)

SetFormatter set the formatter.

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 Trace

func Trace(v ...any)

Trace log a message at trace level.

func TraceHttpRequest added in v1.0.10

func TraceHttpRequest(logger Logger, req *http.Request) (rid uint64)

func TraceHttpResponse added in v1.0.10

func TraceHttpResponse(logger Logger, res *http.Response, rid uint64)

func Tracef

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

Tracef format and log a message at trace level.

func Warn

func Warn(v ...any)

Warn log a message at warning level.

func Warnf

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

Warnf format and log a message at warning level.

Types

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) SafeStop added in v1.0.12

func (aw *AsyncWriter) SafeStop(d time.Duration)

SafeStop use time.NewTimer(d) to check the evtChan and sigChan, if these channels are empty, stop the run() go-routine.

func (*AsyncWriter) SetWriter

func (aw *AsyncWriter) SetWriter(w Writer)

SetWriter close the old writer and set the new writer

func (*AsyncWriter) Start

func (aw *AsyncWriter) Start(size int)

Start start the goroutine

func (*AsyncWriter) Stop

func (aw *AsyncWriter) Stop()

Stop stop the run() go-routine

func (*AsyncWriter) Write

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

Write async write the log event

type BatchWriter added in v1.0.12

type BatchWriter struct {
	BatchCount int           // event flush batch count
	CacheCount int           // max cacheable event count
	FlushLevel Level         // flush events if event <= FlushLevel
	FlushDelta time.Duration // flush events if [current log event time] - [first log event time] >= FlushDelta

	EventBuffer *EventBuffer
}

BatchWriter implements log Writer Interface and batch send log messages to webhook.

func (*BatchWriter) InitBuffer added in v1.0.12

func (wbw *BatchWriter) InitBuffer()

func (*BatchWriter) SetFlushLevel added in v1.0.12

func (wbw *BatchWriter) SetFlushLevel(lvl string)

SetFlushLevel set the flush level

func (*BatchWriter) ShouldFlush added in v1.0.12

func (wbw *BatchWriter) ShouldFlush(le *Event) bool

type BridgeWriter added in v1.0.10

type BridgeWriter struct {
	Logger Logger
}

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) error

type ConnWriter

type ConnWriter struct {
	LogFilter
	LogFormatter

	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 file description, close file writer.

func (*ConnWriter) Flush

func (cw *ConnWriter) Flush()

Flush implementing method. empty.

func (*ConnWriter) SetTimeout

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

SetTimeout set timeout

func (*ConnWriter) Write

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

Write write logger message to connection.

type Event

type Event struct {
	Logger Logger `json:"-"`
	Level  Level
	Msg    string
	When   time.Time
	File   string
	Line   int
	Func   string
	Trace  string
}

Event log event

func (*Event) CallerDepth added in v1.0.10

func (le *Event) CallerDepth(depth int, trace bool)

CallerDepth 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 struct {
	cog.RingBuffer[*Event]
	BufSize int
}

EventBuffer a event buffer

func NewEventBuffer added in v1.0.12

func NewEventBuffer(size int) *EventBuffer

func (*EventBuffer) Len

func (eb *EventBuffer) Len() int

Len returns the number of elements currently stored in the buffer.

func (*EventBuffer) Push

func (eb *EventBuffer) Push(le *Event)

Push push event to the buffer

type FailoverWriter

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

FailoverWriter wraps a log writer, cache log event if underlying log writer write failed. Resend the cached log events to the underlying log writer when the next log event come.

func NewFailoverWriter

func NewFailoverWriter(w Writer, bufSize int) *FailoverWriter

NewFailoverWriter create a failover writer

func (*FailoverWriter) Close

func (fw *FailoverWriter) Close()

Close implementing method. empty.

func (*FailoverWriter) Flush

func (fw *FailoverWriter) Flush()

Flush implementing method. empty.

func (*FailoverWriter) Write

func (fw *FailoverWriter) Write(le *Event) error

Write write event to underlying writer

type FileWriter

type FileWriter struct {
	LogFilter
	LogFormatter

	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) error

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(c string) Filter

NewLogFilter create a log filter by the configuration string 'c'

func NewNameNotFilter

func NewNameNotFilter(name string) Filter

NewNameNotFilter create a name filter (not equal)

type FilterCreator

type FilterCreator func(s string) Filter

FilterCreator filter create function

type Formatter

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

Formatter log formater interface

func GetFormatter

func GetFormatter() Formatter

GetFormatter get the formatter

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 HTTPWriter added in v1.0.12

type HTTPWriter struct {
	LogFilter
	LogFormatter
	BatchWriter

	URL         string // request URL
	Method      string // http method
	Insecure    bool
	Username    string // basic auth username
	Password    string // basic auth password
	ContentType string
	Timeout     time.Duration
	// contains filtered or unexported fields
}

HTTPWriter implements log Writer Interface and batch send log messages to webhook.

func (*HTTPWriter) Close added in v1.0.12

func (hw *HTTPWriter) Close()

Close flush and close the writer

func (*HTTPWriter) Flush added in v1.0.12

func (hw *HTTPWriter) Flush()

Flush flush cached events

func (*HTTPWriter) SetTimeout added in v1.0.12

func (hw *HTTPWriter) SetTimeout(timeout string) error

SetTimeout set timeout

func (*HTTPWriter) SetUrl added in v1.0.12

func (hw *HTTPWriter) SetUrl(u string) error

SetUrl set the request url

func (*HTTPWriter) Write added in v1.0.12

func (hw *HTTPWriter) Write(le *Event) error

Write cache log message, flush if needed

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.000' will be used %c{format}: logger name %p{format}: log level prefix %l{format}: log level string %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 log a message at debug level.

func (*Log) Debugf

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

Debugf format log a message at debug level.

func (*Log) Error

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

Error log a message at error level.

func (*Log) Errorf

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

Errorf format and log a message at error level.

func (*Log) Fatal

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

Fatal log a message at fatal level.

func (*Log) Fatalf

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

Fatalf format and log a message at fatal level.

func (*Log) Flush

func (log *Log) Flush()

Flush flush all chan data.

func (*Log) GetCallerDepth

func (log *Log) GetCallerDepth() int

GetCallerDepth return the logger's depth

func (*Log) GetFormatter

func (log *Log) GetFormatter() Formatter

GetFormatter get logger formatter

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) GetName

func (log *Log) GetName() string

GetName return the logger's name

func (*Log) GetOutputer

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

Outputer return a io.Writer for go log.SetOutput callerDepth: default is 1 (means +1) if the outputer is used by go std log, set callerDepth 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 log a message at info level.

func (*Log) Infof

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

Infof format and log 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 log a message at specified level.

func (*Log) Logf

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

Logf format and log a message at specified level.

func (*Log) SetCallerDepth

func (log *Log) SetCallerDepth(d int)

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

func (*Log) SetFormat added in v1.0.10

func (log *Log) SetFormat(format string)

SetFormat set logger format

func (*Log) SetFormatter

func (log *Log) SetFormatter(lf Formatter)

SetFormatter set logger formatter

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) SetName

func (log *Log) SetName(name string)

SetName set the logger's name

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 log a message at trace level.

func (*Log) Tracef

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

Tracef format and log a message at trace level.

func (*Log) Warn

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

Warn log a message at warning level.

func (*Log) Warnf

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

Warnf format and log 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 LogFilter added in v1.0.10

type LogFilter struct {
	Filter Filter // log filter
}

func (*LogFilter) Reject added in v1.0.10

func (ll *LogFilter) Reject(le *Event) bool

func (*LogFilter) SetFilter added in v1.0.10

func (ll *LogFilter) SetFilter(filter string)

SetFilter set the log filter

type LogFormatter added in v1.0.10

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

func (*LogFormatter) Append added in v1.0.12

func (lf *LogFormatter) Append(le *Event, df ...Formatter)

Append format the log event and append to buffer

func (*LogFormatter) Format added in v1.0.10

func (lf *LogFormatter) Format(le *Event, df ...Formatter) []byte

Format format the log event

func (*LogFormatter) GetFormatter added in v1.0.12

func (lf *LogFormatter) GetFormatter(le *Event, df ...Formatter) Formatter

Format format the log event

func (*LogFormatter) SetFormat added in v1.0.10

func (lf *LogFormatter) SetFormat(format string)

SetFormat set the log formatter

type Logger

type Logger interface {
	GetLogger(name string) Logger
	GetOutputer(name string, lvl Level, callerDepth ...int) Outputer
	GetName() string
	SetName(name string)
	GetLevel() Level
	GetTraceLevel() Level
	GetFormatter() Formatter
	GetCallerDepth() int
	SetCallerDepth(d int)
	GetProp(k string) any
	SetProp(k string, v any)
	GetProps() map[string]any
	SetProps(map[string]any)
	IsLevelEnabled(lvl Level) bool
	Log(lvl Level, v ...any)
	Logf(lvl Level, f string, v ...any)
	IsFatalEnabled() bool
	Fatal(v ...any)
	Fatalf(f string, v ...any)
	IsErrorEnabled() bool
	Error(v ...any)
	Errorf(f string, v ...any)
	IsWarnEnabled() bool
	Warn(v ...any)
	Warnf(f string, v ...any)
	IsInfoEnabled() bool
	Info(v ...any)
	Infof(f string, v ...any)
	IsDebugEnabled() bool
	Debug(v ...any)
	Debugf(f string, v ...any)
	IsTraceEnabled() bool
	Trace(v ...any)
	Tracef(f string, v ...any)
	Write(le Event)
}

Logger logger interface

func GetLogger

func GetLogger(name string) Logger

GetLogger returns a new logger

type MultiFilter

type MultiFilter struct {
	Filters []Filter
}

MultiFilter a multiple filter

func NewMultiFilter

func NewMultiFilter(fs ...Filter) *MultiFilter

NewMultiFilter create a multiple filter

func (*MultiFilter) Reject

func (mf *MultiFilter) Reject(le *Event) bool

Reject filter event by multiple filters

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) error

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) error

Write do nothing.

type Outputer

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

Outputer interface for io.Writer, gorm.logger.Writer

func GetOutputer

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

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

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

type SMTPWriter

type SMTPWriter struct {
	LogFilter
	LogFormatter
	SubFormatter

	Host     string
	Port     int
	Username string
	Password string
	From     string
	Tos      []string
	Ccs      []string
	Timeout  time.Duration
	// contains filtered or unexported fields
}

SMTPWriter implements log Writer Interface and send log message.

func (*SMTPWriter) Close

func (sw *SMTPWriter) Close()

Close close the mail sender

func (*SMTPWriter) Flush

func (sw *SMTPWriter) Flush()

Flush implementing method. empty.

func (*SMTPWriter) SetCc

func (sw *SMTPWriter) SetCc(s string)

SetCc set Cc recipients

func (*SMTPWriter) SetTimeout

func (sw *SMTPWriter) SetTimeout(timeout string) error

SetTimeout set timeout

func (*SMTPWriter) SetTo

func (sw *SMTPWriter) SetTo(s string)

SetTo set To recipients

func (*SMTPWriter) Write

func (sw *SMTPWriter) Write(le *Event) (err error)

Write send log message to smtp server.

type SlackWriter

type SlackWriter struct {
	LogFilter
	LogFormatter
	SubFormatter

	Webhook string
	Timeout time.Duration
}

SlackWriter implements log Writer Interface and send log message to slack.

func (*SlackWriter) Close

func (sw *SlackWriter) Close()

Close implementing method. empty.

func (*SlackWriter) Flush

func (sw *SlackWriter) Flush()

Flush implementing method. empty.

func (*SlackWriter) SetTimeout

func (sw *SlackWriter) SetTimeout(timeout string) error

SetTimeout set timeout

func (*SlackWriter) SetWebhook

func (sw *SlackWriter) SetWebhook(webhook string) error

SetWebhook set the webhook URL

func (*SlackWriter) Write

func (sw *SlackWriter) Write(le *Event) (err error)

Write send log message to slack

type StreamWriter

type StreamWriter struct {
	LogFilter
	LogFormatter

	Color  bool      //this filed is useful only when system's terminal supports color
	Output io.Writer // log output
}

StreamWriter implements log Writer Interface and writes messages to terminal.

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) (err error)

Write write message in console.

type SubFormatter added in v1.0.10

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

func (*SubFormatter) SetSubject added in v1.0.10

func (sf *SubFormatter) SetSubject(format string)

SetSubject set the subject formatter

func (*SubFormatter) SubFormat added in v1.0.10

func (sf *SubFormatter) 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) error

Write synchronize write log event

type TeamsWriter

type TeamsWriter struct {
	LogFilter
	LogFormatter
	SubFormatter

	Webhook string
	Timeout time.Duration
}

TeamsWriter implements log Writer Interface and send log message to teams.

func (*TeamsWriter) Close

func (tw *TeamsWriter) Close()

Close implementing method. empty.

func (*TeamsWriter) Flush

func (tw *TeamsWriter) Flush()

Flush implementing method. empty.

func (*TeamsWriter) SetTimeout

func (tw *TeamsWriter) SetTimeout(timeout string) error

SetTimeout set timeout

func (*TeamsWriter) SetWebhook

func (tw *TeamsWriter) SetWebhook(webhook string) error

SetWebhook set the webhook URL

func (*TeamsWriter) Write

func (tw *TeamsWriter) Write(le *Event) (err error)

Write send log message to teams

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.000' will be used %c{format}: logger name %p{format}: log level prefix %l{format}: log level string %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) error
	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

func NewBridgeWriter added in v1.0.10

func NewBridgeWriter(logger Logger) Writer

func NewConsoleWriter

func NewConsoleWriter() Writer

NewConsoleWriter create a color console log writer

func NewStderrWriter

func NewStderrWriter() Writer

NewStderrWriter create a stderr writer

func NewStdoutWriter

func NewStdoutWriter() Writer

NewStdoutWriter create a stdout log 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