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