// Copyright 2015 CoreOS, 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 capnslogimport ()// LogLevel is the set of all log levels.typeLogLevelint8const (// CRITICAL is the lowest log level; only errors which will end the program will be propagated.CRITICALLogLevel = iota - 1// ERROR is for errors that are not fatal but lead to troubling behavior.ERROR// WARNING is for errors which are not fatal and not errors, but are unusual. Often sourced from misconfigurations.WARNING// NOTICE is for normal but significant conditions.NOTICE// INFO is a log level for common, everyday log updates.INFO// DEBUG is the default hidden level for more verbose updates about internal processes.DEBUG// TRACE is for (potentially) call by call tracing of programs.TRACE)// Char returns a single-character representation of the log level.func ( LogLevel) () string {switch {caseCRITICAL:return"C"caseERROR:return"E"caseWARNING:return"W"caseNOTICE:return"N"caseINFO:return"I"caseDEBUG:return"D"caseTRACE:return"T"default:panic("Unhandled loglevel") }}// String returns a multi-character representation of the log level.func ( LogLevel) () string {switch {caseCRITICAL:return"CRITICAL"caseERROR:return"ERROR"caseWARNING:return"WARNING"caseNOTICE:return"NOTICE"caseINFO:return"INFO"caseDEBUG:return"DEBUG"caseTRACE:return"TRACE"default:panic("Unhandled loglevel") }}// Update using the given string value. Fulfills the flag.Value interface.func ( *LogLevel) ( string) error { , := ParseLevel()if != nil {return } * = returnnil}// Returns an empty string, only here to fulfill the pflag.Value interface.func ( *LogLevel) () string {return""}// ParseLevel translates some potential loglevel strings into their corresponding levels.func ( string) (LogLevel, error) {switch {case"CRITICAL", "C":returnCRITICAL, nilcase"ERROR", "0", "E":returnERROR, nilcase"WARNING", "1", "W":returnWARNING, nilcase"NOTICE", "2", "N":returnNOTICE, nilcase"INFO", "3", "I":returnINFO, nilcase"DEBUG", "4", "D":returnDEBUG, nilcase"TRACE", "5", "T":returnTRACE, nil }returnCRITICAL, errors.New("couldn't parse log level " + )}typeRepoLoggermap[string]*PackageLoggertype loggerStruct struct {sync.Mutex repoMap map[string]RepoLogger formatter Formatter}// logger is the global loggervar logger = new(loggerStruct)// SetGlobalLogLevel sets the log level for all packages in all repositories// registered with capnslog.func ( LogLevel) {logger.Lock()deferlogger.Unlock()for , := rangelogger.repoMap { .setRepoLogLevelInternal() }}// GetRepoLogger may return the handle to the repository's set of packages' loggers.func ( string) (RepoLogger, error) {logger.Lock()deferlogger.Unlock() , := logger.repoMap[]if ! {returnnil, errors.New("no packages registered for repo " + ) }return , nil}// MustRepoLogger returns the handle to the repository's packages' loggers.func ( string) RepoLogger { , := GetRepoLogger()if != nil {panic() }return}// SetRepoLogLevel sets the log level for all packages in the repository.func ( RepoLogger) ( LogLevel) {logger.Lock()deferlogger.Unlock() .setRepoLogLevelInternal()}func ( RepoLogger) ( LogLevel) {for , := range { .level = }}// ParseLogLevelConfig parses a comma-separated string of "package=loglevel", in// order, and returns a map of the results, for use in SetLogLevel.func ( RepoLogger) ( string) (map[string]LogLevel, error) { := strings.Split(, ",") := make(map[string]LogLevel)for , := range { := strings.Split(, "=")iflen() != 2 {returnnil, errors.New("oddly structured `pkg=level` option: " + ) } , := ParseLevel([1])if != nil {returnnil, } [[0]] = }return , nil}// SetLogLevel takes a map of package names within a repository to their desired// loglevel, and sets the levels appropriately. Unknown packages are ignored.// "*" is a special package name that corresponds to all packages, and will be// processed first.func ( RepoLogger) ( map[string]LogLevel) {logger.Lock()deferlogger.Unlock()if , := ["*"]; { .setRepoLogLevelInternal() }for , := range { , := []if ! {continue } .level = }}// SetFormatter sets the formatting function for all logs.func ( Formatter) {logger.Lock()deferlogger.Unlock()logger.formatter = }// NewPackageLogger creates a package logger object.// This should be defined as a global var in your package, referencing your repo.func ( string, string) ( *PackageLogger) {logger.Lock()deferlogger.Unlock()iflogger.repoMap == nil {logger.repoMap = make(map[string]RepoLogger) } , := logger.repoMap[]if ! {logger.repoMap[] = make(RepoLogger) = logger.repoMap[] } , := []if ! { [] = &PackageLogger{pkg: ,level: INFO, } = [] }return}
The pages are generated with Goldsv0.8.2. (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu.
PR and bug reports are welcome and can be submitted to the issue list.
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds.