-
Notifications
You must be signed in to change notification settings - Fork 1
/
syslogger_linux.go
61 lines (47 loc) · 1.02 KB
/
syslogger_linux.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
package logger
import (
"fmt"
"log/syslog"
"sync"
"github.com/samber/do"
"gopkg.ilharper.com/x/rpl"
)
type SysLogger struct {
c chan *rpl.Log
}
func BuildNewSysLogger() func(i *do.Injector) (*SysLogger, error) {
return func(i *do.Injector) (*SysLogger, error) {
var err error
wg := do.MustInvoke[*sync.WaitGroup](i)
l, err := syslog.New(syslog.LOG_INFO|syslog.LOG_USER, logName)
if err != nil {
return nil, fmt.Errorf("failed to create syslog logger: %w", err)
}
adapter := newColorAdapter(nil)
sysLogger := &SysLogger{
c: make(chan *rpl.Log),
}
wg.Add(1)
go func() {
defer wg.Done()
defer func() {
_ = l.Close()
}()
for {
log := <-sysLogger.c
if log == nil {
break
}
entry := fmt.Sprintf("%04d|%01d|%s", log.Ch, log.Level, adapter.adaptColor(log.Value))
_ = l.Notice(entry)
}
}()
return sysLogger, nil
}
}
func (sysLogger *SysLogger) Writer() chan<- *rpl.Log {
return sysLogger.c
}
func (sysLogger *SysLogger) Close() {
sysLogger.c <- nil
}