mirror of
https://github.com/khorevaa/logos.git
synced 2025-02-07 13:43:50 +02:00
165 lines
3.0 KiB
Go
165 lines
3.0 KiB
Go
package logos
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"github.com/khorevaa/logos/config"
|
|
"github.com/khorevaa/logos/internal/common"
|
|
"go.uber.org/zap"
|
|
"go.uber.org/zap/zapcore"
|
|
"io/ioutil"
|
|
"os"
|
|
"os/signal"
|
|
"path/filepath"
|
|
"strconv"
|
|
"sync"
|
|
"syscall"
|
|
|
|
_ "github.com/khorevaa/logos/appender"
|
|
_ "github.com/khorevaa/logos/encoder/common"
|
|
_ "github.com/khorevaa/logos/encoder/console"
|
|
_ "github.com/khorevaa/logos/encoder/gelf"
|
|
_ "github.com/khorevaa/logos/encoder/json"
|
|
)
|
|
|
|
var (
|
|
manager *logManager
|
|
configFile string
|
|
initLocker sync.Mutex
|
|
explicitInited = false
|
|
debug bool
|
|
)
|
|
|
|
func resolveConfigFileFromEnv() (string, error) {
|
|
f := os.Getenv("LOGOS_CONFIG_FILE")
|
|
if f == "" {
|
|
return "", errors.New("environment variable 'LOGOS_CONFIG_FILE' is not set")
|
|
}
|
|
return f, nil
|
|
}
|
|
|
|
func resolveConfigFileFromWorkDir() (string, error) {
|
|
matches1, _ := filepath.Glob("logos.yaml")
|
|
matches2, _ := filepath.Glob("logos.yml")
|
|
matches := append(matches1, matches2...)
|
|
switch len(matches) {
|
|
case 0:
|
|
return "", errors.New("no config file found in work dir")
|
|
case 1:
|
|
return matches[0], nil
|
|
default:
|
|
panic(fmt.Errorf("multiple config files found %v", matches))
|
|
}
|
|
}
|
|
|
|
func init() {
|
|
|
|
initLocker.Lock()
|
|
defer initLocker.Unlock()
|
|
|
|
debug, _ = strconv.ParseBool(os.Getenv("LOGOS_DEBUG"))
|
|
|
|
if configFile == "" {
|
|
cf, err := resolveConfigFileFromEnv()
|
|
if err == nil {
|
|
configFile = cf
|
|
}
|
|
}
|
|
|
|
if configFile == "" {
|
|
cf, err := resolveConfigFileFromWorkDir()
|
|
if err == nil {
|
|
configFile = cf
|
|
}
|
|
}
|
|
|
|
var err error
|
|
var rawConfig *common.Config
|
|
|
|
if configFile != "" {
|
|
// load ConfigFile
|
|
configFile, err = filepath.Abs(configFile)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
if debug {
|
|
fmt.Println("logos using config file: ", configFile)
|
|
bs, err := ioutil.ReadFile(configFile)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
fmt.Println(string(bs))
|
|
}
|
|
|
|
rawConfig, _, err = common.LoadFile(configFile)
|
|
} else {
|
|
if debug {
|
|
fmt.Print("logos using default config:\n" + config.DefaultConfig)
|
|
}
|
|
rawConfig, err = common.NewConfigFrom(config.DefaultConfig)
|
|
}
|
|
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
manager, err = newLogManager(rawConfig)
|
|
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
manager.RedirectStdLog()
|
|
|
|
go func() {
|
|
quit := make(chan os.Signal)
|
|
signal.Notify(quit, syscall.SIGTERM, syscall.SIGINT)
|
|
<-quit
|
|
Sync()
|
|
}()
|
|
|
|
}
|
|
|
|
func InitWithConfigContent(content string) error {
|
|
initLocker.Lock()
|
|
defer initLocker.Unlock()
|
|
|
|
//if explicitInited {
|
|
// return errors.New("logos is explicit inited")
|
|
//}
|
|
|
|
if debug {
|
|
fmt.Println("logos InitWithConfigContent:\n" + content)
|
|
}
|
|
|
|
rawConfig, err := common.NewConfigFrom(content)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = manager.Update(rawConfig)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
//explicitInited = true
|
|
|
|
return nil
|
|
}
|
|
|
|
func New(name string) Logger {
|
|
return manager.NewLogger(name)
|
|
}
|
|
func SetLevel(name string, level zapcore.Level) {
|
|
manager.SetLevel(name, level)
|
|
}
|
|
|
|
func UpdateLogger(name string, logger *zap.Logger) {
|
|
manager.UpdateLogger(name, logger)
|
|
}
|
|
|
|
func Sync() {
|
|
_ = manager.Sync()
|
|
}
|