mirror of
https://github.com/mickael-kerjean/filestash.git
synced 2026-10-20 19:19:33 +00:00
134 lines
2.2 KiB
Go
134 lines
2.2 KiB
Go
package utils
|
|
|
|
import (
|
|
"bytes"
|
|
"fmt"
|
|
"io"
|
|
slog "log"
|
|
"os"
|
|
"sync"
|
|
"time"
|
|
)
|
|
|
|
var Log = &log{
|
|
enable: true,
|
|
out: [2]io.Writer{io.Discard, io.Discard},
|
|
buf: sync.Pool{
|
|
New: func() any {
|
|
return new(bytes.Buffer)
|
|
},
|
|
},
|
|
}
|
|
|
|
func InitLogger(path string) (err error) {
|
|
f, err := os.OpenFile(path, os.O_APPEND|os.O_WRONLY|os.O_CREATE, os.ModePerm)
|
|
if err != nil {
|
|
slog.Printf("ERROR log file: %+v", err)
|
|
return err
|
|
}
|
|
f.WriteString("")
|
|
Log.out[0] = f
|
|
Log.out[1] = os.Stdout
|
|
return nil
|
|
}
|
|
|
|
type log struct {
|
|
enable bool
|
|
debug bool
|
|
info bool
|
|
warn bool
|
|
error bool
|
|
|
|
out [2]io.Writer
|
|
buf sync.Pool
|
|
}
|
|
|
|
func (l *log) Info(format string, v ...interface{}) {
|
|
if l.info && l.enable {
|
|
l.Stdout("SYST INFO "+format, v...)
|
|
}
|
|
}
|
|
|
|
func (l *log) Warning(format string, v ...interface{}) {
|
|
if l.warn && l.enable {
|
|
l.Stdout("SYST WARN "+format, v...)
|
|
}
|
|
}
|
|
|
|
func (l *log) Error(format string, v ...interface{}) {
|
|
if l.error && l.enable {
|
|
l.Stdout("SYST ERROR "+format, v...)
|
|
}
|
|
}
|
|
|
|
func (l *log) Debug(format string, v ...interface{}) {
|
|
if l.debug && l.enable {
|
|
l.Stdout("SYST DEBUG "+format, v...)
|
|
}
|
|
}
|
|
|
|
func (l *log) Stdout(format string, v ...interface{}) {
|
|
buf := l.buf.Get().(*bytes.Buffer)
|
|
defer l.buf.Put(buf)
|
|
buf.Reset()
|
|
fmt.Fprintf(buf, format, v...)
|
|
l.Raw(buf.Bytes())
|
|
}
|
|
|
|
func (l *log) Raw(body []byte) {
|
|
buf := l.buf.Get().(*bytes.Buffer)
|
|
defer l.buf.Put(buf)
|
|
buf.Reset()
|
|
var ts [20]byte
|
|
buf.Write(time.Now().AppendFormat(ts[:0], "2006/01/02 15:04:05"))
|
|
buf.WriteByte(' ')
|
|
buf.Write(body)
|
|
buf.WriteByte('\n')
|
|
b := buf.Bytes()
|
|
for _, w := range l.out {
|
|
w.Write(b)
|
|
}
|
|
}
|
|
|
|
func (l *log) Close() {
|
|
for _, w := range l.out {
|
|
if c, ok := w.(io.Closer); ok {
|
|
c.Close()
|
|
}
|
|
}
|
|
}
|
|
|
|
func (l *log) SetVisibility(str string) {
|
|
switch str {
|
|
case "WARNING":
|
|
l.debug = false
|
|
l.info = false
|
|
l.warn = true
|
|
l.error = true
|
|
case "ERROR":
|
|
l.debug = false
|
|
l.info = false
|
|
l.warn = false
|
|
l.error = true
|
|
case "DEBUG":
|
|
l.debug = true
|
|
l.info = true
|
|
l.warn = true
|
|
l.error = true
|
|
case "INFO":
|
|
l.debug = false
|
|
l.info = true
|
|
l.warn = true
|
|
l.error = true
|
|
default:
|
|
l.debug = false
|
|
l.info = true
|
|
l.warn = true
|
|
l.error = true
|
|
}
|
|
}
|
|
|
|
func (l *log) Enable(val bool) {
|
|
l.enable = val
|
|
}
|