|
|
|
package logging
|
|
|
|
|
|
|
|
import (
|
|
|
|
"os"
|
|
|
|
"strings"
|
|
|
|
"sync"
|
|
|
|
)
|
|
|
|
|
|
|
|
// LogSuppressor provides io.Writer interface for logging
|
|
|
|
// with lines suppression. For usage with log.Logger.
|
|
|
|
type LogSuppressor struct {
|
|
|
|
filename string
|
|
|
|
suppress []string
|
|
|
|
linePrefix string
|
|
|
|
|
|
|
|
logFile *os.File
|
|
|
|
m sync.Mutex
|
|
|
|
}
|
|
|
|
|
|
|
|
// NewLogSuppressor creates a new LogSuppressor for specified
|
|
|
|
// filename and lines to be suppressed.
|
|
|
|
//
|
|
|
|
// If filename is empty, log entries will be printed to stderr.
|
|
|
|
func NewLogSuppressor(filename string, suppress []string, linePrefix string) *LogSuppressor {
|
|
|
|
return &LogSuppressor{
|
|
|
|
filename: filename,
|
|
|
|
suppress: suppress,
|
|
|
|
linePrefix: linePrefix,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Open opens log file.
|
|
|
|
func (ls *LogSuppressor) Open() error {
|
|
|
|
var err error
|
|
|
|
|
|
|
|
if ls.filename == "" {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
//nolint:nosnakecase
|
|
|
|
ls.logFile, err = os.OpenFile(ls.filename, os.O_APPEND|os.O_WRONLY|os.O_CREATE, 0o600)
|
|
|
|
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
// Close closes log file.
|
|
|
|
func (ls *LogSuppressor) Close() error {
|
|
|
|
if ls.filename == "" {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
return ls.logFile.Close()
|
|
|
|
}
|
|
|
|
|
|
|
|
// Write writes p to log, and returns number f bytes written.
|
|
|
|
// Implements io.Writer interface.
|
|
|
|
func (ls *LogSuppressor) Write(p []byte) (int, error) {
|
|
|
|
var output string
|
|
|
|
|
|
|
|
if ls.filename == "" {
|
|
|
|
return os.Stdin.Write(p)
|
|
|
|
}
|
|
|
|
|
|
|
|
ls.m.Lock()
|
|
|
|
defer ls.m.Unlock()
|
|
|
|
|
|
|
|
lines := strings.Split(string(p), ls.linePrefix)
|
|
|
|
for _, line := range lines {
|
|
|
|
if (func(line string) bool {
|
|
|
|
for _, suppress := range ls.suppress {
|
|
|
|
if strings.Contains(line, suppress) {
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return false
|
|
|
|
})(line) {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
output += line
|
|
|
|
}
|
|
|
|
|
|
|
|
return ls.logFile.Write([]byte(output))
|
|
|
|
}
|