* refactor: cve_client.go * refactor: don't use global Config in private func * remove import alias for config * refactor: dbclient * refactor: resultDir * refactor: resultsDir * refactor * refactor: gost * refactor: db client * refactor: cveDB * refactor: cvedb * refactor: exploitDB * refactor: remove detector/dbclient.go * refactor: writer * refactor: syslog writer * refactor: ips * refactor: ensureResultDir * refactor: proxy * fix(db): call CloseDB * add integration test * feat(report): sort array in json * sort func for json diff * add build-int to makefile * add int-rds-redis to makefile * fix: test case, makefile * fix makefile * show cve count after diff * make diff * diff -c * sort exploits in json for diff * sort metasploit, exploit
118 lines
2.8 KiB
Go
118 lines
2.8 KiB
Go
package logging
|
|
|
|
import (
|
|
"flag"
|
|
"fmt"
|
|
"io/ioutil"
|
|
"os"
|
|
"path/filepath"
|
|
"runtime"
|
|
|
|
"github.com/k0kubun/pp"
|
|
"github.com/rifflock/lfshook"
|
|
"github.com/sirupsen/logrus"
|
|
|
|
formatter "github.com/kotakanbe/logrus-prefixed-formatter"
|
|
)
|
|
|
|
//LogOpts has options for logging
|
|
type LogOpts struct {
|
|
Debug bool `json:"debug,omitempty"`
|
|
DebugSQL bool `json:"debugSQL,omitempty"`
|
|
LogDir string `json:"logDir,omitempty"`
|
|
Quiet bool `json:"quiet,omitempty"`
|
|
}
|
|
|
|
// Log for localhost
|
|
var Log Logger
|
|
|
|
// Logger has logrus entry
|
|
type Logger struct {
|
|
logrus.Entry
|
|
}
|
|
|
|
func init() {
|
|
log := logrus.New()
|
|
log.Out = ioutil.Discard
|
|
fields := logrus.Fields{"prefix": ""}
|
|
Log = Logger{Entry: *log.WithFields(fields)}
|
|
}
|
|
|
|
// NewNormalLogger creates normal logger
|
|
func NewNormalLogger() Logger {
|
|
return Logger{Entry: logrus.Entry{Logger: logrus.New()}}
|
|
}
|
|
|
|
// NewCustomLogger creates logrus
|
|
func NewCustomLogger(debug, quiet bool, logDir, logMsgAnsiColor, serverName string) Logger {
|
|
log := logrus.New()
|
|
log.Formatter = &formatter.TextFormatter{MsgAnsiColor: logMsgAnsiColor}
|
|
log.Level = logrus.InfoLevel
|
|
if debug {
|
|
log.Level = logrus.DebugLevel
|
|
pp.ColoringEnabled = false
|
|
}
|
|
|
|
if flag.Lookup("test.v") != nil {
|
|
return Logger{Entry: *logrus.NewEntry(log)}
|
|
}
|
|
|
|
// File output
|
|
dir := GetDefaultLogDir()
|
|
if logDir != "" {
|
|
dir = logDir
|
|
}
|
|
|
|
// Only log to a file if quiet mode enabled
|
|
if quiet && flag.Lookup("test.v") == nil {
|
|
if _, err := os.Stat(dir); os.IsNotExist(err) {
|
|
if err := os.Mkdir(dir, 0700); err != nil {
|
|
log.Errorf("Failed to create log directory. path: %s, err: %+v", dir, err)
|
|
}
|
|
}
|
|
|
|
logFile := dir + "/vuls.log"
|
|
if file, err := os.OpenFile(logFile, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644); err == nil {
|
|
log.Out = file
|
|
} else {
|
|
log.Out = os.Stderr
|
|
log.Errorf("Failed to create log file. path: %s, err: %+v", logFile, err)
|
|
}
|
|
} else {
|
|
log.Out = os.Stderr
|
|
}
|
|
|
|
whereami := "localhost"
|
|
if 0 < len(serverName) {
|
|
whereami = serverName
|
|
}
|
|
|
|
if _, err := os.Stat(dir); err == nil {
|
|
path := filepath.Join(dir, fmt.Sprintf("%s.log", whereami))
|
|
if _, err := os.OpenFile(path, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644); err == nil {
|
|
log.Hooks.Add(lfshook.NewHook(lfshook.PathMap{
|
|
logrus.DebugLevel: path,
|
|
logrus.InfoLevel: path,
|
|
logrus.WarnLevel: path,
|
|
logrus.ErrorLevel: path,
|
|
logrus.FatalLevel: path,
|
|
logrus.PanicLevel: path,
|
|
}, nil))
|
|
} else {
|
|
log.Errorf("Failed to create log file. path: %s, err: %+v", path, err)
|
|
}
|
|
}
|
|
|
|
entry := log.WithFields(logrus.Fields{"prefix": whereami})
|
|
return Logger{Entry: *entry}
|
|
}
|
|
|
|
// GetDefaultLogDir returns default log directory
|
|
func GetDefaultLogDir() string {
|
|
defaultLogDir := "/var/log/vuls"
|
|
if runtime.GOOS == "windows" {
|
|
defaultLogDir = filepath.Join(os.Getenv("APPDATA"), "vuls")
|
|
}
|
|
return defaultLogDir
|
|
}
|