85 lines
1.8 KiB
Go
85 lines
1.8 KiB
Go
package logger
|
|
|
|
import (
|
|
"html"
|
|
"io"
|
|
"log"
|
|
"net/http"
|
|
"os"
|
|
"path/filepath"
|
|
|
|
"git.0cd.xyz/michael/gtools/colour"
|
|
"git.0cd.xyz/michael/gtools/nettools"
|
|
|
|
"github.com/sirupsen/logrus"
|
|
)
|
|
|
|
// Logger Options
|
|
type Logger struct {
|
|
Error *logrus.Logger
|
|
Access *logrus.Logger
|
|
}
|
|
|
|
// New instance of logger
|
|
func New(path, mode string, level int) *Logger {
|
|
var access, erro io.Writer
|
|
if mode == "file" {
|
|
errorlog, err := open(path + "error.log")
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
accesslog, err := open(path + "access.log")
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
erro = io.MultiWriter(errorlog, os.Stderr)
|
|
access = io.MultiWriter(accesslog, os.Stdout)
|
|
} else {
|
|
erro, access = os.Stderr, os.Stderr
|
|
}
|
|
return &Logger{
|
|
Error: &logrus.Logger{
|
|
Out: erro,
|
|
Hooks: make(logrus.LevelHooks),
|
|
Formatter: &logrus.TextFormatter{
|
|
ForceColors: true,
|
|
FullTimestamp: true,
|
|
TimestampFormat: "2006-01-02 15:04:05",
|
|
},
|
|
Level: logrus.Level(level),
|
|
},
|
|
Access: &logrus.Logger{
|
|
Out: access,
|
|
Hooks: make(logrus.LevelHooks),
|
|
Formatter: &logrus.TextFormatter{
|
|
ForceColors: true,
|
|
FullTimestamp: true,
|
|
TimestampFormat: "2006-01-02 15:04:05",
|
|
},
|
|
Level: logrus.InfoLevel,
|
|
},
|
|
}
|
|
}
|
|
|
|
func open(path string) (*os.File, error) {
|
|
dir, _ := filepath.Split(path)
|
|
if _, err := os.Stat(path); os.IsNotExist(err) {
|
|
os.Mkdir(dir, 0775)
|
|
}
|
|
file, err := os.OpenFile(path, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
|
|
if err != nil {
|
|
file.Close()
|
|
return nil, err
|
|
}
|
|
return file, nil
|
|
}
|
|
|
|
// AccessMessage client access message
|
|
func (logger *Logger) AccessMessage(r *http.Request, statuscode int) {
|
|
ip, err := nettools.IP(r)
|
|
if err != nil {
|
|
logger.Error.Warn(err)
|
|
}
|
|
logger.Access.Infof("%s %v - %s %s %s", ip, nettools.Hostname(ip), r.Method, colour.Status(statuscode), html.EscapeString(r.URL.Path))
|
|
}
|