4 GoVPN -- simple secure free software virtual private network daemon
5 Copyright (C) 2014-2017 Sergey Matveev <stargrave@stargrave.org>
6 2016-2017 Bruno Clermont <bruno@robotinfra.com>
8 This program is free software: you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation, either version 3 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program. If not, see <http://www.gnu.org/licenses/>.
27 logsyslog "log/syslog"
32 "github.com/Sirupsen/logrus"
33 "github.com/Sirupsen/logrus/hooks/syslog"
34 "github.com/pkg/errors"
37 // syslogFormatter is a syslog friendly formatter
38 type syslogFormatter struct{}
40 // Format converts a log entry into a list of bytes
41 func (sf *syslogFormatter) Format(entry *logrus.Entry) ([]byte, error) {
44 keys := make([]string, 0, len(entry.Data))
45 for k := range entry.Data {
46 keys = append(keys, k)
50 for _, k := range keys {
51 if _, err = buf.WriteString(fmt.Sprintf("[%s]%+v ", k, entry.Data[k])); err != nil {
52 return nil, errors.Wrapf(err, "buf.WriteString %s", k)
55 if _, err = buf.WriteString(entry.Message); err != nil {
56 return nil, errors.Wrap(err, "buf.WriteString message")
58 return buf.Bytes(), nil
61 // NewLogger returns a logger for specified level. Syslog or Windows
62 // Events can be turned on.
63 func NewLogger(level string, syslog bool) (*logrus.Logger, error) {
64 var logger *logrus.Logger
65 logLevel, err := logrus.ParseLevel(level)
67 return nil, errors.Wrap(err, "logrus.ParseLevel")
71 syslogHook, err := logrus_syslog.NewSyslogHook("", "", logsyslog.LOG_INFO, "GoVPN")
73 return nil, errors.Wrap(err, "logrus_syslog.NewSyslogHook")
75 logger = &logrus.Logger{
76 Formatter: &syslogFormatter{},
77 Hooks: make(logrus.LevelHooks),
79 logger.Hooks.Add(syslogHook)
81 logger = &logrus.Logger{
82 Formatter: &logrus.TextFormatter{
85 DisableTimestamp: false,
87 TimestampFormat: time.RFC3339Nano,
88 DisableSorting: false,
90 Hooks: make(logrus.LevelHooks),
93 logger.Out = os.Stderr
94 logger.Level = logLevel
95 logger.WithFields(logrus.Fields{
96 "version": VersionGet(),
97 "level": logLevel.String(),
98 }).Info("Initialize logging")
102 // ExtendLogFields adds batch of log Fields to existing fields ones
103 func ExtendLogFields(input *logrus.Fields, add logrus.Fields) {
105 for k, v := range add {
110 // MergeLogFields combines multiple log fields into a single one
111 func MergeLogFields(fields ...logrus.Fields) (output logrus.Fields) {
112 output = logrus.Fields{}
113 for _, f := range fields {
114 ExtendLogFields(&output, f)