go-logger/logger.go
sky 73384fd80b Use go-helper ConsoleColorHelper replace Color
Set file_logger_test disable filter
Add type LogLevel
Rewrite log.Logger at LoggerWriter
2019-01-23 11:14:55 +08:00

356 lines
6.7 KiB
Go

/* Copyright 2018 sky<skygangsta@hotmail.com>. All rights reserved.
*
* Licensed under the Apache License, version 2.0 (the "License").
* You may not use this work except in compliance with the License, which is
* available at www.apache.org/licenses/LICENSE-2.0
*
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
* either express or implied, as more fully set forth in the License.
*
* See the NOTICE file distributed with this work for information regarding copyright ownership.
*/
package logger
import (
"github.com/robfig/cron"
"os"
"strings"
"time"
)
var (
config *Config
job = cron.New()
propertyMap = map[string]string{}
writerMap = map[string]Writer{}
rolling = false
initialized = false
)
func Init(configFile string) error {
var (
err error
)
config, err = NewConfig(configFile)
if err != nil {
return err
}
initProperties()
job.Start()
if config.Loggers != nil {
// Initialize the Writer of the package filter reference
if config.PackageFilters != nil {
for _, filter := range config.PackageFilters {
if len(filter.Loggers) <= 0 {
break
}
for _, loggerName := range filter.Loggers {
if writerMap[loggerName] != nil {
continue
}
logger := initLogger(loggerName)
if logger != nil {
writerMap[loggerName] = logger
}
}
}
}
// Initialize the Writer of the default filter reference
if len(config.DefaultFilter.Loggers) > 0 {
for _, loggerName := range config.DefaultFilter.Loggers {
if writerMap[loggerName] != nil {
continue
}
logger := initLogger(loggerName)
if logger != nil {
writerMap[loggerName] = logger
}
}
}
initialized = true
// rolling log file
StartRolling()
}
return nil
}
func GetByPackage(packageName string) []Writer {
if !Initialized() {
return nil
}
if config.PackageFilters == nil {
return nil
}
var writers []Writer
for _, filter := range config.PackageFilters {
//packageName := GetPackageName(frame.Function)
if packageName == filter.Name {
if len(filter.Loggers) == 0 {
// No Logger define
return nil
}
for _, name := range filter.Loggers {
writer := writerMap[name]
if writer == nil {
continue
}
writers = append(writers, writer)
}
}
}
return writers
}
func initProperties() {
if len(config.Properties) > 0 {
for _, v := range config.Properties {
propertyMap[v.Name] = v.Value
}
}
}
func initLogger(name string) Writer {
var (
err error
formatter Formatter
)
for _, v := range config.Loggers {
if name == v.Name {
// 初始化 Formatter
switch strings.ToLower(v.Format.Type) {
case "text":
formatter = NewTextFormatterWithFormat(v.Format.Value)
case "json":
formatter = NewJSONFormatter()
default:
formatter = NewTextFormatter()
}
switch v.Target {
case "STDOUT":
{
// Console Log
var (
consoleLogger *ConsoleLogger
)
consoleLogger = NewConsoleLogger(ConvertString2Level(v.Level.Allow))
consoleLogger.SetDenyLevel(ConvertString2Level(v.Level.Deny))
consoleLogger.SetFormatter(formatter)
consoleLogger.name = v.Name
return consoleLogger
}
case "FILE":
{
// File Log
var (
fileLogger *FileLogger
)
fileLogger, err = NewFileLoggerWithConfig(v)
if err == nil {
if v.Rolling.TimeBased == "" {
v.Rolling.TimeBased = "@daily"
}
err = job.AddFunc(v.Rolling.TimeBased, fileLogger.RollingFile)
if err != nil {
Errorf("create cron error %s", err.Error())
}
fileLogger.SetFormatter(formatter)
fileLogger.name = v.Name
return fileLogger
} else {
DefaultConsoleLogger().Error(err.Error())
}
}
default:
DefaultConsoleLogger().Warnf("unsupported log target %s", v.Target)
}
}
}
return nil
}
func rollingFileSize() {
if config.RollingInterval <= 0 {
config.RollingInterval = 60
}
for {
select {
case <-time.After(time.Duration(config.RollingInterval) * time.Second):
// rolling file
if writerMap != nil && rolling {
for _, v := range writerMap {
v.CheckRollingSize()
}
}
}
// if disable rolling break loop
if !rolling {
break
}
}
}
func StartRolling() {
rolling = true
job.Start()
go rollingFileSize()
}
func StopRolling() {
rolling = false
job.Stop()
}
func Initialized() bool {
return initialized
}
func Tracef(format string, args ...interface{}) {
if Initialized() {
for _, value := range writerMap {
value.Tracef(format, args...)
}
} else {
DefaultConsoleLogger().Tracef(format, args...)
}
}
func Debugf(format string, args ...interface{}) {
if Initialized() {
for _, value := range writerMap {
value.Debugf(format, args...)
}
} else {
DefaultConsoleLogger().Debugf(format, args...)
}
}
func Infof(format string, args ...interface{}) {
if Initialized() {
for _, value := range writerMap {
value.Infof(format, args...)
}
} else {
DefaultConsoleLogger().Infof(format, args...)
}
}
func Warnf(format string, args ...interface{}) {
if Initialized() {
for _, value := range writerMap {
value.Warnf(format, args...)
}
} else {
DefaultConsoleLogger().Warnf(format, args...)
}
}
func Errorf(format string, args ...interface{}) {
if Initialized() {
for _, value := range writerMap {
value.Errorf(format, args...)
}
} else {
DefaultConsoleLogger().Errorf(format, args...)
}
}
func Fatalf(format string, args ...interface{}) {
if Initialized() {
for _, value := range writerMap {
value.FatalfWithExit(false, format, args...)
}
} else {
DefaultConsoleLogger().FatalfWithExit(false, format, args...)
}
os.Exit(-1)
}
func Trace(args ...interface{}) {
if Initialized() {
for _, value := range writerMap {
value.Trace(args...)
}
} else {
DefaultConsoleLogger().Trace(args...)
}
}
func Debug(args ...interface{}) {
if Initialized() {
for _, value := range writerMap {
value.Debug(args...)
}
} else {
DefaultConsoleLogger().Debug(args...)
}
}
func Info(args ...interface{}) {
if Initialized() {
for _, value := range writerMap {
value.Info(args...)
}
} else {
DefaultConsoleLogger().Info(args...)
}
}
func Warn(args ...interface{}) {
if Initialized() {
for _, value := range writerMap {
value.Warn(args...)
}
} else {
DefaultConsoleLogger().Warn(args...)
}
}
func Error(args ...interface{}) {
if Initialized() {
for _, value := range writerMap {
value.Error(args...)
}
} else {
DefaultConsoleLogger().Error(args...)
}
}
func Fatal(args ...interface{}) {
if Initialized() {
for _, value := range writerMap {
value.FatalWithExit(false, args...)
}
} else {
DefaultConsoleLogger().FatalWithExit(false, args...)
}
os.Exit(-1)
}