-
-
Notifications
You must be signed in to change notification settings - Fork 9
/
backend.go
101 lines (88 loc) · 2.35 KB
/
backend.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
// This file is part of the Smart Home
// Program complex distribution https://github.com/e154/smart-home
// Copyright (C) 2016-2020, Filippov Alex
//
// This library is free software: you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 3 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Library General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library. If not, see
// <https://www.gnu.org/licenses/>.
package logging
import (
"github.com/e154/smart-home/common"
m "github.com/e154/smart-home/models"
"github.com/e154/smart-home/system/config"
"github.com/op/go-logging"
"github.com/sirupsen/logrus"
"os"
"sync"
)
type LogBackend struct {
dbSaver *LogDbSaver
oldLog *m.Log
logging bool
mx *sync.Mutex
L *logrus.Logger
}
func NewLogBackend(logger *logrus.Logger, dbSaver *LogDbSaver, conf *config.AppConfig) (back *LogBackend) {
back = &LogBackend{
dbSaver: dbSaver,
logging: conf.Logging,
mx: &sync.Mutex{},
L: logger,
}
back.L.Out = os.Stdout
return
}
func (b *LogBackend) Log(level logging.Level, calldepth int, rec *logging.Record) (err error) {
if !b.logging {
return
}
b.mx.Lock()
defer b.mx.Unlock()
var logLevel common.LogLevel
s := rec.Formatted(calldepth + 1)
switch level {
case logging.CRITICAL:
b.L.Level = logrus.FatalLevel
b.L.Fatal(s)
logLevel = "Critical"
case logging.ERROR:
b.L.Level = logrus.ErrorLevel
b.L.Error(s)
logLevel = "Error"
case logging.WARNING:
b.L.Level = logrus.WarnLevel
b.L.Warning(s)
logLevel = "Warning"
case logging.INFO, logging.NOTICE:
b.L.Level = logrus.InfoLevel
b.L.Info(s)
logLevel = "Info"
case logging.DEBUG:
b.L.Level = logrus.DebugLevel
b.L.Debug(s)
logLevel = "Debug"
}
if b.oldLog != nil {
if b.oldLog.Body == rec.Message() && b.oldLog.Level == logLevel {
return
}
}
record := &m.Log{
Level: logLevel,
Body: rec.Message(),
CreatedAt: rec.Time,
}
b.oldLog = record
b.dbSaver.Save(*record)
return nil
}