package logger
import (
"fmt"
"io"
"log"
"os"
"time"
)
type Level int
const (
DEBUG Level = iota
INFO
WARN
ERROR
)
type Logger struct {
level Level
output io.Writer
logger *log.Logger
}
func NewLogger(level Level, output io.Writer) *Logger {
return &Logger{
level: level,
output: output,
logger: log.New(output, "", 0),
}
}
func (l *Logger) Debug(format string, v ...interface{}) {
if l.level <= DEBUG {
l.log("DEBUG", format, v...)
}
}
func (l *Logger) Info(format string, v ...interface{}) {
if l.level <= INFO {
l.log("INFO", format, v...)
}
}
func (l *Logger) Warn(format string, v ...interface{}) {
if l.level <= WARN {
l.log("WARN", format, v...)
}
}
func (l *Logger) Error(format string, v ...interface{}) {
if l.level <= ERROR {
l.log("ERROR", format, v...)
}
}
func (l *Logger) log(level, format string, v ...interface{}) {
timestamp := time.Now().Format("2006-01-02 15:04:05")
message := fmt.Sprintf(format, v...)
l.logger.Printf("[%s] [%s] %s", timestamp, level, message)
}
func NewFileLogger(level Level, filepath string) (*Logger, error) {
file, err := os.OpenFile(filepath, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
if err != nil {
return nil, err
}
return NewLogger(level, file), nil
}