package
1.0.26
Repository: https://github.com/askasoft/pango.git
Documentation: pkg.go.dev

# 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: "[email protected]",
		Password: "xxxxxxxx",
		From: "[email protected]",
		Tos: []string{"[email protected]"},
	}))
	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,
		BatchWriter: BatchWriter{
			CacheCount: 6,
			BatchCount: 3,
			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 = [email protected]
to = [email protected], [email protected]
cc = [email protected], [email protected]
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

# Packages

No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author

# Functions

Close will remove all writers and stop async goroutine.
Config config log by configuration file.
ConfigWriter config the writer by the configuration map 'c'.
CreateFilter create a log filter by name and config.
CreateWriter create a writer by name.
Debug log a message at debug level.
Debugf format log a message at debug level.
Default returns the default Log instance used by the package-level functions.
Error log a message at error level.
Errorf format and log a message at error level.
Fatal log a message at fatal level.
Fatalf format and log a message at fatal level.
GetCallerDepth return the logger's caller depth.
GetFormatter get the formatter.
GetLevel return the logger's level.
GetLogger returns a new logger.
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)).
GetProp get logger property.
GetProps get logger properties.
GetWriter get the writer.
Info log a message at info level.
Infof format and log a message at info level.
IsDebugEnabled is DEBUG level enabled.
IsErrorEnabled is ERROR level enabled.
IsFatalEnabled is FATAL level enabled.
IsInfoEnabled is INFO level enabled.
IsTraceEnabled is TRACE level enabled.
IsWarnEnabled is WARN level enabled.
NewAsyncWriter create a async writer and start go routine.
No description provided by the author
NewConsoleWriter create a color console log writer.
No description provided by the author
No description provided by the author
NewFailoverWriter create a failover writer.
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").
NewLevelFilter create a level filter.
NewLog returns a new Log.
NewLogFilter create a log filter by the configuration string 'c'.
NewLogFormatter create a text or json formatter text:[%p] %m%n -> TextFormatter json:{"level":%l, "msg": %m}%n -> JSONFormatter.
NewMultiFilter create a multiple filter.
NewMultiWriter create a multi writer.
NewNameFilter create a name filter.
NewNameNotFilter create a name filter (not equal).
NewStderrWriter create a stderr writer.
NewStdoutWriter create a stdout log writer.
NewSyncWriter create a synchronized writer.
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").
ParseLevel parse level from string.
RegisterFilter register log filter type.
RegisterWriter register log writer type.
SetCallerDepth set the logger's caller depth (!!SLOW!!), 0: disable runtime.Caller().
SetFormat set logger format.
SetFormatter set the formatter.
SetLevel set the logger's level.
SetLevels set the logger levels.
SetProp set logger property.
SetProps set logger properties.
SetWriter set the writer.
Trace log a message at trace level.
Tracef format and log a message at trace level.
Warn log a message at warning level.
Warnf format and log a message at warning level.

# Constants

Log level.
Log level.
Log level.
Log level.
Log level.
Log level.
Log level.

# Variables

EOL windows: "\r\n" other: "\n".
JSONFmtDefault default log format `{"time": %t, "level": %l, "name": %c, "file": %S, "line": %L, "func": %F, "msg": %m, "trace": %T}%n`.
TextFmtDefault default log format "%t %l{-5s} %c %S:%L %F() - %m%n%T".
TextFmtSimple simple log format "[%p] %m%n".
TextFmtSubject subject log format "[%l] %m".

# Structs

AsyncWriter wrapper a log writer to implement asynchrous write.
BatchWriter implements log Writer Interface and batch send log messages to webhook.
No description provided by the author
ConnWriter implements Writer.
Event log event.
EventBuffer a event buffer.
FailoverWriter wraps a log writer, cache log event if underlying log writer write failed.
FileWriter implements Writer.
JSONFormatter json formatter.
LevelFilter log level filter.
Log is default logger in application.
No description provided by the author
No description provided by the author
MultiFilter a multiple filter.
MultiWriter write log to multiple writers.
NameFilter logger name filter.
NameNotFilter logger name filter.
NopWriter implements Writer.
StreamWriter implements log Writer Interface and writes messages to terminal.
No description provided by the author
SyncWriter synchronized log writer.
TextFormatter text formatter.

# Interfaces

Filter log filter.
Formatter log formater interface.
Logger logger interface.
Outputer interface for io.Writer, gorm.logger.Writer.
Writer log writer interface.

# Type aliases

FilterCreator filter create function.
Level log level.
WriterCreator writer create function.