|
| 1 | +package handler |
| 2 | + |
| 3 | +import ( |
| 4 | + "os" |
| 5 | + "path" |
| 6 | + "strings" |
| 7 | + "sync" |
| 8 | + "time" |
| 9 | + |
| 10 | + "github.com/thinkoner/thinkgo/log/record" |
| 11 | +) |
| 12 | + |
| 13 | +type FileHandler struct { |
| 14 | + Handler |
| 15 | + sync.Mutex |
| 16 | + level record.Level |
| 17 | + bubble bool |
| 18 | + filename string |
| 19 | + |
| 20 | + filenameFormat string |
| 21 | + dateFormat string |
| 22 | + timedFilename string |
| 23 | +} |
| 24 | + |
| 25 | +func NewFileHandler(filename string, level record.Level) *FileHandler { |
| 26 | + h := &FileHandler{ |
| 27 | + level: level, |
| 28 | + bubble: true, |
| 29 | + filename: filename, |
| 30 | + filenameFormat: "{filename}-{date}", |
| 31 | + dateFormat: "2006-01-02", |
| 32 | + } |
| 33 | + h.timedFilename = h.GetTimedFilename() |
| 34 | + return h |
| 35 | +} |
| 36 | + |
| 37 | +// IsHandling Checks whether the given record will be handled by this handler. |
| 38 | +func (h *FileHandler) IsHandling(r record.Record) bool { |
| 39 | + return r.Level >= h.level |
| 40 | +} |
| 41 | + |
| 42 | +// Handle Handles a record. |
| 43 | +func (h *FileHandler) Handle(r record.Record) bool { |
| 44 | + if !h.IsHandling(r) { |
| 45 | + return false |
| 46 | + } |
| 47 | + |
| 48 | + r.Formatted = h.GetFormatter().Format(r) |
| 49 | + |
| 50 | + h.write(r) |
| 51 | + |
| 52 | + return false == h.bubble |
| 53 | +} |
| 54 | + |
| 55 | +// SetLevel Sets minimum logging level at which this handler will be triggered. |
| 56 | +func (h *FileHandler) SetLevel(level record.Level) { |
| 57 | + h.level = level |
| 58 | +} |
| 59 | + |
| 60 | +func (h *FileHandler) write(r record.Record) { |
| 61 | + h.Lock() |
| 62 | + defer h.Unlock() |
| 63 | + file, _ := os.OpenFile(h.timedFilename, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0644) |
| 64 | + defer file.Close() |
| 65 | + file.Write([]byte(r.Formatted)) |
| 66 | +} |
| 67 | + |
| 68 | +// GetTimedFilename Gets the Timed filename. |
| 69 | +func (h *FileHandler) GetTimedFilename() string { |
| 70 | + dirname := path.Dir(h.filename) |
| 71 | + filename := path.Base(h.filename) |
| 72 | + fileExt := path.Ext(h.filename) |
| 73 | + filename = strings.TrimSuffix(filename, fileExt) |
| 74 | + |
| 75 | + timedFilename := strings.Replace(path.Join(dirname, h.filenameFormat), "{filename}", filename, -1) |
| 76 | + timedFilename = strings.Replace(timedFilename, "{date}", time.Now().Local().Format(h.dateFormat), -1) |
| 77 | + |
| 78 | + if len(fileExt) > 0 { |
| 79 | + timedFilename = timedFilename + fileExt |
| 80 | + } |
| 81 | + |
| 82 | + return timedFilename |
| 83 | +} |
0 commit comments