Vendor sirupsen/logrus@1.3.0
Signed-off-by: John Howard <jhoward@microsoft.com>
This commit is contained in:
		
							
								
								
									
										95
									
								
								vendor/github.com/sirupsen/logrus/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										95
									
								
								vendor/github.com/sirupsen/logrus/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -56,8 +56,39 @@ time="2015-03-26T01:27:38-04:00" level=warning msg="The group's number increased
 | 
			
		||||
time="2015-03-26T01:27:38-04:00" level=debug msg="Temperature changes" temperature=-4
 | 
			
		||||
time="2015-03-26T01:27:38-04:00" level=panic msg="It's over 9000!" animal=orca size=9009
 | 
			
		||||
time="2015-03-26T01:27:38-04:00" level=fatal msg="The ice breaks!" err=&{0x2082280c0 map[animal:orca size:9009] 2015-03-26 01:27:38.441574009 -0400 EDT panic It's over 9000!} number=100 omg=true
 | 
			
		||||
exit status 1
 | 
			
		||||
```
 | 
			
		||||
To ensure this behaviour even if a TTY is attached, set your formatter as follows:
 | 
			
		||||
 | 
			
		||||
```go
 | 
			
		||||
	log.SetFormatter(&log.TextFormatter{
 | 
			
		||||
		DisableColors: true,
 | 
			
		||||
		FullTimestamp: true,
 | 
			
		||||
	})
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
#### Logging Method Name
 | 
			
		||||
 | 
			
		||||
If you wish to add the calling method as a field, instruct the logger via:
 | 
			
		||||
```go
 | 
			
		||||
log.SetReportCaller(true)
 | 
			
		||||
```
 | 
			
		||||
This adds the caller as 'method' like so:
 | 
			
		||||
 | 
			
		||||
```json
 | 
			
		||||
{"animal":"penguin","level":"fatal","method":"github.com/sirupsen/arcticcreatures.migrate","msg":"a penguin swims by",
 | 
			
		||||
"time":"2014-03-10 19:57:38.562543129 -0400 EDT"}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
```text
 | 
			
		||||
time="2015-03-26T01:27:38-04:00" level=fatal method=github.com/sirupsen/arcticcreatures.migrate msg="a penguin swims by" animal=penguin
 | 
			
		||||
```
 | 
			
		||||
Note that this does add measurable overhead - the cost will depend on the version of Go, but is
 | 
			
		||||
between 20 and 40% in recent tests with 1.6 and 1.7.  You can validate this in your
 | 
			
		||||
environment via benchmarks: 
 | 
			
		||||
```
 | 
			
		||||
go test -bench=.*CallerTracing
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#### Case-sensitivity
 | 
			
		||||
 | 
			
		||||
@@ -220,7 +251,7 @@ Logrus comes with [built-in hooks](hooks/). Add those, or your custom hook, in
 | 
			
		||||
```go
 | 
			
		||||
import (
 | 
			
		||||
  log "github.com/sirupsen/logrus"
 | 
			
		||||
  "gopkg.in/gemnasium/logrus-airbrake-hook.v2" // the package is named "aibrake"
 | 
			
		||||
  "gopkg.in/gemnasium/logrus-airbrake-hook.v2" // the package is named "airbrake"
 | 
			
		||||
  logrus_syslog "github.com/sirupsen/logrus/hooks/syslog"
 | 
			
		||||
  "log/syslog"
 | 
			
		||||
)
 | 
			
		||||
@@ -241,60 +272,15 @@ func init() {
 | 
			
		||||
```
 | 
			
		||||
Note: Syslog hook also support connecting to local syslog (Ex. "/dev/log" or "/var/run/syslog" or "/var/run/log"). For the detail, please check the [syslog hook README](hooks/syslog/README.md).
 | 
			
		||||
 | 
			
		||||
| Hook  | Description |
 | 
			
		||||
| ----- | ----------- |
 | 
			
		||||
| [Airbrake "legacy"](https://github.com/gemnasium/logrus-airbrake-legacy-hook) | Send errors to an exception tracking service compatible with the Airbrake API V2. Uses [`airbrake-go`](https://github.com/tobi/airbrake-go) behind the scenes. |
 | 
			
		||||
| [Airbrake](https://github.com/gemnasium/logrus-airbrake-hook) | Send errors to the Airbrake API V3. Uses the official [`gobrake`](https://github.com/airbrake/gobrake) behind the scenes. |
 | 
			
		||||
| [Amazon Kinesis](https://github.com/evalphobia/logrus_kinesis) | Hook for logging to [Amazon Kinesis](https://aws.amazon.com/kinesis/) |
 | 
			
		||||
| [Amqp-Hook](https://github.com/vladoatanasov/logrus_amqp) | Hook for logging to Amqp broker (Like RabbitMQ) |
 | 
			
		||||
| [Bugsnag](https://github.com/Shopify/logrus-bugsnag/blob/master/bugsnag.go) | Send errors to the Bugsnag exception tracking service. |
 | 
			
		||||
| [DeferPanic](https://github.com/deferpanic/dp-logrus) | Hook for logging to DeferPanic |
 | 
			
		||||
| [Discordrus](https://github.com/kz/discordrus) | Hook for logging to [Discord](https://discordapp.com/) |
 | 
			
		||||
| [ElasticSearch](https://github.com/sohlich/elogrus) | Hook for logging to ElasticSearch|
 | 
			
		||||
| [Firehose](https://github.com/beaubrewer/logrus_firehose) | Hook for logging to [Amazon Firehose](https://aws.amazon.com/kinesis/firehose/)
 | 
			
		||||
| [Fluentd](https://github.com/evalphobia/logrus_fluent) | Hook for logging to fluentd |
 | 
			
		||||
| [Go-Slack](https://github.com/multiplay/go-slack) | Hook for logging to [Slack](https://slack.com) |
 | 
			
		||||
| [Graylog](https://github.com/gemnasium/logrus-graylog-hook) | Hook for logging to [Graylog](http://graylog2.org/) |
 | 
			
		||||
| [Hiprus](https://github.com/nubo/hiprus) | Send errors to a channel in hipchat. |
 | 
			
		||||
| [Honeybadger](https://github.com/agonzalezro/logrus_honeybadger) | Hook for sending exceptions to Honeybadger |
 | 
			
		||||
| [InfluxDB](https://github.com/Abramovic/logrus_influxdb) | Hook for logging to influxdb |
 | 
			
		||||
| [Influxus](http://github.com/vlad-doru/influxus) | Hook for concurrently logging to [InfluxDB](http://influxdata.com/) |
 | 
			
		||||
| [Journalhook](https://github.com/wercker/journalhook) | Hook for logging to `systemd-journald` |
 | 
			
		||||
| [KafkaLogrus](https://github.com/goibibo/KafkaLogrus) | Hook for logging to kafka |
 | 
			
		||||
| [LFShook](https://github.com/rifflock/lfshook) | Hook for logging to the local filesystem |
 | 
			
		||||
| [Logentries](https://github.com/jcftang/logentriesrus) | Hook for logging to [Logentries](https://logentries.com/) |
 | 
			
		||||
| [Logentrus](https://github.com/puddingfactory/logentrus) | Hook for logging to [Logentries](https://logentries.com/) |
 | 
			
		||||
| [Logmatic.io](https://github.com/logmatic/logmatic-go) | Hook for logging to [Logmatic.io](http://logmatic.io/) |
 | 
			
		||||
| [Logrusly](https://github.com/sebest/logrusly) | Send logs to [Loggly](https://www.loggly.com/) |
 | 
			
		||||
| [Logstash](https://github.com/bshuster-repo/logrus-logstash-hook) | Hook for logging to [Logstash](https://www.elastic.co/products/logstash) |
 | 
			
		||||
| [Mail](https://github.com/zbindenren/logrus_mail) | Hook for sending exceptions via mail |
 | 
			
		||||
| [Mattermost](https://github.com/shuLhan/mattermost-integration/tree/master/hooks/logrus) | Hook for logging to [Mattermost](https://mattermost.com/) |
 | 
			
		||||
| [Mongodb](https://github.com/weekface/mgorus) | Hook for logging to mongodb |
 | 
			
		||||
| [NATS-Hook](https://github.com/rybit/nats_logrus_hook) | Hook for logging to [NATS](https://nats.io) |
 | 
			
		||||
| [Octokit](https://github.com/dorajistyle/logrus-octokit-hook) | Hook for logging to github via octokit |
 | 
			
		||||
| [Papertrail](https://github.com/polds/logrus-papertrail-hook) | Send errors to the [Papertrail](https://papertrailapp.com) hosted logging service via UDP. |
 | 
			
		||||
| [PostgreSQL](https://github.com/gemnasium/logrus-postgresql-hook) | Send logs to [PostgreSQL](http://postgresql.org) |
 | 
			
		||||
| [Pushover](https://github.com/toorop/logrus_pushover) | Send error via [Pushover](https://pushover.net) |
 | 
			
		||||
| [Raygun](https://github.com/squirkle/logrus-raygun-hook) | Hook for logging to [Raygun.io](http://raygun.io/) |
 | 
			
		||||
| [Redis-Hook](https://github.com/rogierlommers/logrus-redis-hook) | Hook for logging to a ELK stack (through Redis) |
 | 
			
		||||
| [Rollrus](https://github.com/heroku/rollrus) | Hook for sending errors to rollbar |
 | 
			
		||||
| [Scribe](https://github.com/sagar8192/logrus-scribe-hook) | Hook for logging to [Scribe](https://github.com/facebookarchive/scribe)|
 | 
			
		||||
| [Sentry](https://github.com/evalphobia/logrus_sentry) | Send errors to the Sentry error logging and aggregation service. |
 | 
			
		||||
| [Slackrus](https://github.com/johntdyer/slackrus) | Hook for Slack chat. |
 | 
			
		||||
| [Stackdriver](https://github.com/knq/sdhook) | Hook for logging to [Google Stackdriver](https://cloud.google.com/logging/) |
 | 
			
		||||
| [Sumorus](https://github.com/doublefree/sumorus) | Hook for logging to [SumoLogic](https://www.sumologic.com/)|
 | 
			
		||||
| [Syslog](https://github.com/sirupsen/logrus/blob/master/hooks/syslog/syslog.go) | Send errors to remote syslog server. Uses standard library `log/syslog` behind the scenes. |
 | 
			
		||||
| [Syslog TLS](https://github.com/shinji62/logrus-syslog-ng) | Send errors to remote syslog server with TLS support. |
 | 
			
		||||
| [TraceView](https://github.com/evalphobia/logrus_appneta) | Hook for logging to [AppNeta TraceView](https://www.appneta.com/products/traceview/) |
 | 
			
		||||
| [Typetalk](https://github.com/dragon3/logrus-typetalk-hook) | Hook for logging to [Typetalk](https://www.typetalk.in/) |
 | 
			
		||||
| [logz.io](https://github.com/ripcurld00d/logrus-logzio-hook) | Hook for logging to [logz.io](https://logz.io), a Log as a Service using Logstash |
 | 
			
		||||
| [SQS-Hook](https://github.com/tsarpaul/logrus_sqs) | Hook for logging to [Amazon Simple Queue Service (SQS)](https://aws.amazon.com/sqs/) |
 | 
			
		||||
A list of currently known of service hook can be found in this wiki [page](https://github.com/sirupsen/logrus/wiki/Hooks)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#### Level logging
 | 
			
		||||
 | 
			
		||||
Logrus has six logging levels: Debug, Info, Warning, Error, Fatal and Panic.
 | 
			
		||||
Logrus has seven logging levels: Trace, Debug, Info, Warning, Error, Fatal and Panic.
 | 
			
		||||
 | 
			
		||||
```go
 | 
			
		||||
log.Trace("Something very low level.")
 | 
			
		||||
log.Debug("Useful debugging information.")
 | 
			
		||||
log.Info("Something noteworthy happened!")
 | 
			
		||||
log.Warn("You should probably take a look at this.")
 | 
			
		||||
@@ -366,13 +352,16 @@ The built-in logging formatters are:
 | 
			
		||||
    field to `true`.  To force no colored output even if there is a TTY  set the
 | 
			
		||||
    `DisableColors` field to `true`. For Windows, see
 | 
			
		||||
    [github.com/mattn/go-colorable](https://github.com/mattn/go-colorable).
 | 
			
		||||
  * When colors are enabled, levels are truncated to 4 characters by default. To disable
 | 
			
		||||
    truncation set the `DisableLevelTruncation` field to `true`.
 | 
			
		||||
  * All options are listed in the [generated docs](https://godoc.org/github.com/sirupsen/logrus#TextFormatter).
 | 
			
		||||
* `logrus.JSONFormatter`. Logs fields as JSON.
 | 
			
		||||
  * All options are listed in the [generated docs](https://godoc.org/github.com/sirupsen/logrus#JSONFormatter).
 | 
			
		||||
 | 
			
		||||
Third party logging formatters:
 | 
			
		||||
 | 
			
		||||
* [`FluentdFormatter`](https://github.com/joonix/log). Formats entries that can by parsed by Kubernetes and Google Container Engine.
 | 
			
		||||
* [`FluentdFormatter`](https://github.com/joonix/log). Formats entries that can be parsed by Kubernetes and Google Container Engine.
 | 
			
		||||
* [`GELF`](https://github.com/fabienm/go-logrus-formatters). Formats entries so they comply to Graylog's [GELF 1.1 specification](http://docs.graylog.org/en/2.4/pages/gelf.html).
 | 
			
		||||
* [`logstash`](https://github.com/bshuster-repo/logrus-logstash-hook). Logs fields as [Logstash](http://logstash.net) Events.
 | 
			
		||||
* [`prefixed`](https://github.com/x-cray/logrus-prefixed-formatter). Displays log entry source along with alternative layout.
 | 
			
		||||
* [`zalgo`](https://github.com/aybabtme/logzalgo). Invoking the P͉̫o̳̼̊w̖͈̰͎e̬͔̭͂r͚̼̹̲ ̫͓͉̳͈ō̠͕͖̚f̝͍̠ ͕̲̞͖͑Z̖̫̤̫ͪa͉̬͈̗l͖͎g̳̥o̰̥̅!̣͔̲̻͊̄ ̙̘̦̹̦.
 | 
			
		||||
@@ -489,7 +478,7 @@ logrus.RegisterExitHandler(handler)
 | 
			
		||||
 | 
			
		||||
#### Thread safety
 | 
			
		||||
 | 
			
		||||
By default Logger is protected by mutex for concurrent writes, this mutex is invoked when calling hooks and writing logs.
 | 
			
		||||
By default, Logger is protected by a mutex for concurrent writes. The mutex is held when calling hooks and writing logs.
 | 
			
		||||
If you are sure such locking is not needed, you can call logger.SetNoLock() to disable the locking.
 | 
			
		||||
 | 
			
		||||
Situation when locking is not needed includes:
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										291
									
								
								vendor/github.com/sirupsen/logrus/entry.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										291
									
								
								vendor/github.com/sirupsen/logrus/entry.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -4,11 +4,30 @@ import (
 | 
			
		||||
	"bytes"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"os"
 | 
			
		||||
	"reflect"
 | 
			
		||||
	"runtime"
 | 
			
		||||
	"strings"
 | 
			
		||||
	"sync"
 | 
			
		||||
	"time"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var bufferPool *sync.Pool
 | 
			
		||||
var (
 | 
			
		||||
	bufferPool *sync.Pool
 | 
			
		||||
 | 
			
		||||
	// qualified package name, cached at first use
 | 
			
		||||
	logrusPackage string
 | 
			
		||||
 | 
			
		||||
	// Positions in the call stack when tracing to report the calling method
 | 
			
		||||
	minimumCallerDepth int
 | 
			
		||||
 | 
			
		||||
	// Used for caller information initialisation
 | 
			
		||||
	callerInitOnce sync.Once
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	maximumCallerDepth int = 25
 | 
			
		||||
	knownLogrusFrames  int = 4
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func init() {
 | 
			
		||||
	bufferPool = &sync.Pool{
 | 
			
		||||
@@ -16,15 +35,18 @@ func init() {
 | 
			
		||||
			return new(bytes.Buffer)
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// start at the bottom of the stack before the package-name cache is primed
 | 
			
		||||
	minimumCallerDepth = 1
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Defines the key when adding errors using WithError.
 | 
			
		||||
var ErrorKey = "error"
 | 
			
		||||
 | 
			
		||||
// An entry is the final or intermediate Logrus logging entry. It contains all
 | 
			
		||||
// the fields passed with WithField{,s}. It's finally logged when Debug, Info,
 | 
			
		||||
// Warn, Error, Fatal or Panic is called on it. These objects can be reused and
 | 
			
		||||
// passed around as much as you wish to avoid field duplication.
 | 
			
		||||
// the fields passed with WithField{,s}. It's finally logged when Trace, Debug,
 | 
			
		||||
// Info, Warn, Error, Fatal or Panic is called on it. These objects can be
 | 
			
		||||
// reused and passed around as much as you wish to avoid field duplication.
 | 
			
		||||
type Entry struct {
 | 
			
		||||
	Logger *Logger
 | 
			
		||||
 | 
			
		||||
@@ -34,22 +56,28 @@ type Entry struct {
 | 
			
		||||
	// Time at which the log entry was created
 | 
			
		||||
	Time time.Time
 | 
			
		||||
 | 
			
		||||
	// Level the log entry was logged at: Debug, Info, Warn, Error, Fatal or Panic
 | 
			
		||||
	// Level the log entry was logged at: Trace, Debug, Info, Warn, Error, Fatal or Panic
 | 
			
		||||
	// This field will be set on entry firing and the value will be equal to the one in Logger struct field.
 | 
			
		||||
	Level Level
 | 
			
		||||
 | 
			
		||||
	// Message passed to Debug, Info, Warn, Error, Fatal or Panic
 | 
			
		||||
	// Calling method, with package name
 | 
			
		||||
	Caller *runtime.Frame
 | 
			
		||||
 | 
			
		||||
	// Message passed to Trace, Debug, Info, Warn, Error, Fatal or Panic
 | 
			
		||||
	Message string
 | 
			
		||||
 | 
			
		||||
	// When formatter is called in entry.log(), an Buffer may be set to entry
 | 
			
		||||
	// When formatter is called in entry.log(), a Buffer may be set to entry
 | 
			
		||||
	Buffer *bytes.Buffer
 | 
			
		||||
 | 
			
		||||
	// err may contain a field formatting error
 | 
			
		||||
	err string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func NewEntry(logger *Logger) *Entry {
 | 
			
		||||
	return &Entry{
 | 
			
		||||
		Logger: logger,
 | 
			
		||||
		// Default is three fields, give a little extra room
 | 
			
		||||
		Data: make(Fields, 5),
 | 
			
		||||
		// Default is three fields, plus one optional.  Give a little extra room.
 | 
			
		||||
		Data: make(Fields, 6),
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -80,43 +108,117 @@ func (entry *Entry) WithFields(fields Fields) *Entry {
 | 
			
		||||
	for k, v := range entry.Data {
 | 
			
		||||
		data[k] = v
 | 
			
		||||
	}
 | 
			
		||||
	fieldErr := entry.err
 | 
			
		||||
	for k, v := range fields {
 | 
			
		||||
		data[k] = v
 | 
			
		||||
		isErrField := false
 | 
			
		||||
		if t := reflect.TypeOf(v); t != nil {
 | 
			
		||||
			switch t.Kind() {
 | 
			
		||||
			case reflect.Func:
 | 
			
		||||
				isErrField = true
 | 
			
		||||
			case reflect.Ptr:
 | 
			
		||||
				isErrField = t.Elem().Kind() == reflect.Func
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		if isErrField {
 | 
			
		||||
			tmp := fmt.Sprintf("can not add field %q", k)
 | 
			
		||||
			if fieldErr != "" {
 | 
			
		||||
				fieldErr = entry.err + ", " + tmp
 | 
			
		||||
			} else {
 | 
			
		||||
				fieldErr = tmp
 | 
			
		||||
			}
 | 
			
		||||
		} else {
 | 
			
		||||
			data[k] = v
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return &Entry{Logger: entry.Logger, Data: data}
 | 
			
		||||
	return &Entry{Logger: entry.Logger, Data: data, Time: entry.Time, err: fieldErr}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Overrides the time of the Entry.
 | 
			
		||||
func (entry *Entry) WithTime(t time.Time) *Entry {
 | 
			
		||||
	return &Entry{Logger: entry.Logger, Data: entry.Data, Time: t, err: entry.err}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// getPackageName reduces a fully qualified function name to the package name
 | 
			
		||||
// There really ought to be to be a better way...
 | 
			
		||||
func getPackageName(f string) string {
 | 
			
		||||
	for {
 | 
			
		||||
		lastPeriod := strings.LastIndex(f, ".")
 | 
			
		||||
		lastSlash := strings.LastIndex(f, "/")
 | 
			
		||||
		if lastPeriod > lastSlash {
 | 
			
		||||
			f = f[:lastPeriod]
 | 
			
		||||
		} else {
 | 
			
		||||
			break
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return f
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// getCaller retrieves the name of the first non-logrus calling function
 | 
			
		||||
func getCaller() *runtime.Frame {
 | 
			
		||||
	// Restrict the lookback frames to avoid runaway lookups
 | 
			
		||||
	pcs := make([]uintptr, maximumCallerDepth)
 | 
			
		||||
	depth := runtime.Callers(minimumCallerDepth, pcs)
 | 
			
		||||
	frames := runtime.CallersFrames(pcs[:depth])
 | 
			
		||||
 | 
			
		||||
	// cache this package's fully-qualified name
 | 
			
		||||
	callerInitOnce.Do(func() {
 | 
			
		||||
		logrusPackage = getPackageName(runtime.FuncForPC(pcs[0]).Name())
 | 
			
		||||
 | 
			
		||||
		// now that we have the cache, we can skip a minimum count of known-logrus functions
 | 
			
		||||
		// XXX this is dubious, the number of frames may vary store an entry in a logger interface
 | 
			
		||||
		minimumCallerDepth = knownLogrusFrames
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	for f, again := frames.Next(); again; f, again = frames.Next() {
 | 
			
		||||
		pkg := getPackageName(f.Function)
 | 
			
		||||
 | 
			
		||||
		// If the caller isn't part of this package, we're done
 | 
			
		||||
		if pkg != logrusPackage {
 | 
			
		||||
			return &f
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// if we got here, we failed to find the caller's context
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (entry Entry) HasCaller() (has bool) {
 | 
			
		||||
	return entry.Logger != nil &&
 | 
			
		||||
		entry.Logger.ReportCaller &&
 | 
			
		||||
		entry.Caller != nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// This function is not declared with a pointer value because otherwise
 | 
			
		||||
// race conditions will occur when using multiple goroutines
 | 
			
		||||
func (entry Entry) log(level Level, msg string) {
 | 
			
		||||
	var buffer *bytes.Buffer
 | 
			
		||||
	entry.Time = time.Now()
 | 
			
		||||
 | 
			
		||||
	// Default to now, but allow users to override if they want.
 | 
			
		||||
	//
 | 
			
		||||
	// We don't have to worry about polluting future calls to Entry#log()
 | 
			
		||||
	// with this assignment because this function is declared with a
 | 
			
		||||
	// non-pointer receiver.
 | 
			
		||||
	if entry.Time.IsZero() {
 | 
			
		||||
		entry.Time = time.Now()
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	entry.Level = level
 | 
			
		||||
	entry.Message = msg
 | 
			
		||||
 | 
			
		||||
	if err := entry.Logger.Hooks.Fire(level, &entry); err != nil {
 | 
			
		||||
		entry.Logger.mu.Lock()
 | 
			
		||||
		fmt.Fprintf(os.Stderr, "Failed to fire hook: %v\n", err)
 | 
			
		||||
		entry.Logger.mu.Unlock()
 | 
			
		||||
	if entry.Logger.ReportCaller {
 | 
			
		||||
		entry.Caller = getCaller()
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	entry.fireHooks()
 | 
			
		||||
 | 
			
		||||
	buffer = bufferPool.Get().(*bytes.Buffer)
 | 
			
		||||
	buffer.Reset()
 | 
			
		||||
	defer bufferPool.Put(buffer)
 | 
			
		||||
	entry.Buffer = buffer
 | 
			
		||||
	serialized, err := entry.Logger.Formatter.Format(&entry)
 | 
			
		||||
 | 
			
		||||
	entry.write()
 | 
			
		||||
 | 
			
		||||
	entry.Buffer = nil
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		entry.Logger.mu.Lock()
 | 
			
		||||
		fmt.Fprintf(os.Stderr, "Failed to obtain reader, %v\n", err)
 | 
			
		||||
		entry.Logger.mu.Unlock()
 | 
			
		||||
	} else {
 | 
			
		||||
		entry.Logger.mu.Lock()
 | 
			
		||||
		_, err = entry.Logger.Out.Write(serialized)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			fmt.Fprintf(os.Stderr, "Failed to write to log, %v\n", err)
 | 
			
		||||
		}
 | 
			
		||||
		entry.Logger.mu.Unlock()
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// To avoid Entry#log() returning a value that only would make sense for
 | 
			
		||||
	// panic() to use in Entry#Panic(), we avoid the allocation by checking
 | 
			
		||||
@@ -126,26 +228,53 @@ func (entry Entry) log(level Level, msg string) {
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (entry *Entry) Debug(args ...interface{}) {
 | 
			
		||||
	if entry.Logger.level() >= DebugLevel {
 | 
			
		||||
		entry.log(DebugLevel, fmt.Sprint(args...))
 | 
			
		||||
func (entry *Entry) fireHooks() {
 | 
			
		||||
	entry.Logger.mu.Lock()
 | 
			
		||||
	defer entry.Logger.mu.Unlock()
 | 
			
		||||
	err := entry.Logger.Hooks.Fire(entry.Level, entry)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		fmt.Fprintf(os.Stderr, "Failed to fire hook: %v\n", err)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (entry *Entry) write() {
 | 
			
		||||
	entry.Logger.mu.Lock()
 | 
			
		||||
	defer entry.Logger.mu.Unlock()
 | 
			
		||||
	serialized, err := entry.Logger.Formatter.Format(entry)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		fmt.Fprintf(os.Stderr, "Failed to obtain reader, %v\n", err)
 | 
			
		||||
	} else {
 | 
			
		||||
		_, err = entry.Logger.Out.Write(serialized)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			fmt.Fprintf(os.Stderr, "Failed to write to log, %v\n", err)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (entry *Entry) Log(level Level, args ...interface{}) {
 | 
			
		||||
	if entry.Logger.IsLevelEnabled(level) {
 | 
			
		||||
		entry.log(level, fmt.Sprint(args...))
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (entry *Entry) Trace(args ...interface{}) {
 | 
			
		||||
	entry.Log(TraceLevel, args...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (entry *Entry) Debug(args ...interface{}) {
 | 
			
		||||
	entry.Log(DebugLevel, args...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (entry *Entry) Print(args ...interface{}) {
 | 
			
		||||
	entry.Info(args...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (entry *Entry) Info(args ...interface{}) {
 | 
			
		||||
	if entry.Logger.level() >= InfoLevel {
 | 
			
		||||
		entry.log(InfoLevel, fmt.Sprint(args...))
 | 
			
		||||
	}
 | 
			
		||||
	entry.Log(InfoLevel, args...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (entry *Entry) Warn(args ...interface{}) {
 | 
			
		||||
	if entry.Logger.level() >= WarnLevel {
 | 
			
		||||
		entry.log(WarnLevel, fmt.Sprint(args...))
 | 
			
		||||
	}
 | 
			
		||||
	entry.Log(WarnLevel, args...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (entry *Entry) Warning(args ...interface{}) {
 | 
			
		||||
@@ -153,37 +282,35 @@ func (entry *Entry) Warning(args ...interface{}) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (entry *Entry) Error(args ...interface{}) {
 | 
			
		||||
	if entry.Logger.level() >= ErrorLevel {
 | 
			
		||||
		entry.log(ErrorLevel, fmt.Sprint(args...))
 | 
			
		||||
	}
 | 
			
		||||
	entry.Log(ErrorLevel, args...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (entry *Entry) Fatal(args ...interface{}) {
 | 
			
		||||
	if entry.Logger.level() >= FatalLevel {
 | 
			
		||||
		entry.log(FatalLevel, fmt.Sprint(args...))
 | 
			
		||||
	}
 | 
			
		||||
	Exit(1)
 | 
			
		||||
	entry.Log(FatalLevel, args...)
 | 
			
		||||
	entry.Logger.Exit(1)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (entry *Entry) Panic(args ...interface{}) {
 | 
			
		||||
	if entry.Logger.level() >= PanicLevel {
 | 
			
		||||
		entry.log(PanicLevel, fmt.Sprint(args...))
 | 
			
		||||
	}
 | 
			
		||||
	entry.Log(PanicLevel, args...)
 | 
			
		||||
	panic(fmt.Sprint(args...))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Entry Printf family functions
 | 
			
		||||
 | 
			
		||||
func (entry *Entry) Logf(level Level, format string, args ...interface{}) {
 | 
			
		||||
	entry.Log(level, fmt.Sprintf(format, args...))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (entry *Entry) Tracef(format string, args ...interface{}) {
 | 
			
		||||
	entry.Logf(TraceLevel, format, args...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (entry *Entry) Debugf(format string, args ...interface{}) {
 | 
			
		||||
	if entry.Logger.level() >= DebugLevel {
 | 
			
		||||
		entry.Debug(fmt.Sprintf(format, args...))
 | 
			
		||||
	}
 | 
			
		||||
	entry.Logf(DebugLevel, format, args...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (entry *Entry) Infof(format string, args ...interface{}) {
 | 
			
		||||
	if entry.Logger.level() >= InfoLevel {
 | 
			
		||||
		entry.Info(fmt.Sprintf(format, args...))
 | 
			
		||||
	}
 | 
			
		||||
	entry.Logf(InfoLevel, format, args...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (entry *Entry) Printf(format string, args ...interface{}) {
 | 
			
		||||
@@ -191,9 +318,7 @@ func (entry *Entry) Printf(format string, args ...interface{}) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (entry *Entry) Warnf(format string, args ...interface{}) {
 | 
			
		||||
	if entry.Logger.level() >= WarnLevel {
 | 
			
		||||
		entry.Warn(fmt.Sprintf(format, args...))
 | 
			
		||||
	}
 | 
			
		||||
	entry.Logf(WarnLevel, format, args...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (entry *Entry) Warningf(format string, args ...interface{}) {
 | 
			
		||||
@@ -201,36 +326,36 @@ func (entry *Entry) Warningf(format string, args ...interface{}) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (entry *Entry) Errorf(format string, args ...interface{}) {
 | 
			
		||||
	if entry.Logger.level() >= ErrorLevel {
 | 
			
		||||
		entry.Error(fmt.Sprintf(format, args...))
 | 
			
		||||
	}
 | 
			
		||||
	entry.Logf(ErrorLevel, format, args...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (entry *Entry) Fatalf(format string, args ...interface{}) {
 | 
			
		||||
	if entry.Logger.level() >= FatalLevel {
 | 
			
		||||
		entry.Fatal(fmt.Sprintf(format, args...))
 | 
			
		||||
	}
 | 
			
		||||
	Exit(1)
 | 
			
		||||
	entry.Logf(FatalLevel, format, args...)
 | 
			
		||||
	entry.Logger.Exit(1)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (entry *Entry) Panicf(format string, args ...interface{}) {
 | 
			
		||||
	if entry.Logger.level() >= PanicLevel {
 | 
			
		||||
		entry.Panic(fmt.Sprintf(format, args...))
 | 
			
		||||
	}
 | 
			
		||||
	entry.Logf(PanicLevel, format, args...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Entry Println family functions
 | 
			
		||||
 | 
			
		||||
func (entry *Entry) Debugln(args ...interface{}) {
 | 
			
		||||
	if entry.Logger.level() >= DebugLevel {
 | 
			
		||||
		entry.Debug(entry.sprintlnn(args...))
 | 
			
		||||
func (entry *Entry) Logln(level Level, args ...interface{}) {
 | 
			
		||||
	if entry.Logger.IsLevelEnabled(level) {
 | 
			
		||||
		entry.Log(level, entry.sprintlnn(args...))
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (entry *Entry) Traceln(args ...interface{}) {
 | 
			
		||||
	entry.Logln(TraceLevel, args...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (entry *Entry) Debugln(args ...interface{}) {
 | 
			
		||||
	entry.Logln(DebugLevel, args...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (entry *Entry) Infoln(args ...interface{}) {
 | 
			
		||||
	if entry.Logger.level() >= InfoLevel {
 | 
			
		||||
		entry.Info(entry.sprintlnn(args...))
 | 
			
		||||
	}
 | 
			
		||||
	entry.Logln(InfoLevel, args...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (entry *Entry) Println(args ...interface{}) {
 | 
			
		||||
@@ -238,9 +363,7 @@ func (entry *Entry) Println(args ...interface{}) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (entry *Entry) Warnln(args ...interface{}) {
 | 
			
		||||
	if entry.Logger.level() >= WarnLevel {
 | 
			
		||||
		entry.Warn(entry.sprintlnn(args...))
 | 
			
		||||
	}
 | 
			
		||||
	entry.Logln(WarnLevel, args...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (entry *Entry) Warningln(args ...interface{}) {
 | 
			
		||||
@@ -248,22 +371,16 @@ func (entry *Entry) Warningln(args ...interface{}) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (entry *Entry) Errorln(args ...interface{}) {
 | 
			
		||||
	if entry.Logger.level() >= ErrorLevel {
 | 
			
		||||
		entry.Error(entry.sprintlnn(args...))
 | 
			
		||||
	}
 | 
			
		||||
	entry.Logln(ErrorLevel, args...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (entry *Entry) Fatalln(args ...interface{}) {
 | 
			
		||||
	if entry.Logger.level() >= FatalLevel {
 | 
			
		||||
		entry.Fatal(entry.sprintlnn(args...))
 | 
			
		||||
	}
 | 
			
		||||
	Exit(1)
 | 
			
		||||
	entry.Logln(FatalLevel, args...)
 | 
			
		||||
	entry.Logger.Exit(1)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (entry *Entry) Panicln(args ...interface{}) {
 | 
			
		||||
	if entry.Logger.level() >= PanicLevel {
 | 
			
		||||
		entry.Panic(entry.sprintlnn(args...))
 | 
			
		||||
	}
 | 
			
		||||
	entry.Logln(PanicLevel, args...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Sprintlnn => Sprint no newline. This is to get the behavior of how
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										60
									
								
								vendor/github.com/sirupsen/logrus/exported.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										60
									
								
								vendor/github.com/sirupsen/logrus/exported.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -2,6 +2,7 @@ package logrus
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"io"
 | 
			
		||||
	"time"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
@@ -15,37 +16,38 @@ func StandardLogger() *Logger {
 | 
			
		||||
 | 
			
		||||
// SetOutput sets the standard logger output.
 | 
			
		||||
func SetOutput(out io.Writer) {
 | 
			
		||||
	std.mu.Lock()
 | 
			
		||||
	defer std.mu.Unlock()
 | 
			
		||||
	std.Out = out
 | 
			
		||||
	std.SetOutput(out)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SetFormatter sets the standard logger formatter.
 | 
			
		||||
func SetFormatter(formatter Formatter) {
 | 
			
		||||
	std.mu.Lock()
 | 
			
		||||
	defer std.mu.Unlock()
 | 
			
		||||
	std.Formatter = formatter
 | 
			
		||||
	std.SetFormatter(formatter)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SetReportCaller sets whether the standard logger will include the calling
 | 
			
		||||
// method as a field.
 | 
			
		||||
func SetReportCaller(include bool) {
 | 
			
		||||
	std.SetReportCaller(include)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SetLevel sets the standard logger level.
 | 
			
		||||
func SetLevel(level Level) {
 | 
			
		||||
	std.mu.Lock()
 | 
			
		||||
	defer std.mu.Unlock()
 | 
			
		||||
	std.SetLevel(level)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetLevel returns the standard logger level.
 | 
			
		||||
func GetLevel() Level {
 | 
			
		||||
	std.mu.Lock()
 | 
			
		||||
	defer std.mu.Unlock()
 | 
			
		||||
	return std.level()
 | 
			
		||||
	return std.GetLevel()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// IsLevelEnabled checks if the log level of the standard logger is greater than the level param
 | 
			
		||||
func IsLevelEnabled(level Level) bool {
 | 
			
		||||
	return std.IsLevelEnabled(level)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// AddHook adds a hook to the standard logger hooks.
 | 
			
		||||
func AddHook(hook Hook) {
 | 
			
		||||
	std.mu.Lock()
 | 
			
		||||
	defer std.mu.Unlock()
 | 
			
		||||
	std.Hooks.Add(hook)
 | 
			
		||||
	std.AddHook(hook)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// WithError creates an entry from the standard logger and adds an error to it, using the value defined in ErrorKey as key.
 | 
			
		||||
@@ -72,6 +74,20 @@ func WithFields(fields Fields) *Entry {
 | 
			
		||||
	return std.WithFields(fields)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// WithTime creats an entry from the standard logger and overrides the time of
 | 
			
		||||
// logs generated with it.
 | 
			
		||||
//
 | 
			
		||||
// Note that it doesn't log until you call Debug, Print, Info, Warn, Fatal
 | 
			
		||||
// or Panic on the Entry it returns.
 | 
			
		||||
func WithTime(t time.Time) *Entry {
 | 
			
		||||
	return std.WithTime(t)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Trace logs a message at level Trace on the standard logger.
 | 
			
		||||
func Trace(args ...interface{}) {
 | 
			
		||||
	std.Trace(args...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Debug logs a message at level Debug on the standard logger.
 | 
			
		||||
func Debug(args ...interface{}) {
 | 
			
		||||
	std.Debug(args...)
 | 
			
		||||
@@ -107,11 +123,16 @@ func Panic(args ...interface{}) {
 | 
			
		||||
	std.Panic(args...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Fatal logs a message at level Fatal on the standard logger.
 | 
			
		||||
// Fatal logs a message at level Fatal on the standard logger then the process will exit with status set to 1.
 | 
			
		||||
func Fatal(args ...interface{}) {
 | 
			
		||||
	std.Fatal(args...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Tracef logs a message at level Trace on the standard logger.
 | 
			
		||||
func Tracef(format string, args ...interface{}) {
 | 
			
		||||
	std.Tracef(format, args...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Debugf logs a message at level Debug on the standard logger.
 | 
			
		||||
func Debugf(format string, args ...interface{}) {
 | 
			
		||||
	std.Debugf(format, args...)
 | 
			
		||||
@@ -147,11 +168,16 @@ func Panicf(format string, args ...interface{}) {
 | 
			
		||||
	std.Panicf(format, args...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Fatalf logs a message at level Fatal on the standard logger.
 | 
			
		||||
// Fatalf logs a message at level Fatal on the standard logger then the process will exit with status set to 1.
 | 
			
		||||
func Fatalf(format string, args ...interface{}) {
 | 
			
		||||
	std.Fatalf(format, args...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Traceln logs a message at level Trace on the standard logger.
 | 
			
		||||
func Traceln(args ...interface{}) {
 | 
			
		||||
	std.Traceln(args...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Debugln logs a message at level Debug on the standard logger.
 | 
			
		||||
func Debugln(args ...interface{}) {
 | 
			
		||||
	std.Debugln(args...)
 | 
			
		||||
@@ -187,7 +213,7 @@ func Panicln(args ...interface{}) {
 | 
			
		||||
	std.Panicln(args...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Fatalln logs a message at level Fatal on the standard logger.
 | 
			
		||||
// Fatalln logs a message at level Fatal on the standard logger then the process will exit with status set to 1.
 | 
			
		||||
func Fatalln(args ...interface{}) {
 | 
			
		||||
	std.Fatalln(args...)
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										51
									
								
								vendor/github.com/sirupsen/logrus/formatter.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										51
									
								
								vendor/github.com/sirupsen/logrus/formatter.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -2,7 +2,16 @@ package logrus
 | 
			
		||||
 | 
			
		||||
import "time"
 | 
			
		||||
 | 
			
		||||
const defaultTimestampFormat = time.RFC3339
 | 
			
		||||
// Default key names for the default fields
 | 
			
		||||
const (
 | 
			
		||||
	defaultTimestampFormat = time.RFC3339
 | 
			
		||||
	FieldKeyMsg            = "msg"
 | 
			
		||||
	FieldKeyLevel          = "level"
 | 
			
		||||
	FieldKeyTime           = "time"
 | 
			
		||||
	FieldKeyLogrusError    = "logrus_error"
 | 
			
		||||
	FieldKeyFunc           = "func"
 | 
			
		||||
	FieldKeyFile           = "file"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// The Formatter interface is used to implement a custom Formatter. It takes an
 | 
			
		||||
// `Entry`. It exposes all the fields, including the default ones:
 | 
			
		||||
@@ -18,7 +27,7 @@ type Formatter interface {
 | 
			
		||||
	Format(*Entry) ([]byte, error)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// This is to not silently overwrite `time`, `msg` and `level` fields when
 | 
			
		||||
// This is to not silently overwrite `time`, `msg`, `func` and `level` fields when
 | 
			
		||||
// dumping it. If this code wasn't there doing:
 | 
			
		||||
//
 | 
			
		||||
//  logrus.WithField("level", 1).Info("hello")
 | 
			
		||||
@@ -30,16 +39,40 @@ type Formatter interface {
 | 
			
		||||
//
 | 
			
		||||
// It's not exported because it's still using Data in an opinionated way. It's to
 | 
			
		||||
// avoid code duplication between the two default formatters.
 | 
			
		||||
func prefixFieldClashes(data Fields) {
 | 
			
		||||
	if t, ok := data["time"]; ok {
 | 
			
		||||
		data["fields.time"] = t
 | 
			
		||||
func prefixFieldClashes(data Fields, fieldMap FieldMap, reportCaller bool) {
 | 
			
		||||
	timeKey := fieldMap.resolve(FieldKeyTime)
 | 
			
		||||
	if t, ok := data[timeKey]; ok {
 | 
			
		||||
		data["fields."+timeKey] = t
 | 
			
		||||
		delete(data, timeKey)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if m, ok := data["msg"]; ok {
 | 
			
		||||
		data["fields.msg"] = m
 | 
			
		||||
	msgKey := fieldMap.resolve(FieldKeyMsg)
 | 
			
		||||
	if m, ok := data[msgKey]; ok {
 | 
			
		||||
		data["fields."+msgKey] = m
 | 
			
		||||
		delete(data, msgKey)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if l, ok := data["level"]; ok {
 | 
			
		||||
		data["fields.level"] = l
 | 
			
		||||
	levelKey := fieldMap.resolve(FieldKeyLevel)
 | 
			
		||||
	if l, ok := data[levelKey]; ok {
 | 
			
		||||
		data["fields."+levelKey] = l
 | 
			
		||||
		delete(data, levelKey)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	logrusErrKey := fieldMap.resolve(FieldKeyLogrusError)
 | 
			
		||||
	if l, ok := data[logrusErrKey]; ok {
 | 
			
		||||
		data["fields."+logrusErrKey] = l
 | 
			
		||||
		delete(data, logrusErrKey)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// If reportCaller is not set, 'func' will not conflict.
 | 
			
		||||
	if reportCaller {
 | 
			
		||||
		funcKey := fieldMap.resolve(FieldKeyFunc)
 | 
			
		||||
		if l, ok := data[funcKey]; ok {
 | 
			
		||||
			data["fields."+funcKey] = l
 | 
			
		||||
		}
 | 
			
		||||
		fileKey := fieldMap.resolve(FieldKeyFile)
 | 
			
		||||
		if l, ok := data[fileKey]; ok {
 | 
			
		||||
			data["fields."+fileKey] = l
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										54
									
								
								vendor/github.com/sirupsen/logrus/json_formatter.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										54
									
								
								vendor/github.com/sirupsen/logrus/json_formatter.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,6 +1,7 @@
 | 
			
		||||
package logrus
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"bytes"
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"fmt"
 | 
			
		||||
)
 | 
			
		||||
@@ -10,13 +11,6 @@ type fieldKey string
 | 
			
		||||
// FieldMap allows customization of the key names for default fields.
 | 
			
		||||
type FieldMap map[fieldKey]string
 | 
			
		||||
 | 
			
		||||
// Default key names for the default fields
 | 
			
		||||
const (
 | 
			
		||||
	FieldKeyMsg   = "msg"
 | 
			
		||||
	FieldKeyLevel = "level"
 | 
			
		||||
	FieldKeyTime  = "time"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func (f FieldMap) resolve(key fieldKey) string {
 | 
			
		||||
	if k, ok := f[key]; ok {
 | 
			
		||||
		return k
 | 
			
		||||
@@ -33,21 +27,28 @@ type JSONFormatter struct {
 | 
			
		||||
	// DisableTimestamp allows disabling automatic timestamps in output
 | 
			
		||||
	DisableTimestamp bool
 | 
			
		||||
 | 
			
		||||
	// DataKey allows users to put all the log entry parameters into a nested dictionary at a given key.
 | 
			
		||||
	DataKey string
 | 
			
		||||
 | 
			
		||||
	// FieldMap allows users to customize the names of keys for default fields.
 | 
			
		||||
	// As an example:
 | 
			
		||||
	// formatter := &JSONFormatter{
 | 
			
		||||
	//   	FieldMap: FieldMap{
 | 
			
		||||
	// 		 FieldKeyTime: "@timestamp",
 | 
			
		||||
	// 		 FieldKeyTime:  "@timestamp",
 | 
			
		||||
	// 		 FieldKeyLevel: "@level",
 | 
			
		||||
	// 		 FieldKeyMsg: "@message",
 | 
			
		||||
	// 		 FieldKeyMsg:   "@message",
 | 
			
		||||
	// 		 FieldKeyFunc:  "@caller",
 | 
			
		||||
	//    },
 | 
			
		||||
	// }
 | 
			
		||||
	FieldMap FieldMap
 | 
			
		||||
 | 
			
		||||
	// PrettyPrint will indent all json logs
 | 
			
		||||
	PrettyPrint bool
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Format renders a single log entry
 | 
			
		||||
func (f *JSONFormatter) Format(entry *Entry) ([]byte, error) {
 | 
			
		||||
	data := make(Fields, len(entry.Data)+3)
 | 
			
		||||
	data := make(Fields, len(entry.Data)+4)
 | 
			
		||||
	for k, v := range entry.Data {
 | 
			
		||||
		switch v := v.(type) {
 | 
			
		||||
		case error:
 | 
			
		||||
@@ -58,22 +59,47 @@ func (f *JSONFormatter) Format(entry *Entry) ([]byte, error) {
 | 
			
		||||
			data[k] = v
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	prefixFieldClashes(data)
 | 
			
		||||
 | 
			
		||||
	if f.DataKey != "" {
 | 
			
		||||
		newData := make(Fields, 4)
 | 
			
		||||
		newData[f.DataKey] = data
 | 
			
		||||
		data = newData
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	prefixFieldClashes(data, f.FieldMap, entry.HasCaller())
 | 
			
		||||
 | 
			
		||||
	timestampFormat := f.TimestampFormat
 | 
			
		||||
	if timestampFormat == "" {
 | 
			
		||||
		timestampFormat = defaultTimestampFormat
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if entry.err != "" {
 | 
			
		||||
		data[f.FieldMap.resolve(FieldKeyLogrusError)] = entry.err
 | 
			
		||||
	}
 | 
			
		||||
	if !f.DisableTimestamp {
 | 
			
		||||
		data[f.FieldMap.resolve(FieldKeyTime)] = entry.Time.Format(timestampFormat)
 | 
			
		||||
	}
 | 
			
		||||
	data[f.FieldMap.resolve(FieldKeyMsg)] = entry.Message
 | 
			
		||||
	data[f.FieldMap.resolve(FieldKeyLevel)] = entry.Level.String()
 | 
			
		||||
	if entry.HasCaller() {
 | 
			
		||||
		data[f.FieldMap.resolve(FieldKeyFunc)] = entry.Caller.Function
 | 
			
		||||
		data[f.FieldMap.resolve(FieldKeyFile)] = fmt.Sprintf("%s:%d", entry.Caller.File, entry.Caller.Line)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	serialized, err := json.Marshal(data)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
	var b *bytes.Buffer
 | 
			
		||||
	if entry.Buffer != nil {
 | 
			
		||||
		b = entry.Buffer
 | 
			
		||||
	} else {
 | 
			
		||||
		b = &bytes.Buffer{}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	encoder := json.NewEncoder(b)
 | 
			
		||||
	if f.PrettyPrint {
 | 
			
		||||
		encoder.SetIndent("", "  ")
 | 
			
		||||
	}
 | 
			
		||||
	if err := encoder.Encode(data); err != nil {
 | 
			
		||||
		return nil, fmt.Errorf("Failed to marshal fields to JSON, %v", err)
 | 
			
		||||
	}
 | 
			
		||||
	return append(serialized, '\n'), nil
 | 
			
		||||
 | 
			
		||||
	return b.Bytes(), nil
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										236
									
								
								vendor/github.com/sirupsen/logrus/logger.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										236
									
								
								vendor/github.com/sirupsen/logrus/logger.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -5,12 +5,13 @@ import (
 | 
			
		||||
	"os"
 | 
			
		||||
	"sync"
 | 
			
		||||
	"sync/atomic"
 | 
			
		||||
	"time"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type Logger struct {
 | 
			
		||||
	// The logs are `io.Copy`'d to this in a mutex. It's common to set this to a
 | 
			
		||||
	// file, or leave it default which is `os.Stderr`. You can also set this to
 | 
			
		||||
	// something more adventorous, such as logging to Kafka.
 | 
			
		||||
	// something more adventurous, such as logging to Kafka.
 | 
			
		||||
	Out io.Writer
 | 
			
		||||
	// Hooks for the logger instance. These allow firing events based on logging
 | 
			
		||||
	// levels and log entries. For example, to send errors to an error tracking
 | 
			
		||||
@@ -23,6 +24,10 @@ type Logger struct {
 | 
			
		||||
	// own that implements the `Formatter` interface, see the `README` or included
 | 
			
		||||
	// formatters for examples.
 | 
			
		||||
	Formatter Formatter
 | 
			
		||||
 | 
			
		||||
	// Flag for whether to log caller info (off by default)
 | 
			
		||||
	ReportCaller bool
 | 
			
		||||
 | 
			
		||||
	// The logging level the logger should log at. This is typically (and defaults
 | 
			
		||||
	// to) `logrus.Info`, which allows Info(), Warn(), Error() and Fatal() to be
 | 
			
		||||
	// logged.
 | 
			
		||||
@@ -31,8 +36,12 @@ type Logger struct {
 | 
			
		||||
	mu MutexWrap
 | 
			
		||||
	// Reusable empty entry
 | 
			
		||||
	entryPool sync.Pool
 | 
			
		||||
	// Function to exit the application, defaults to `os.Exit()`
 | 
			
		||||
	ExitFunc exitFunc
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type exitFunc func(int)
 | 
			
		||||
 | 
			
		||||
type MutexWrap struct {
 | 
			
		||||
	lock     sync.Mutex
 | 
			
		||||
	disabled bool
 | 
			
		||||
@@ -68,10 +77,12 @@ func (mw *MutexWrap) Disable() {
 | 
			
		||||
// It's recommended to make this a global instance called `log`.
 | 
			
		||||
func New() *Logger {
 | 
			
		||||
	return &Logger{
 | 
			
		||||
		Out:       os.Stderr,
 | 
			
		||||
		Formatter: new(TextFormatter),
 | 
			
		||||
		Hooks:     make(LevelHooks),
 | 
			
		||||
		Level:     InfoLevel,
 | 
			
		||||
		Out:          os.Stderr,
 | 
			
		||||
		Formatter:    new(TextFormatter),
 | 
			
		||||
		Hooks:        make(LevelHooks),
 | 
			
		||||
		Level:        InfoLevel,
 | 
			
		||||
		ExitFunc:     os.Exit,
 | 
			
		||||
		ReportCaller: false,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -84,11 +95,12 @@ func (logger *Logger) newEntry() *Entry {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (logger *Logger) releaseEntry(entry *Entry) {
 | 
			
		||||
	entry.Data = map[string]interface{}{}
 | 
			
		||||
	logger.entryPool.Put(entry)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Adds a field to the log entry, note that it doesn't log until you call
 | 
			
		||||
// Debug, Print, Info, Warn, Fatal or Panic. It only creates a log entry.
 | 
			
		||||
// Debug, Print, Info, Warn, Error, Fatal or Panic. It only creates a log entry.
 | 
			
		||||
// If you want multiple fields, use `WithFields`.
 | 
			
		||||
func (logger *Logger) WithField(key string, value interface{}) *Entry {
 | 
			
		||||
	entry := logger.newEntry()
 | 
			
		||||
@@ -112,20 +124,31 @@ func (logger *Logger) WithError(err error) *Entry {
 | 
			
		||||
	return entry.WithError(err)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (logger *Logger) Debugf(format string, args ...interface{}) {
 | 
			
		||||
	if logger.level() >= DebugLevel {
 | 
			
		||||
// Overrides the time of the log entry.
 | 
			
		||||
func (logger *Logger) WithTime(t time.Time) *Entry {
 | 
			
		||||
	entry := logger.newEntry()
 | 
			
		||||
	defer logger.releaseEntry(entry)
 | 
			
		||||
	return entry.WithTime(t)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (logger *Logger) Logf(level Level, format string, args ...interface{}) {
 | 
			
		||||
	if logger.IsLevelEnabled(level) {
 | 
			
		||||
		entry := logger.newEntry()
 | 
			
		||||
		entry.Debugf(format, args...)
 | 
			
		||||
		entry.Logf(level, format, args...)
 | 
			
		||||
		logger.releaseEntry(entry)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (logger *Logger) Tracef(format string, args ...interface{}) {
 | 
			
		||||
	logger.Logf(TraceLevel, format, args...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (logger *Logger) Debugf(format string, args ...interface{}) {
 | 
			
		||||
	logger.Logf(DebugLevel, format, args...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (logger *Logger) Infof(format string, args ...interface{}) {
 | 
			
		||||
	if logger.level() >= InfoLevel {
 | 
			
		||||
		entry := logger.newEntry()
 | 
			
		||||
		entry.Infof(format, args...)
 | 
			
		||||
		logger.releaseEntry(entry)
 | 
			
		||||
	}
 | 
			
		||||
	logger.Logf(InfoLevel, format, args...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (logger *Logger) Printf(format string, args ...interface{}) {
 | 
			
		||||
@@ -135,60 +158,44 @@ func (logger *Logger) Printf(format string, args ...interface{}) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (logger *Logger) Warnf(format string, args ...interface{}) {
 | 
			
		||||
	if logger.level() >= WarnLevel {
 | 
			
		||||
		entry := logger.newEntry()
 | 
			
		||||
		entry.Warnf(format, args...)
 | 
			
		||||
		logger.releaseEntry(entry)
 | 
			
		||||
	}
 | 
			
		||||
	logger.Logf(WarnLevel, format, args...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (logger *Logger) Warningf(format string, args ...interface{}) {
 | 
			
		||||
	if logger.level() >= WarnLevel {
 | 
			
		||||
		entry := logger.newEntry()
 | 
			
		||||
		entry.Warnf(format, args...)
 | 
			
		||||
		logger.releaseEntry(entry)
 | 
			
		||||
	}
 | 
			
		||||
	logger.Warnf(format, args...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (logger *Logger) Errorf(format string, args ...interface{}) {
 | 
			
		||||
	if logger.level() >= ErrorLevel {
 | 
			
		||||
		entry := logger.newEntry()
 | 
			
		||||
		entry.Errorf(format, args...)
 | 
			
		||||
		logger.releaseEntry(entry)
 | 
			
		||||
	}
 | 
			
		||||
	logger.Logf(ErrorLevel, format, args...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (logger *Logger) Fatalf(format string, args ...interface{}) {
 | 
			
		||||
	if logger.level() >= FatalLevel {
 | 
			
		||||
		entry := logger.newEntry()
 | 
			
		||||
		entry.Fatalf(format, args...)
 | 
			
		||||
		logger.releaseEntry(entry)
 | 
			
		||||
	}
 | 
			
		||||
	Exit(1)
 | 
			
		||||
	logger.Logf(FatalLevel, format, args...)
 | 
			
		||||
	logger.Exit(1)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (logger *Logger) Panicf(format string, args ...interface{}) {
 | 
			
		||||
	if logger.level() >= PanicLevel {
 | 
			
		||||
	logger.Logf(PanicLevel, format, args...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (logger *Logger) Log(level Level, args ...interface{}) {
 | 
			
		||||
	if logger.IsLevelEnabled(level) {
 | 
			
		||||
		entry := logger.newEntry()
 | 
			
		||||
		entry.Panicf(format, args...)
 | 
			
		||||
		entry.Log(level, args...)
 | 
			
		||||
		logger.releaseEntry(entry)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (logger *Logger) Trace(args ...interface{}) {
 | 
			
		||||
	logger.Log(TraceLevel, args...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (logger *Logger) Debug(args ...interface{}) {
 | 
			
		||||
	if logger.level() >= DebugLevel {
 | 
			
		||||
		entry := logger.newEntry()
 | 
			
		||||
		entry.Debug(args...)
 | 
			
		||||
		logger.releaseEntry(entry)
 | 
			
		||||
	}
 | 
			
		||||
	logger.Log(DebugLevel, args...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (logger *Logger) Info(args ...interface{}) {
 | 
			
		||||
	if logger.level() >= InfoLevel {
 | 
			
		||||
		entry := logger.newEntry()
 | 
			
		||||
		entry.Info(args...)
 | 
			
		||||
		logger.releaseEntry(entry)
 | 
			
		||||
	}
 | 
			
		||||
	logger.Log(InfoLevel, args...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (logger *Logger) Print(args ...interface{}) {
 | 
			
		||||
@@ -198,60 +205,44 @@ func (logger *Logger) Print(args ...interface{}) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (logger *Logger) Warn(args ...interface{}) {
 | 
			
		||||
	if logger.level() >= WarnLevel {
 | 
			
		||||
		entry := logger.newEntry()
 | 
			
		||||
		entry.Warn(args...)
 | 
			
		||||
		logger.releaseEntry(entry)
 | 
			
		||||
	}
 | 
			
		||||
	logger.Log(WarnLevel, args...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (logger *Logger) Warning(args ...interface{}) {
 | 
			
		||||
	if logger.level() >= WarnLevel {
 | 
			
		||||
		entry := logger.newEntry()
 | 
			
		||||
		entry.Warn(args...)
 | 
			
		||||
		logger.releaseEntry(entry)
 | 
			
		||||
	}
 | 
			
		||||
	logger.Warn(args...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (logger *Logger) Error(args ...interface{}) {
 | 
			
		||||
	if logger.level() >= ErrorLevel {
 | 
			
		||||
		entry := logger.newEntry()
 | 
			
		||||
		entry.Error(args...)
 | 
			
		||||
		logger.releaseEntry(entry)
 | 
			
		||||
	}
 | 
			
		||||
	logger.Log(ErrorLevel, args...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (logger *Logger) Fatal(args ...interface{}) {
 | 
			
		||||
	if logger.level() >= FatalLevel {
 | 
			
		||||
		entry := logger.newEntry()
 | 
			
		||||
		entry.Fatal(args...)
 | 
			
		||||
		logger.releaseEntry(entry)
 | 
			
		||||
	}
 | 
			
		||||
	Exit(1)
 | 
			
		||||
	logger.Log(FatalLevel, args...)
 | 
			
		||||
	logger.Exit(1)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (logger *Logger) Panic(args ...interface{}) {
 | 
			
		||||
	if logger.level() >= PanicLevel {
 | 
			
		||||
	logger.Log(PanicLevel, args...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (logger *Logger) Logln(level Level, args ...interface{}) {
 | 
			
		||||
	if logger.IsLevelEnabled(level) {
 | 
			
		||||
		entry := logger.newEntry()
 | 
			
		||||
		entry.Panic(args...)
 | 
			
		||||
		entry.Logln(level, args...)
 | 
			
		||||
		logger.releaseEntry(entry)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (logger *Logger) Traceln(args ...interface{}) {
 | 
			
		||||
	logger.Logln(TraceLevel, args...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (logger *Logger) Debugln(args ...interface{}) {
 | 
			
		||||
	if logger.level() >= DebugLevel {
 | 
			
		||||
		entry := logger.newEntry()
 | 
			
		||||
		entry.Debugln(args...)
 | 
			
		||||
		logger.releaseEntry(entry)
 | 
			
		||||
	}
 | 
			
		||||
	logger.Logln(DebugLevel, args...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (logger *Logger) Infoln(args ...interface{}) {
 | 
			
		||||
	if logger.level() >= InfoLevel {
 | 
			
		||||
		entry := logger.newEntry()
 | 
			
		||||
		entry.Infoln(args...)
 | 
			
		||||
		logger.releaseEntry(entry)
 | 
			
		||||
	}
 | 
			
		||||
	logger.Logln(InfoLevel, args...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (logger *Logger) Println(args ...interface{}) {
 | 
			
		||||
@@ -261,44 +252,32 @@ func (logger *Logger) Println(args ...interface{}) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (logger *Logger) Warnln(args ...interface{}) {
 | 
			
		||||
	if logger.level() >= WarnLevel {
 | 
			
		||||
		entry := logger.newEntry()
 | 
			
		||||
		entry.Warnln(args...)
 | 
			
		||||
		logger.releaseEntry(entry)
 | 
			
		||||
	}
 | 
			
		||||
	logger.Logln(WarnLevel, args...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (logger *Logger) Warningln(args ...interface{}) {
 | 
			
		||||
	if logger.level() >= WarnLevel {
 | 
			
		||||
		entry := logger.newEntry()
 | 
			
		||||
		entry.Warnln(args...)
 | 
			
		||||
		logger.releaseEntry(entry)
 | 
			
		||||
	}
 | 
			
		||||
	logger.Warn(args...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (logger *Logger) Errorln(args ...interface{}) {
 | 
			
		||||
	if logger.level() >= ErrorLevel {
 | 
			
		||||
		entry := logger.newEntry()
 | 
			
		||||
		entry.Errorln(args...)
 | 
			
		||||
		logger.releaseEntry(entry)
 | 
			
		||||
	}
 | 
			
		||||
	logger.Logln(ErrorLevel, args...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (logger *Logger) Fatalln(args ...interface{}) {
 | 
			
		||||
	if logger.level() >= FatalLevel {
 | 
			
		||||
		entry := logger.newEntry()
 | 
			
		||||
		entry.Fatalln(args...)
 | 
			
		||||
		logger.releaseEntry(entry)
 | 
			
		||||
	}
 | 
			
		||||
	Exit(1)
 | 
			
		||||
	logger.Logln(FatalLevel, args...)
 | 
			
		||||
	logger.Exit(1)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (logger *Logger) Panicln(args ...interface{}) {
 | 
			
		||||
	if logger.level() >= PanicLevel {
 | 
			
		||||
		entry := logger.newEntry()
 | 
			
		||||
		entry.Panicln(args...)
 | 
			
		||||
		logger.releaseEntry(entry)
 | 
			
		||||
	logger.Logln(PanicLevel, args...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (logger *Logger) Exit(code int) {
 | 
			
		||||
	runHandlers()
 | 
			
		||||
	if logger.ExitFunc == nil {
 | 
			
		||||
		logger.ExitFunc = os.Exit
 | 
			
		||||
	}
 | 
			
		||||
	logger.ExitFunc(code)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//When file is opened with appending mode, it's safe to
 | 
			
		||||
@@ -312,6 +291,53 @@ func (logger *Logger) level() Level {
 | 
			
		||||
	return Level(atomic.LoadUint32((*uint32)(&logger.Level)))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SetLevel sets the logger level.
 | 
			
		||||
func (logger *Logger) SetLevel(level Level) {
 | 
			
		||||
	atomic.StoreUint32((*uint32)(&logger.Level), uint32(level))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetLevel returns the logger level.
 | 
			
		||||
func (logger *Logger) GetLevel() Level {
 | 
			
		||||
	return logger.level()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// AddHook adds a hook to the logger hooks.
 | 
			
		||||
func (logger *Logger) AddHook(hook Hook) {
 | 
			
		||||
	logger.mu.Lock()
 | 
			
		||||
	defer logger.mu.Unlock()
 | 
			
		||||
	logger.Hooks.Add(hook)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// IsLevelEnabled checks if the log level of the logger is greater than the level param
 | 
			
		||||
func (logger *Logger) IsLevelEnabled(level Level) bool {
 | 
			
		||||
	return logger.level() >= level
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SetFormatter sets the logger formatter.
 | 
			
		||||
func (logger *Logger) SetFormatter(formatter Formatter) {
 | 
			
		||||
	logger.mu.Lock()
 | 
			
		||||
	defer logger.mu.Unlock()
 | 
			
		||||
	logger.Formatter = formatter
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SetOutput sets the logger output.
 | 
			
		||||
func (logger *Logger) SetOutput(output io.Writer) {
 | 
			
		||||
	logger.mu.Lock()
 | 
			
		||||
	defer logger.mu.Unlock()
 | 
			
		||||
	logger.Out = output
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (logger *Logger) SetReportCaller(reportCaller bool) {
 | 
			
		||||
	logger.mu.Lock()
 | 
			
		||||
	defer logger.mu.Unlock()
 | 
			
		||||
	logger.ReportCaller = reportCaller
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ReplaceHooks replaces the logger hooks and returns the old ones
 | 
			
		||||
func (logger *Logger) ReplaceHooks(hooks LevelHooks) LevelHooks {
 | 
			
		||||
	logger.mu.Lock()
 | 
			
		||||
	oldHooks := logger.Hooks
 | 
			
		||||
	logger.Hooks = hooks
 | 
			
		||||
	logger.mu.Unlock()
 | 
			
		||||
	return oldHooks
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										75
									
								
								vendor/github.com/sirupsen/logrus/logrus.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										75
									
								
								vendor/github.com/sirupsen/logrus/logrus.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -14,22 +14,11 @@ type Level uint32
 | 
			
		||||
 | 
			
		||||
// Convert the Level to a string. E.g. PanicLevel becomes "panic".
 | 
			
		||||
func (level Level) String() string {
 | 
			
		||||
	switch level {
 | 
			
		||||
	case DebugLevel:
 | 
			
		||||
		return "debug"
 | 
			
		||||
	case InfoLevel:
 | 
			
		||||
		return "info"
 | 
			
		||||
	case WarnLevel:
 | 
			
		||||
		return "warning"
 | 
			
		||||
	case ErrorLevel:
 | 
			
		||||
		return "error"
 | 
			
		||||
	case FatalLevel:
 | 
			
		||||
		return "fatal"
 | 
			
		||||
	case PanicLevel:
 | 
			
		||||
		return "panic"
 | 
			
		||||
	if b, err := level.MarshalText(); err == nil {
 | 
			
		||||
		return string(b)
 | 
			
		||||
	} else {
 | 
			
		||||
		return "unknown"
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return "unknown"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ParseLevel takes a string level and returns the Logrus log level constant.
 | 
			
		||||
@@ -47,12 +36,47 @@ func ParseLevel(lvl string) (Level, error) {
 | 
			
		||||
		return InfoLevel, nil
 | 
			
		||||
	case "debug":
 | 
			
		||||
		return DebugLevel, nil
 | 
			
		||||
	case "trace":
 | 
			
		||||
		return TraceLevel, nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var l Level
 | 
			
		||||
	return l, fmt.Errorf("not a valid logrus Level: %q", lvl)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// UnmarshalText implements encoding.TextUnmarshaler.
 | 
			
		||||
func (level *Level) UnmarshalText(text []byte) error {
 | 
			
		||||
	l, err := ParseLevel(string(text))
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	*level = Level(l)
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (level Level) MarshalText() ([]byte, error) {
 | 
			
		||||
	switch level {
 | 
			
		||||
	case TraceLevel:
 | 
			
		||||
		return []byte("trace"), nil
 | 
			
		||||
	case DebugLevel:
 | 
			
		||||
		return []byte("debug"), nil
 | 
			
		||||
	case InfoLevel:
 | 
			
		||||
		return []byte("info"), nil
 | 
			
		||||
	case WarnLevel:
 | 
			
		||||
		return []byte("warning"), nil
 | 
			
		||||
	case ErrorLevel:
 | 
			
		||||
		return []byte("error"), nil
 | 
			
		||||
	case FatalLevel:
 | 
			
		||||
		return []byte("fatal"), nil
 | 
			
		||||
	case PanicLevel:
 | 
			
		||||
		return []byte("panic"), nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return nil, fmt.Errorf("not a valid lorus level %q", level)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// A constant exposing all logging levels
 | 
			
		||||
var AllLevels = []Level{
 | 
			
		||||
	PanicLevel,
 | 
			
		||||
@@ -61,6 +85,7 @@ var AllLevels = []Level{
 | 
			
		||||
	WarnLevel,
 | 
			
		||||
	InfoLevel,
 | 
			
		||||
	DebugLevel,
 | 
			
		||||
	TraceLevel,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// These are the different logging levels. You can set the logging level to log
 | 
			
		||||
@@ -69,7 +94,7 @@ const (
 | 
			
		||||
	// PanicLevel level, highest level of severity. Logs and then calls panic with the
 | 
			
		||||
	// message passed to Debug, Info, ...
 | 
			
		||||
	PanicLevel Level = iota
 | 
			
		||||
	// FatalLevel level. Logs and then calls `os.Exit(1)`. It will exit even if the
 | 
			
		||||
	// FatalLevel level. Logs and then calls `logger.Exit(1)`. It will exit even if the
 | 
			
		||||
	// logging level is set to Panic.
 | 
			
		||||
	FatalLevel
 | 
			
		||||
	// ErrorLevel level. Logs. Used for errors that should definitely be noted.
 | 
			
		||||
@@ -82,6 +107,8 @@ const (
 | 
			
		||||
	InfoLevel
 | 
			
		||||
	// DebugLevel level. Usually only enabled when debugging. Very verbose logging.
 | 
			
		||||
	DebugLevel
 | 
			
		||||
	// TraceLevel level. Designates finer-grained informational events than the Debug.
 | 
			
		||||
	TraceLevel
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Won't compile if StdLogger can't be realized by a log.Logger
 | 
			
		||||
@@ -140,4 +167,20 @@ type FieldLogger interface {
 | 
			
		||||
	Errorln(args ...interface{})
 | 
			
		||||
	Fatalln(args ...interface{})
 | 
			
		||||
	Panicln(args ...interface{})
 | 
			
		||||
 | 
			
		||||
	// IsDebugEnabled() bool
 | 
			
		||||
	// IsInfoEnabled() bool
 | 
			
		||||
	// IsWarnEnabled() bool
 | 
			
		||||
	// IsErrorEnabled() bool
 | 
			
		||||
	// IsFatalEnabled() bool
 | 
			
		||||
	// IsPanicEnabled() bool
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Ext1FieldLogger (the first extension to FieldLogger) is superfluous, it is
 | 
			
		||||
// here for consistancy. Do not use. Use Logger or Entry instead.
 | 
			
		||||
type Ext1FieldLogger interface {
 | 
			
		||||
	FieldLogger
 | 
			
		||||
	Tracef(format string, args ...interface{})
 | 
			
		||||
	Trace(args ...interface{})
 | 
			
		||||
	Traceln(args ...interface{})
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										10
									
								
								vendor/github.com/sirupsen/logrus/terminal_bsd.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										10
									
								
								vendor/github.com/sirupsen/logrus/terminal_bsd.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,10 +0,0 @@
 | 
			
		||||
// +build darwin freebsd openbsd netbsd dragonfly
 | 
			
		||||
// +build !appengine
 | 
			
		||||
 | 
			
		||||
package logrus
 | 
			
		||||
 | 
			
		||||
import "golang.org/x/sys/unix"
 | 
			
		||||
 | 
			
		||||
const ioctlReadTermios = unix.TIOCGETA
 | 
			
		||||
 | 
			
		||||
type Termios unix.Termios
 | 
			
		||||
							
								
								
									
										9
									
								
								vendor/github.com/sirupsen/logrus/terminal_check_aix.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								vendor/github.com/sirupsen/logrus/terminal_check_aix.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,9 @@
 | 
			
		||||
// +build !appengine,!js,!windows,aix
 | 
			
		||||
 | 
			
		||||
package logrus
 | 
			
		||||
 | 
			
		||||
import "io"
 | 
			
		||||
 | 
			
		||||
func checkIfTerminal(w io.Writer) bool {
 | 
			
		||||
	return false
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										11
									
								
								vendor/github.com/sirupsen/logrus/terminal_check_appengine.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								vendor/github.com/sirupsen/logrus/terminal_check_appengine.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,11 @@
 | 
			
		||||
// +build appengine
 | 
			
		||||
 | 
			
		||||
package logrus
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"io"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func checkIfTerminal(w io.Writer) bool {
 | 
			
		||||
	return true
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										11
									
								
								vendor/github.com/sirupsen/logrus/terminal_check_js.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								vendor/github.com/sirupsen/logrus/terminal_check_js.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,11 @@
 | 
			
		||||
// +build js
 | 
			
		||||
 | 
			
		||||
package logrus
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"io"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func checkIfTerminal(w io.Writer) bool {
 | 
			
		||||
	return false
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										19
									
								
								vendor/github.com/sirupsen/logrus/terminal_check_notappengine.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								vendor/github.com/sirupsen/logrus/terminal_check_notappengine.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,19 @@
 | 
			
		||||
// +build !appengine,!js,!windows,!aix
 | 
			
		||||
 | 
			
		||||
package logrus
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"io"
 | 
			
		||||
	"os"
 | 
			
		||||
 | 
			
		||||
	"golang.org/x/crypto/ssh/terminal"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func checkIfTerminal(w io.Writer) bool {
 | 
			
		||||
	switch v := w.(type) {
 | 
			
		||||
	case *os.File:
 | 
			
		||||
		return terminal.IsTerminal(int(v.Fd()))
 | 
			
		||||
	default:
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										20
									
								
								vendor/github.com/sirupsen/logrus/terminal_check_windows.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								vendor/github.com/sirupsen/logrus/terminal_check_windows.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,20 @@
 | 
			
		||||
// +build !appengine,!js,windows
 | 
			
		||||
 | 
			
		||||
package logrus
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"io"
 | 
			
		||||
	"os"
 | 
			
		||||
	"syscall"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func checkIfTerminal(w io.Writer) bool {
 | 
			
		||||
	switch v := w.(type) {
 | 
			
		||||
	case *os.File:
 | 
			
		||||
		var mode uint32
 | 
			
		||||
		err := syscall.GetConsoleMode(syscall.Handle(v.Fd()), &mode)
 | 
			
		||||
		return err == nil
 | 
			
		||||
	default:
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										14
									
								
								vendor/github.com/sirupsen/logrus/terminal_linux.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										14
									
								
								vendor/github.com/sirupsen/logrus/terminal_linux.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,14 +0,0 @@
 | 
			
		||||
// Based on ssh/terminal:
 | 
			
		||||
// Copyright 2013 The Go Authors. All rights reserved.
 | 
			
		||||
// Use of this source code is governed by a BSD-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
// +build !appengine
 | 
			
		||||
 | 
			
		||||
package logrus
 | 
			
		||||
 | 
			
		||||
import "golang.org/x/sys/unix"
 | 
			
		||||
 | 
			
		||||
const ioctlReadTermios = unix.TCGETS
 | 
			
		||||
 | 
			
		||||
type Termios unix.Termios
 | 
			
		||||
							
								
								
									
										8
									
								
								vendor/github.com/sirupsen/logrus/terminal_notwindows.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								vendor/github.com/sirupsen/logrus/terminal_notwindows.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,8 @@
 | 
			
		||||
// +build !windows
 | 
			
		||||
 | 
			
		||||
package logrus
 | 
			
		||||
 | 
			
		||||
import "io"
 | 
			
		||||
 | 
			
		||||
func initTerminal(w io.Writer) {
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										18
									
								
								vendor/github.com/sirupsen/logrus/terminal_windows.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								vendor/github.com/sirupsen/logrus/terminal_windows.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,18 @@
 | 
			
		||||
// +build !appengine,!js,windows
 | 
			
		||||
 | 
			
		||||
package logrus
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"io"
 | 
			
		||||
	"os"
 | 
			
		||||
	"syscall"
 | 
			
		||||
 | 
			
		||||
	sequences "github.com/konsorten/go-windows-terminal-sequences"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func initTerminal(w io.Writer) {
 | 
			
		||||
	switch v := w.(type) {
 | 
			
		||||
	case *os.File:
 | 
			
		||||
		sequences.EnableVirtualTerminalProcessing(syscall.Handle(v.Fd()), true)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										160
									
								
								vendor/github.com/sirupsen/logrus/text_formatter.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										160
									
								
								vendor/github.com/sirupsen/logrus/text_formatter.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -3,14 +3,12 @@ package logrus
 | 
			
		||||
import (
 | 
			
		||||
	"bytes"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"io"
 | 
			
		||||
	"os"
 | 
			
		||||
	"runtime"
 | 
			
		||||
	"sort"
 | 
			
		||||
	"strings"
 | 
			
		||||
	"sync"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"golang.org/x/crypto/ssh/terminal"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
@@ -24,6 +22,7 @@ const (
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	baseTimestamp time.Time
 | 
			
		||||
	emptyFieldMap FieldMap
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func init() {
 | 
			
		||||
@@ -38,6 +37,9 @@ type TextFormatter struct {
 | 
			
		||||
	// Force disabling colors.
 | 
			
		||||
	DisableColors bool
 | 
			
		||||
 | 
			
		||||
	// Override coloring based on CLICOLOR and CLICOLOR_FORCE. - https://bixense.com/clicolors/
 | 
			
		||||
	EnvironmentOverrideColors bool
 | 
			
		||||
 | 
			
		||||
	// Disable timestamp logging. useful when output is redirected to logging
 | 
			
		||||
	// system that already adds timestamps.
 | 
			
		||||
	DisableTimestamp bool
 | 
			
		||||
@@ -54,69 +56,135 @@ type TextFormatter struct {
 | 
			
		||||
	// be desired.
 | 
			
		||||
	DisableSorting bool
 | 
			
		||||
 | 
			
		||||
	// The keys sorting function, when uninitialized it uses sort.Strings.
 | 
			
		||||
	SortingFunc func([]string)
 | 
			
		||||
 | 
			
		||||
	// Disables the truncation of the level text to 4 characters.
 | 
			
		||||
	DisableLevelTruncation bool
 | 
			
		||||
 | 
			
		||||
	// QuoteEmptyFields will wrap empty fields in quotes if true
 | 
			
		||||
	QuoteEmptyFields bool
 | 
			
		||||
 | 
			
		||||
	// Whether the logger's out is to a terminal
 | 
			
		||||
	isTerminal bool
 | 
			
		||||
 | 
			
		||||
	sync.Once
 | 
			
		||||
	// FieldMap allows users to customize the names of keys for default fields.
 | 
			
		||||
	// As an example:
 | 
			
		||||
	// formatter := &TextFormatter{
 | 
			
		||||
	//     FieldMap: FieldMap{
 | 
			
		||||
	//         FieldKeyTime:  "@timestamp",
 | 
			
		||||
	//         FieldKeyLevel: "@level",
 | 
			
		||||
	//         FieldKeyMsg:   "@message"}}
 | 
			
		||||
	FieldMap FieldMap
 | 
			
		||||
 | 
			
		||||
	terminalInitOnce sync.Once
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (f *TextFormatter) init(entry *Entry) {
 | 
			
		||||
	if entry.Logger != nil {
 | 
			
		||||
		f.isTerminal = f.checkIfTerminal(entry.Logger.Out)
 | 
			
		||||
		f.isTerminal = checkIfTerminal(entry.Logger.Out)
 | 
			
		||||
 | 
			
		||||
		if f.isTerminal {
 | 
			
		||||
			initTerminal(entry.Logger.Out)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (f *TextFormatter) checkIfTerminal(w io.Writer) bool {
 | 
			
		||||
	switch v := w.(type) {
 | 
			
		||||
	case *os.File:
 | 
			
		||||
		return terminal.IsTerminal(int(v.Fd()))
 | 
			
		||||
	default:
 | 
			
		||||
		return false
 | 
			
		||||
func (f *TextFormatter) isColored() bool {
 | 
			
		||||
	isColored := f.ForceColors || (f.isTerminal && (runtime.GOOS != "windows"))
 | 
			
		||||
 | 
			
		||||
	if f.EnvironmentOverrideColors {
 | 
			
		||||
		if force, ok := os.LookupEnv("CLICOLOR_FORCE"); ok && force != "0" {
 | 
			
		||||
			isColored = true
 | 
			
		||||
		} else if ok && force == "0" {
 | 
			
		||||
			isColored = false
 | 
			
		||||
		} else if os.Getenv("CLICOLOR") == "0" {
 | 
			
		||||
			isColored = false
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return isColored && !f.DisableColors
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Format renders a single log entry
 | 
			
		||||
func (f *TextFormatter) Format(entry *Entry) ([]byte, error) {
 | 
			
		||||
	var b *bytes.Buffer
 | 
			
		||||
	keys := make([]string, 0, len(entry.Data))
 | 
			
		||||
	for k := range entry.Data {
 | 
			
		||||
	data := make(Fields)
 | 
			
		||||
	for k, v := range entry.Data {
 | 
			
		||||
		data[k] = v
 | 
			
		||||
	}
 | 
			
		||||
	prefixFieldClashes(data, f.FieldMap, entry.HasCaller())
 | 
			
		||||
	keys := make([]string, 0, len(data))
 | 
			
		||||
	for k := range data {
 | 
			
		||||
		keys = append(keys, k)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if !f.DisableSorting {
 | 
			
		||||
		sort.Strings(keys)
 | 
			
		||||
	fixedKeys := make([]string, 0, 4+len(data))
 | 
			
		||||
	if !f.DisableTimestamp {
 | 
			
		||||
		fixedKeys = append(fixedKeys, f.FieldMap.resolve(FieldKeyTime))
 | 
			
		||||
	}
 | 
			
		||||
	fixedKeys = append(fixedKeys, f.FieldMap.resolve(FieldKeyLevel))
 | 
			
		||||
	if entry.Message != "" {
 | 
			
		||||
		fixedKeys = append(fixedKeys, f.FieldMap.resolve(FieldKeyMsg))
 | 
			
		||||
	}
 | 
			
		||||
	if entry.err != "" {
 | 
			
		||||
		fixedKeys = append(fixedKeys, f.FieldMap.resolve(FieldKeyLogrusError))
 | 
			
		||||
	}
 | 
			
		||||
	if entry.HasCaller() {
 | 
			
		||||
		fixedKeys = append(fixedKeys,
 | 
			
		||||
			f.FieldMap.resolve(FieldKeyFunc), f.FieldMap.resolve(FieldKeyFile))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if !f.DisableSorting {
 | 
			
		||||
		if f.SortingFunc == nil {
 | 
			
		||||
			sort.Strings(keys)
 | 
			
		||||
			fixedKeys = append(fixedKeys, keys...)
 | 
			
		||||
		} else {
 | 
			
		||||
			if !f.isColored() {
 | 
			
		||||
				fixedKeys = append(fixedKeys, keys...)
 | 
			
		||||
				f.SortingFunc(fixedKeys)
 | 
			
		||||
			} else {
 | 
			
		||||
				f.SortingFunc(keys)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	} else {
 | 
			
		||||
		fixedKeys = append(fixedKeys, keys...)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var b *bytes.Buffer
 | 
			
		||||
	if entry.Buffer != nil {
 | 
			
		||||
		b = entry.Buffer
 | 
			
		||||
	} else {
 | 
			
		||||
		b = &bytes.Buffer{}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	prefixFieldClashes(entry.Data)
 | 
			
		||||
 | 
			
		||||
	f.Do(func() { f.init(entry) })
 | 
			
		||||
 | 
			
		||||
	isColored := (f.ForceColors || f.isTerminal) && !f.DisableColors
 | 
			
		||||
	f.terminalInitOnce.Do(func() { f.init(entry) })
 | 
			
		||||
 | 
			
		||||
	timestampFormat := f.TimestampFormat
 | 
			
		||||
	if timestampFormat == "" {
 | 
			
		||||
		timestampFormat = defaultTimestampFormat
 | 
			
		||||
	}
 | 
			
		||||
	if isColored {
 | 
			
		||||
		f.printColored(b, entry, keys, timestampFormat)
 | 
			
		||||
	if f.isColored() {
 | 
			
		||||
		f.printColored(b, entry, keys, data, timestampFormat)
 | 
			
		||||
	} else {
 | 
			
		||||
		if !f.DisableTimestamp {
 | 
			
		||||
			f.appendKeyValue(b, "time", entry.Time.Format(timestampFormat))
 | 
			
		||||
		}
 | 
			
		||||
		f.appendKeyValue(b, "level", entry.Level.String())
 | 
			
		||||
		if entry.Message != "" {
 | 
			
		||||
			f.appendKeyValue(b, "msg", entry.Message)
 | 
			
		||||
		}
 | 
			
		||||
		for _, key := range keys {
 | 
			
		||||
			f.appendKeyValue(b, key, entry.Data[key])
 | 
			
		||||
		for _, key := range fixedKeys {
 | 
			
		||||
			var value interface{}
 | 
			
		||||
			switch {
 | 
			
		||||
			case key == f.FieldMap.resolve(FieldKeyTime):
 | 
			
		||||
				value = entry.Time.Format(timestampFormat)
 | 
			
		||||
			case key == f.FieldMap.resolve(FieldKeyLevel):
 | 
			
		||||
				value = entry.Level.String()
 | 
			
		||||
			case key == f.FieldMap.resolve(FieldKeyMsg):
 | 
			
		||||
				value = entry.Message
 | 
			
		||||
			case key == f.FieldMap.resolve(FieldKeyLogrusError):
 | 
			
		||||
				value = entry.err
 | 
			
		||||
			case key == f.FieldMap.resolve(FieldKeyFunc) && entry.HasCaller():
 | 
			
		||||
				value = entry.Caller.Function
 | 
			
		||||
			case key == f.FieldMap.resolve(FieldKeyFile) && entry.HasCaller():
 | 
			
		||||
				value = fmt.Sprintf("%s:%d", entry.Caller.File, entry.Caller.Line)
 | 
			
		||||
			default:
 | 
			
		||||
				value = data[key]
 | 
			
		||||
			}
 | 
			
		||||
			f.appendKeyValue(b, key, value)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@@ -124,10 +192,10 @@ func (f *TextFormatter) Format(entry *Entry) ([]byte, error) {
 | 
			
		||||
	return b.Bytes(), nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (f *TextFormatter) printColored(b *bytes.Buffer, entry *Entry, keys []string, timestampFormat string) {
 | 
			
		||||
func (f *TextFormatter) printColored(b *bytes.Buffer, entry *Entry, keys []string, data Fields, timestampFormat string) {
 | 
			
		||||
	var levelColor int
 | 
			
		||||
	switch entry.Level {
 | 
			
		||||
	case DebugLevel:
 | 
			
		||||
	case DebugLevel, TraceLevel:
 | 
			
		||||
		levelColor = gray
 | 
			
		||||
	case WarnLevel:
 | 
			
		||||
		levelColor = yellow
 | 
			
		||||
@@ -137,17 +205,31 @@ func (f *TextFormatter) printColored(b *bytes.Buffer, entry *Entry, keys []strin
 | 
			
		||||
		levelColor = blue
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	levelText := strings.ToUpper(entry.Level.String())[0:4]
 | 
			
		||||
	levelText := strings.ToUpper(entry.Level.String())
 | 
			
		||||
	if !f.DisableLevelTruncation {
 | 
			
		||||
		levelText = levelText[0:4]
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Remove a single newline if it already exists in the message to keep
 | 
			
		||||
	// the behavior of logrus text_formatter the same as the stdlib log package
 | 
			
		||||
	entry.Message = strings.TrimSuffix(entry.Message, "\n")
 | 
			
		||||
 | 
			
		||||
	caller := ""
 | 
			
		||||
 | 
			
		||||
	if entry.HasCaller() {
 | 
			
		||||
		caller = fmt.Sprintf("%s:%d %s()",
 | 
			
		||||
			entry.Caller.File, entry.Caller.Line, entry.Caller.Function)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if f.DisableTimestamp {
 | 
			
		||||
		fmt.Fprintf(b, "\x1b[%dm%s\x1b[0m %-44s ", levelColor, levelText, entry.Message)
 | 
			
		||||
		fmt.Fprintf(b, "\x1b[%dm%s\x1b[0m%s %-44s ", levelColor, levelText, caller, entry.Message)
 | 
			
		||||
	} else if !f.FullTimestamp {
 | 
			
		||||
		fmt.Fprintf(b, "\x1b[%dm%s\x1b[0m[%04d] %-44s ", levelColor, levelText, int(entry.Time.Sub(baseTimestamp)/time.Second), entry.Message)
 | 
			
		||||
		fmt.Fprintf(b, "\x1b[%dm%s\x1b[0m[%04d]%s %-44s ", levelColor, levelText, int(entry.Time.Sub(baseTimestamp)/time.Second), caller, entry.Message)
 | 
			
		||||
	} else {
 | 
			
		||||
		fmt.Fprintf(b, "\x1b[%dm%s\x1b[0m[%s] %-44s ", levelColor, levelText, entry.Time.Format(timestampFormat), entry.Message)
 | 
			
		||||
		fmt.Fprintf(b, "\x1b[%dm%s\x1b[0m[%s]%s %-44s ", levelColor, levelText, entry.Time.Format(timestampFormat), caller, entry.Message)
 | 
			
		||||
	}
 | 
			
		||||
	for _, k := range keys {
 | 
			
		||||
		v := entry.Data[k]
 | 
			
		||||
		v := data[k]
 | 
			
		||||
		fmt.Fprintf(b, " \x1b[%dm%s\x1b[0m=", levelColor, k)
 | 
			
		||||
		f.appendValue(b, v)
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								vendor/github.com/sirupsen/logrus/writer.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/sirupsen/logrus/writer.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -24,6 +24,8 @@ func (entry *Entry) WriterLevel(level Level) *io.PipeWriter {
 | 
			
		||||
	var printFunc func(args ...interface{})
 | 
			
		||||
 | 
			
		||||
	switch level {
 | 
			
		||||
	case TraceLevel:
 | 
			
		||||
		printFunc = entry.Trace
 | 
			
		||||
	case DebugLevel:
 | 
			
		||||
		printFunc = entry.Debug
 | 
			
		||||
	case InfoLevel:
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user