// Copyright 2023 Martin Riedl // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package log import "sync" type Output struct { Level Level Formatter Formatter formatterLock sync.Mutex Printer Printer } func NewOutput(level Level, formatter Formatter, printer Printer) *Output { return &Output{ Level: level, Formatter: formatter, Printer: printer, } } func NewOutputDefault() *Output { return NewOutput(LevelInfo, NewFormatterKeyValue(), NewPrinterStdout()) } func (output *Output) Send(entry *Entry) { // check, if message should be printed if entry.Level > output.Level { return } // execute formatter data := output.format(entry) // execute printer output.Printer.Write(data) } func (output *Output) format(entry *Entry) []byte { output.formatterLock.Lock() defer output.formatterLock.Unlock() // run formatter output.Formatter.Begin(entry) // add entry data output.Formatter.Process(entry) // finalize formatter data := output.Formatter.End(entry) // return generated data return data }