/
syslog.go
126 lines (103 loc) · 2.3 KB
/
syslog.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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
// Copyright (c) 2019 Chen Lei <my@mysq.to>. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// +build !windows,!nacl,!plan9
package log
import (
"io"
"log/syslog"
"os"
"sync"
)
// Syslog is the backend using syslog
type Syslog struct {
out *syslog.Writer
mu sync.Mutex
}
// NewSyslog crete a new logger using syslog backend with level/prefix/flag
func NewSyslog(level Level, prefix string, flag int) *Logger {
// clear some flags not needed since syslog already provided
flag &= ^Ldate & ^Ltime &^ Lmicroseconds &^ LUTC
backend, _ := NewSyslogBackend(level, prefix)
l := &Logger{
level: level,
mu: sync.Mutex{},
prefix: prefix,
flag: flag,
backend: backend,
index: 0,
name: procName(),
}
logger.Store(l)
return l
}
// NewSyslogBackend creates a syslog backend
func NewSyslogBackend(level Level, prefix string) (Backend, error) {
syslogLevel := syslog.LOG_INFO
switch level {
case FATAL:
syslogLevel = syslog.LOG_CRIT
case ERROR:
syslogLevel = syslog.LOG_ERR
case WARN:
syslogLevel = syslog.LOG_WARNING
case INFO:
syslogLevel = syslog.LOG_INFO
case DEBUG:
syslogLevel = syslog.LOG_DEBUG
default:
syslogLevel = syslog.LOG_NOTICE
}
out, err := syslog.New(syslogLevel, prefix)
if err == nil {
return &Syslog{
out: out,
}, nil
}
return nil, err
}
// Writer returns the io.Writer of current Syslog
func (l *Syslog) Writer() io.Writer {
l.mu.Lock()
defer l.mu.Unlock()
return l.out
}
// SetWriter set the io.Writer of current Syslog
func (l *Syslog) SetWriter(io.Writer) {
// not supported
}
// log the actual write routine of logging
func (l *Syslog) log(r *Record) {
// syslog writes log with newline, we don't need extra newline
r.newline = false
message := r.message()
switch r.level {
case FATAL:
_ = l.out.Crit(message)
os.Exit(-1)
case ERROR:
_ = l.out.Err(message)
case WARN:
_ = l.out.Warning(message)
case INFO:
_ = l.out.Info(message)
case DEBUG:
_ = l.out.Debug(message)
default:
_ = l.out.Notice(message)
}
}
func (l *Syslog) start() {
}
// Flush the current log backend
func (l *Syslog) Flush() {
}
func (l *Syslog) isatty() bool {
return false
}
func (l *Syslog) fd() Handler {
return nil
}
func (l *Syslog) write([]byte) error {
return nil
}