mirror of
https://github.com/minio/minio.git
synced 2024-12-25 06:35:56 -05:00
ae4361cc45
Validate Minio config by checking if there is double json key in any scope level. The returned error contains the json path to the duplicated key.
158 lines
3.5 KiB
Go
158 lines
3.5 KiB
Go
/*
|
|
* Minio Cloud Storage, (C) 2015, 2016 Minio, Inc.
|
|
*
|
|
* 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 cmd
|
|
|
|
import (
|
|
"fmt"
|
|
"path"
|
|
"runtime"
|
|
"strings"
|
|
"sync"
|
|
|
|
"github.com/Sirupsen/logrus"
|
|
)
|
|
|
|
type fields map[string]interface{}
|
|
|
|
var log = struct {
|
|
loggers []*logrus.Logger // All registered loggers.
|
|
mu sync.Mutex
|
|
}{}
|
|
|
|
// logger carries logging configuration for various supported loggers.
|
|
// Currently supported loggers are
|
|
//
|
|
// - console [default]
|
|
// - file
|
|
type logger struct {
|
|
sync.RWMutex
|
|
Console consoleLogger `json:"console"`
|
|
File fileLogger `json:"file"`
|
|
// Add new loggers here.
|
|
}
|
|
|
|
/// Logger related.
|
|
|
|
// Validate logger contents
|
|
func (l *logger) Validate() error {
|
|
if l == nil {
|
|
return nil
|
|
}
|
|
if err := l.Console.Validate(); err != nil {
|
|
return fmt.Errorf("`Console` field: %s", err.Error())
|
|
}
|
|
if err := l.File.Validate(); err != nil {
|
|
return fmt.Errorf("`File` field: %s", err.Error())
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// SetFile set new file logger.
|
|
func (l *logger) SetFile(flogger fileLogger) {
|
|
l.Lock()
|
|
defer l.Unlock()
|
|
l.File = flogger
|
|
}
|
|
|
|
// GetFileLogger get current file logger.
|
|
func (l *logger) GetFile() fileLogger {
|
|
l.RLock()
|
|
defer l.RUnlock()
|
|
return l.File
|
|
}
|
|
|
|
// SetConsole set new console logger.
|
|
func (l *logger) SetConsole(clogger consoleLogger) {
|
|
l.Lock()
|
|
defer l.Unlock()
|
|
l.Console = clogger
|
|
}
|
|
|
|
func (l *logger) GetConsole() consoleLogger {
|
|
l.RLock()
|
|
defer l.RUnlock()
|
|
return l.Console
|
|
}
|
|
|
|
// Get file, line, function name of the caller.
|
|
func callerSource() string {
|
|
pc, file, line, success := runtime.Caller(2)
|
|
if !success {
|
|
file = "<unknown>"
|
|
line = 0
|
|
}
|
|
file = path.Base(file)
|
|
name := runtime.FuncForPC(pc).Name()
|
|
name = strings.TrimPrefix(name, "github.com/minio/minio/cmd.")
|
|
return fmt.Sprintf("[%s:%d:%s()]", file, line, name)
|
|
}
|
|
|
|
// errorIf synonymous with fatalIf but doesn't exit on error != nil
|
|
func errorIf(err error, msg string, data ...interface{}) {
|
|
if err == nil || !isErrLogged(err) {
|
|
return
|
|
}
|
|
source := callerSource()
|
|
fields := logrus.Fields{
|
|
"source": source,
|
|
"cause": err.Error(),
|
|
}
|
|
if e, ok := err.(*Error); ok {
|
|
fields["stack"] = strings.Join(e.Trace(), " ")
|
|
}
|
|
|
|
for _, log := range log.loggers {
|
|
log.WithFields(fields).Errorf(msg, data...)
|
|
}
|
|
}
|
|
|
|
// fatalIf wrapper function which takes error and prints jsonic error messages.
|
|
func fatalIf(err error, msg string, data ...interface{}) {
|
|
if err == nil || !isErrLogged(err) {
|
|
return
|
|
}
|
|
source := callerSource()
|
|
fields := logrus.Fields{
|
|
"source": source,
|
|
"cause": err.Error(),
|
|
}
|
|
if e, ok := err.(*Error); ok {
|
|
fields["stack"] = strings.Join(e.Trace(), " ")
|
|
}
|
|
|
|
for _, log := range log.loggers {
|
|
log.WithFields(fields).Fatalf(msg, data...)
|
|
}
|
|
}
|
|
|
|
// returns false if error is not supposed to be logged.
|
|
func isErrLogged(err error) (ok bool) {
|
|
ok = true
|
|
err = errorCause(err)
|
|
switch err.(type) {
|
|
case BucketNotFound, BucketNotEmpty, BucketExists:
|
|
ok = false
|
|
case ObjectNotFound, ObjectExistsAsDirectory:
|
|
ok = false
|
|
case BucketPolicyNotFound, InvalidUploadID:
|
|
ok = false
|
|
case BadDigest:
|
|
ok = false
|
|
}
|
|
return ok
|
|
}
|