diff options
Diffstat (limited to 'internal/log/log.go')
-rw-r--r-- | internal/log/log.go | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/internal/log/log.go b/internal/log/log.go new file mode 100644 index 000000000..65b820ce4 --- /dev/null +++ b/internal/log/log.go @@ -0,0 +1,58 @@ +/* + GoToSocial + Copyright (C) 2021 GoToSocial Authors admin@gotosocial.org + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program 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 Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +package log + +import ( + "bytes" + "os" + + "github.com/sirupsen/logrus" +) + +// New returns a new logrus logger with the specified level, +// or an error if that level can't be parsed +func New(level string) (*logrus.Logger, error) { + log := logrus.New() + log.SetOutput(&outputSplitter{}) + return setLogLevel(level, log) +} + +// outputSplitter implements the io.Writer interface for use with Logrus, and simply +// splits logs between stdout and stderr depending on their severity. +// See: https://github.com/sirupsen/logrus/issues/403#issuecomment-346437512 +type outputSplitter struct{} + +func (splitter *outputSplitter) Write(p []byte) (n int, err error) { + if bytes.Contains(p, []byte("level=error")) { + return os.Stderr.Write(p) + } + return os.Stdout.Write(p) +} + +// setLogLevel will try to set the logrus log level to the +// desired level specified by the user with the --log-level flag +func setLogLevel(level string, logger *logrus.Logger) (*logrus.Logger, error) { + log := logrus.New() + logLevel, err := logrus.ParseLevel(level) + if err != nil { + return nil, err + } + log.SetLevel(logLevel) + return log, nil +} |