Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
songlinfeng
container-toolkit
Commits
d7e13eb9
Commit
d7e13eb9
authored
Oct 22, 2025
by
songlinfeng
Browse files
add dtk-container-toolkit
parent
fcdba4f3
Changes
345
Hide whitespace changes
Inline
Side-by-side
Showing
20 changed files
with
2163 additions
and
0 deletions
+2163
-0
vendor/github.com/sirupsen/logrus/alt_exit.go
vendor/github.com/sirupsen/logrus/alt_exit.go
+76
-0
vendor/github.com/sirupsen/logrus/appveyor.yml
vendor/github.com/sirupsen/logrus/appveyor.yml
+14
-0
vendor/github.com/sirupsen/logrus/buffer_pool.go
vendor/github.com/sirupsen/logrus/buffer_pool.go
+43
-0
vendor/github.com/sirupsen/logrus/doc.go
vendor/github.com/sirupsen/logrus/doc.go
+26
-0
vendor/github.com/sirupsen/logrus/entry.go
vendor/github.com/sirupsen/logrus/entry.go
+442
-0
vendor/github.com/sirupsen/logrus/exported.go
vendor/github.com/sirupsen/logrus/exported.go
+270
-0
vendor/github.com/sirupsen/logrus/formatter.go
vendor/github.com/sirupsen/logrus/formatter.go
+78
-0
vendor/github.com/sirupsen/logrus/hooks.go
vendor/github.com/sirupsen/logrus/hooks.go
+34
-0
vendor/github.com/sirupsen/logrus/json_formatter.go
vendor/github.com/sirupsen/logrus/json_formatter.go
+128
-0
vendor/github.com/sirupsen/logrus/logger.go
vendor/github.com/sirupsen/logrus/logger.go
+417
-0
vendor/github.com/sirupsen/logrus/logrus.go
vendor/github.com/sirupsen/logrus/logrus.go
+186
-0
vendor/github.com/sirupsen/logrus/terminal_check_appengine.go
...or/github.com/sirupsen/logrus/terminal_check_appengine.go
+11
-0
vendor/github.com/sirupsen/logrus/terminal_check_bsd.go
vendor/github.com/sirupsen/logrus/terminal_check_bsd.go
+13
-0
vendor/github.com/sirupsen/logrus/terminal_check_js.go
vendor/github.com/sirupsen/logrus/terminal_check_js.go
+7
-0
vendor/github.com/sirupsen/logrus/terminal_check_no_terminal.go
.../github.com/sirupsen/logrus/terminal_check_no_terminal.go
+11
-0
vendor/github.com/sirupsen/logrus/terminal_check_notappengine.go
...github.com/sirupsen/logrus/terminal_check_notappengine.go
+17
-0
vendor/github.com/sirupsen/logrus/terminal_check_solaris.go
vendor/github.com/sirupsen/logrus/terminal_check_solaris.go
+11
-0
vendor/github.com/sirupsen/logrus/terminal_check_unix.go
vendor/github.com/sirupsen/logrus/terminal_check_unix.go
+13
-0
vendor/github.com/sirupsen/logrus/terminal_check_windows.go
vendor/github.com/sirupsen/logrus/terminal_check_windows.go
+27
-0
vendor/github.com/sirupsen/logrus/text_formatter.go
vendor/github.com/sirupsen/logrus/text_formatter.go
+339
-0
No files found.
Too many changes to show.
To preserve performance only
345 of 345+
files are displayed.
Plain diff
Email patch
vendor/github.com/sirupsen/logrus/alt_exit.go
0 → 100644
View file @
d7e13eb9
package
logrus
// The following code was sourced and modified from the
// https://github.com/tebeka/atexit package governed by the following license:
//
// Copyright (c) 2012 Miki Tebeka <miki.tebeka@gmail.com>.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy of
// this software and associated documentation files (the "Software"), to deal in
// the Software without restriction, including without limitation the rights to
// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
// the Software, and to permit persons to whom the Software is furnished to do so,
// subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
import
(
"fmt"
"os"
)
var
handlers
=
[]
func
(){}
func
runHandler
(
handler
func
())
{
defer
func
()
{
if
err
:=
recover
();
err
!=
nil
{
fmt
.
Fprintln
(
os
.
Stderr
,
"Error: Logrus exit handler error:"
,
err
)
}
}()
handler
()
}
func
runHandlers
()
{
for
_
,
handler
:=
range
handlers
{
runHandler
(
handler
)
}
}
// Exit runs all the Logrus atexit handlers and then terminates the program using os.Exit(code)
func
Exit
(
code
int
)
{
runHandlers
()
os
.
Exit
(
code
)
}
// RegisterExitHandler appends a Logrus Exit handler to the list of handlers,
// call logrus.Exit to invoke all handlers. The handlers will also be invoked when
// any Fatal log entry is made.
//
// This method is useful when a caller wishes to use logrus to log a fatal
// message but also needs to gracefully shutdown. An example usecase could be
// closing database connections, or sending a alert that the application is
// closing.
func
RegisterExitHandler
(
handler
func
())
{
handlers
=
append
(
handlers
,
handler
)
}
// DeferExitHandler prepends a Logrus Exit handler to the list of handlers,
// call logrus.Exit to invoke all handlers. The handlers will also be invoked when
// any Fatal log entry is made.
//
// This method is useful when a caller wishes to use logrus to log a fatal
// message but also needs to gracefully shutdown. An example usecase could be
// closing database connections, or sending a alert that the application is
// closing.
func
DeferExitHandler
(
handler
func
())
{
handlers
=
append
([]
func
(){
handler
},
handlers
...
)
}
vendor/github.com/sirupsen/logrus/appveyor.yml
0 → 100644
View file @
d7e13eb9
version
:
"
{build}"
platform
:
x64
clone_folder
:
c:\gopath\src\github.com\sirupsen\logrus
environment
:
GOPATH
:
c:\gopath
branches
:
only
:
-
master
install
:
-
set PATH=%GOPATH%\bin;c:\go\bin;%PATH%
-
go version
build_script
:
-
go get -t
-
go test
vendor/github.com/sirupsen/logrus/buffer_pool.go
0 → 100644
View file @
d7e13eb9
package
logrus
import
(
"bytes"
"sync"
)
var
(
bufferPool
BufferPool
)
type
BufferPool
interface
{
Put
(
*
bytes
.
Buffer
)
Get
()
*
bytes
.
Buffer
}
type
defaultPool
struct
{
pool
*
sync
.
Pool
}
func
(
p
*
defaultPool
)
Put
(
buf
*
bytes
.
Buffer
)
{
p
.
pool
.
Put
(
buf
)
}
func
(
p
*
defaultPool
)
Get
()
*
bytes
.
Buffer
{
return
p
.
pool
.
Get
()
.
(
*
bytes
.
Buffer
)
}
// SetBufferPool allows to replace the default logrus buffer pool
// to better meets the specific needs of an application.
func
SetBufferPool
(
bp
BufferPool
)
{
bufferPool
=
bp
}
func
init
()
{
SetBufferPool
(
&
defaultPool
{
pool
:
&
sync
.
Pool
{
New
:
func
()
interface
{}
{
return
new
(
bytes
.
Buffer
)
},
},
})
}
vendor/github.com/sirupsen/logrus/doc.go
0 → 100644
View file @
d7e13eb9
/*
Package logrus is a structured logger for Go, completely API compatible with the standard library logger.
The simplest way to use Logrus is simply the package-level exported logger:
package main
import (
log "github.com/sirupsen/logrus"
)
func main() {
log.WithFields(log.Fields{
"animal": "walrus",
"number": 1,
"size": 10,
}).Info("A walrus appears")
}
Output:
time="2015-09-07T08:48:33Z" level=info msg="A walrus appears" animal=walrus number=1 size=10
For a full guide visit https://github.com/sirupsen/logrus
*/
package
logrus
vendor/github.com/sirupsen/logrus/entry.go
0 → 100644
View file @
d7e13eb9
package
logrus
import
(
"bytes"
"context"
"fmt"
"os"
"reflect"
"runtime"
"strings"
"sync"
"time"
)
var
(
// 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
()
{
// 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 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
// Contains all the fields set by the user.
Data
Fields
// Time at which the log entry was created
Time
time
.
Time
// 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
// 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(), a Buffer may be set to entry
Buffer
*
bytes
.
Buffer
// Contains the context set by the user. Useful for hook processing etc.
Context
context
.
Context
// err may contain a field formatting error
err
string
}
func
NewEntry
(
logger
*
Logger
)
*
Entry
{
return
&
Entry
{
Logger
:
logger
,
// Default is three fields, plus one optional. Give a little extra room.
Data
:
make
(
Fields
,
6
),
}
}
func
(
entry
*
Entry
)
Dup
()
*
Entry
{
data
:=
make
(
Fields
,
len
(
entry
.
Data
))
for
k
,
v
:=
range
entry
.
Data
{
data
[
k
]
=
v
}
return
&
Entry
{
Logger
:
entry
.
Logger
,
Data
:
data
,
Time
:
entry
.
Time
,
Context
:
entry
.
Context
,
err
:
entry
.
err
}
}
// Returns the bytes representation of this entry from the formatter.
func
(
entry
*
Entry
)
Bytes
()
([]
byte
,
error
)
{
return
entry
.
Logger
.
Formatter
.
Format
(
entry
)
}
// Returns the string representation from the reader and ultimately the
// formatter.
func
(
entry
*
Entry
)
String
()
(
string
,
error
)
{
serialized
,
err
:=
entry
.
Bytes
()
if
err
!=
nil
{
return
""
,
err
}
str
:=
string
(
serialized
)
return
str
,
nil
}
// Add an error as single field (using the key defined in ErrorKey) to the Entry.
func
(
entry
*
Entry
)
WithError
(
err
error
)
*
Entry
{
return
entry
.
WithField
(
ErrorKey
,
err
)
}
// Add a context to the Entry.
func
(
entry
*
Entry
)
WithContext
(
ctx
context
.
Context
)
*
Entry
{
dataCopy
:=
make
(
Fields
,
len
(
entry
.
Data
))
for
k
,
v
:=
range
entry
.
Data
{
dataCopy
[
k
]
=
v
}
return
&
Entry
{
Logger
:
entry
.
Logger
,
Data
:
dataCopy
,
Time
:
entry
.
Time
,
err
:
entry
.
err
,
Context
:
ctx
}
}
// Add a single field to the Entry.
func
(
entry
*
Entry
)
WithField
(
key
string
,
value
interface
{})
*
Entry
{
return
entry
.
WithFields
(
Fields
{
key
:
value
})
}
// Add a map of fields to the Entry.
func
(
entry
*
Entry
)
WithFields
(
fields
Fields
)
*
Entry
{
data
:=
make
(
Fields
,
len
(
entry
.
Data
)
+
len
(
fields
))
for
k
,
v
:=
range
entry
.
Data
{
data
[
k
]
=
v
}
fieldErr
:=
entry
.
err
for
k
,
v
:=
range
fields
{
isErrField
:=
false
if
t
:=
reflect
.
TypeOf
(
v
);
t
!=
nil
{
switch
{
case
t
.
Kind
()
==
reflect
.
Func
,
t
.
Kind
()
==
reflect
.
Ptr
&&
t
.
Elem
()
.
Kind
()
==
reflect
.
Func
:
isErrField
=
true
}
}
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
,
Time
:
entry
.
Time
,
err
:
fieldErr
,
Context
:
entry
.
Context
}
}
// Overrides the time of the Entry.
func
(
entry
*
Entry
)
WithTime
(
t
time
.
Time
)
*
Entry
{
dataCopy
:=
make
(
Fields
,
len
(
entry
.
Data
))
for
k
,
v
:=
range
entry
.
Data
{
dataCopy
[
k
]
=
v
}
return
&
Entry
{
Logger
:
entry
.
Logger
,
Data
:
dataCopy
,
Time
:
t
,
err
:
entry
.
err
,
Context
:
entry
.
Context
}
}
// 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
{
// cache this package's fully-qualified name
callerInitOnce
.
Do
(
func
()
{
pcs
:=
make
([]
uintptr
,
maximumCallerDepth
)
_
=
runtime
.
Callers
(
0
,
pcs
)
// dynamic get the package name and the minimum caller depth
for
i
:=
0
;
i
<
maximumCallerDepth
;
i
++
{
funcName
:=
runtime
.
FuncForPC
(
pcs
[
i
])
.
Name
()
if
strings
.
Contains
(
funcName
,
"getCaller"
)
{
logrusPackage
=
getPackageName
(
funcName
)
break
}
}
minimumCallerDepth
=
knownLogrusFrames
})
// Restrict the lookback frames to avoid runaway lookups
pcs
:=
make
([]
uintptr
,
maximumCallerDepth
)
depth
:=
runtime
.
Callers
(
minimumCallerDepth
,
pcs
)
frames
:=
runtime
.
CallersFrames
(
pcs
[
:
depth
])
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
//nolint:scopelint
}
}
// 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
}
func
(
entry
*
Entry
)
log
(
level
Level
,
msg
string
)
{
var
buffer
*
bytes
.
Buffer
newEntry
:=
entry
.
Dup
()
if
newEntry
.
Time
.
IsZero
()
{
newEntry
.
Time
=
time
.
Now
()
}
newEntry
.
Level
=
level
newEntry
.
Message
=
msg
newEntry
.
Logger
.
mu
.
Lock
()
reportCaller
:=
newEntry
.
Logger
.
ReportCaller
bufPool
:=
newEntry
.
getBufferPool
()
newEntry
.
Logger
.
mu
.
Unlock
()
if
reportCaller
{
newEntry
.
Caller
=
getCaller
()
}
newEntry
.
fireHooks
()
buffer
=
bufPool
.
Get
()
defer
func
()
{
newEntry
.
Buffer
=
nil
buffer
.
Reset
()
bufPool
.
Put
(
buffer
)
}()
buffer
.
Reset
()
newEntry
.
Buffer
=
buffer
newEntry
.
write
()
newEntry
.
Buffer
=
nil
// 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
// directly here.
if
level
<=
PanicLevel
{
panic
(
newEntry
)
}
}
func
(
entry
*
Entry
)
getBufferPool
()
(
pool
BufferPool
)
{
if
entry
.
Logger
.
BufferPool
!=
nil
{
return
entry
.
Logger
.
BufferPool
}
return
bufferPool
}
func
(
entry
*
Entry
)
fireHooks
()
{
var
tmpHooks
LevelHooks
entry
.
Logger
.
mu
.
Lock
()
tmpHooks
=
make
(
LevelHooks
,
len
(
entry
.
Logger
.
Hooks
))
for
k
,
v
:=
range
entry
.
Logger
.
Hooks
{
tmpHooks
[
k
]
=
v
}
entry
.
Logger
.
mu
.
Unlock
()
err
:=
tmpHooks
.
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
)
return
}
if
_
,
err
:=
entry
.
Logger
.
Out
.
Write
(
serialized
);
err
!=
nil
{
fmt
.
Fprintf
(
os
.
Stderr
,
"Failed to write to log, %v
\n
"
,
err
)
}
}
// Log will log a message at the level given as parameter.
// Warning: using Log at Panic or Fatal level will not respectively Panic nor Exit.
// For this behaviour Entry.Panic or Entry.Fatal should be used instead.
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
{})
{
entry
.
Log
(
InfoLevel
,
args
...
)
}
func
(
entry
*
Entry
)
Warn
(
args
...
interface
{})
{
entry
.
Log
(
WarnLevel
,
args
...
)
}
func
(
entry
*
Entry
)
Warning
(
args
...
interface
{})
{
entry
.
Warn
(
args
...
)
}
func
(
entry
*
Entry
)
Error
(
args
...
interface
{})
{
entry
.
Log
(
ErrorLevel
,
args
...
)
}
func
(
entry
*
Entry
)
Fatal
(
args
...
interface
{})
{
entry
.
Log
(
FatalLevel
,
args
...
)
entry
.
Logger
.
Exit
(
1
)
}
func
(
entry
*
Entry
)
Panic
(
args
...
interface
{})
{
entry
.
Log
(
PanicLevel
,
args
...
)
}
// Entry Printf family functions
func
(
entry
*
Entry
)
Logf
(
level
Level
,
format
string
,
args
...
interface
{})
{
if
entry
.
Logger
.
IsLevelEnabled
(
level
)
{
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
{})
{
entry
.
Logf
(
DebugLevel
,
format
,
args
...
)
}
func
(
entry
*
Entry
)
Infof
(
format
string
,
args
...
interface
{})
{
entry
.
Logf
(
InfoLevel
,
format
,
args
...
)
}
func
(
entry
*
Entry
)
Printf
(
format
string
,
args
...
interface
{})
{
entry
.
Infof
(
format
,
args
...
)
}
func
(
entry
*
Entry
)
Warnf
(
format
string
,
args
...
interface
{})
{
entry
.
Logf
(
WarnLevel
,
format
,
args
...
)
}
func
(
entry
*
Entry
)
Warningf
(
format
string
,
args
...
interface
{})
{
entry
.
Warnf
(
format
,
args
...
)
}
func
(
entry
*
Entry
)
Errorf
(
format
string
,
args
...
interface
{})
{
entry
.
Logf
(
ErrorLevel
,
format
,
args
...
)
}
func
(
entry
*
Entry
)
Fatalf
(
format
string
,
args
...
interface
{})
{
entry
.
Logf
(
FatalLevel
,
format
,
args
...
)
entry
.
Logger
.
Exit
(
1
)
}
func
(
entry
*
Entry
)
Panicf
(
format
string
,
args
...
interface
{})
{
entry
.
Logf
(
PanicLevel
,
format
,
args
...
)
}
// Entry Println family functions
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
{})
{
entry
.
Logln
(
InfoLevel
,
args
...
)
}
func
(
entry
*
Entry
)
Println
(
args
...
interface
{})
{
entry
.
Infoln
(
args
...
)
}
func
(
entry
*
Entry
)
Warnln
(
args
...
interface
{})
{
entry
.
Logln
(
WarnLevel
,
args
...
)
}
func
(
entry
*
Entry
)
Warningln
(
args
...
interface
{})
{
entry
.
Warnln
(
args
...
)
}
func
(
entry
*
Entry
)
Errorln
(
args
...
interface
{})
{
entry
.
Logln
(
ErrorLevel
,
args
...
)
}
func
(
entry
*
Entry
)
Fatalln
(
args
...
interface
{})
{
entry
.
Logln
(
FatalLevel
,
args
...
)
entry
.
Logger
.
Exit
(
1
)
}
func
(
entry
*
Entry
)
Panicln
(
args
...
interface
{})
{
entry
.
Logln
(
PanicLevel
,
args
...
)
}
// Sprintlnn => Sprint no newline. This is to get the behavior of how
// fmt.Sprintln where spaces are always added between operands, regardless of
// their type. Instead of vendoring the Sprintln implementation to spare a
// string allocation, we do the simplest thing.
func
(
entry
*
Entry
)
sprintlnn
(
args
...
interface
{})
string
{
msg
:=
fmt
.
Sprintln
(
args
...
)
return
msg
[
:
len
(
msg
)
-
1
]
}
vendor/github.com/sirupsen/logrus/exported.go
0 → 100644
View file @
d7e13eb9
package
logrus
import
(
"context"
"io"
"time"
)
var
(
// std is the name of the standard logger in stdlib `log`
std
=
New
()
)
func
StandardLogger
()
*
Logger
{
return
std
}
// SetOutput sets the standard logger output.
func
SetOutput
(
out
io
.
Writer
)
{
std
.
SetOutput
(
out
)
}
// SetFormatter sets the standard logger formatter.
func
SetFormatter
(
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
.
SetLevel
(
level
)
}
// GetLevel returns the standard logger level.
func
GetLevel
()
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
.
AddHook
(
hook
)
}
// WithError creates an entry from the standard logger and adds an error to it, using the value defined in ErrorKey as key.
func
WithError
(
err
error
)
*
Entry
{
return
std
.
WithField
(
ErrorKey
,
err
)
}
// WithContext creates an entry from the standard logger and adds a context to it.
func
WithContext
(
ctx
context
.
Context
)
*
Entry
{
return
std
.
WithContext
(
ctx
)
}
// WithField creates an entry from the standard logger and adds a field to
// it. If you want multiple fields, use `WithFields`.
//
// Note that it doesn't log until you call Debug, Print, Info, Warn, Fatal
// or Panic on the Entry it returns.
func
WithField
(
key
string
,
value
interface
{})
*
Entry
{
return
std
.
WithField
(
key
,
value
)
}
// WithFields creates an entry from the standard logger and adds multiple
// fields to it. This is simply a helper for `WithField`, invoking it
// once for each field.
//
// Note that it doesn't log until you call Debug, Print, Info, Warn, Fatal
// or Panic on the Entry it returns.
func
WithFields
(
fields
Fields
)
*
Entry
{
return
std
.
WithFields
(
fields
)
}
// WithTime creates 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
...
)
}
// Print logs a message at level Info on the standard logger.
func
Print
(
args
...
interface
{})
{
std
.
Print
(
args
...
)
}
// Info logs a message at level Info on the standard logger.
func
Info
(
args
...
interface
{})
{
std
.
Info
(
args
...
)
}
// Warn logs a message at level Warn on the standard logger.
func
Warn
(
args
...
interface
{})
{
std
.
Warn
(
args
...
)
}
// Warning logs a message at level Warn on the standard logger.
func
Warning
(
args
...
interface
{})
{
std
.
Warning
(
args
...
)
}
// Error logs a message at level Error on the standard logger.
func
Error
(
args
...
interface
{})
{
std
.
Error
(
args
...
)
}
// Panic logs a message at level Panic on the standard logger.
func
Panic
(
args
...
interface
{})
{
std
.
Panic
(
args
...
)
}
// 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
...
)
}
// TraceFn logs a message from a func at level Trace on the standard logger.
func
TraceFn
(
fn
LogFunction
)
{
std
.
TraceFn
(
fn
)
}
// DebugFn logs a message from a func at level Debug on the standard logger.
func
DebugFn
(
fn
LogFunction
)
{
std
.
DebugFn
(
fn
)
}
// PrintFn logs a message from a func at level Info on the standard logger.
func
PrintFn
(
fn
LogFunction
)
{
std
.
PrintFn
(
fn
)
}
// InfoFn logs a message from a func at level Info on the standard logger.
func
InfoFn
(
fn
LogFunction
)
{
std
.
InfoFn
(
fn
)
}
// WarnFn logs a message from a func at level Warn on the standard logger.
func
WarnFn
(
fn
LogFunction
)
{
std
.
WarnFn
(
fn
)
}
// WarningFn logs a message from a func at level Warn on the standard logger.
func
WarningFn
(
fn
LogFunction
)
{
std
.
WarningFn
(
fn
)
}
// ErrorFn logs a message from a func at level Error on the standard logger.
func
ErrorFn
(
fn
LogFunction
)
{
std
.
ErrorFn
(
fn
)
}
// PanicFn logs a message from a func at level Panic on the standard logger.
func
PanicFn
(
fn
LogFunction
)
{
std
.
PanicFn
(
fn
)
}
// FatalFn logs a message from a func at level Fatal on the standard logger then the process will exit with status set to 1.
func
FatalFn
(
fn
LogFunction
)
{
std
.
FatalFn
(
fn
)
}
// 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
...
)
}
// Printf logs a message at level Info on the standard logger.
func
Printf
(
format
string
,
args
...
interface
{})
{
std
.
Printf
(
format
,
args
...
)
}
// Infof logs a message at level Info on the standard logger.
func
Infof
(
format
string
,
args
...
interface
{})
{
std
.
Infof
(
format
,
args
...
)
}
// Warnf logs a message at level Warn on the standard logger.
func
Warnf
(
format
string
,
args
...
interface
{})
{
std
.
Warnf
(
format
,
args
...
)
}
// Warningf logs a message at level Warn on the standard logger.
func
Warningf
(
format
string
,
args
...
interface
{})
{
std
.
Warningf
(
format
,
args
...
)
}
// Errorf logs a message at level Error on the standard logger.
func
Errorf
(
format
string
,
args
...
interface
{})
{
std
.
Errorf
(
format
,
args
...
)
}
// Panicf logs a message at level Panic on the standard logger.
func
Panicf
(
format
string
,
args
...
interface
{})
{
std
.
Panicf
(
format
,
args
...
)
}
// 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
...
)
}
// Println logs a message at level Info on the standard logger.
func
Println
(
args
...
interface
{})
{
std
.
Println
(
args
...
)
}
// Infoln logs a message at level Info on the standard logger.
func
Infoln
(
args
...
interface
{})
{
std
.
Infoln
(
args
...
)
}
// Warnln logs a message at level Warn on the standard logger.
func
Warnln
(
args
...
interface
{})
{
std
.
Warnln
(
args
...
)
}
// Warningln logs a message at level Warn on the standard logger.
func
Warningln
(
args
...
interface
{})
{
std
.
Warningln
(
args
...
)
}
// Errorln logs a message at level Error on the standard logger.
func
Errorln
(
args
...
interface
{})
{
std
.
Errorln
(
args
...
)
}
// Panicln logs a message at level Panic on the standard logger.
func
Panicln
(
args
...
interface
{})
{
std
.
Panicln
(
args
...
)
}
// 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
...
)
}
vendor/github.com/sirupsen/logrus/formatter.go
0 → 100644
View file @
d7e13eb9
package
logrus
import
"time"
// 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:
//
// * `entry.Data["msg"]`. The message passed from Info, Warn, Error ..
// * `entry.Data["time"]`. The timestamp.
// * `entry.Data["level"]. The level the entry was logged at.
//
// Any additional fields added with `WithField` or `WithFields` are also in
// `entry.Data`. Format is expected to return an array of bytes which are then
// logged to `logger.Out`.
type
Formatter
interface
{
Format
(
*
Entry
)
([]
byte
,
error
)
}
// 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")
//
// Would just silently drop the user provided level. Instead with this code
// it'll logged as:
//
// {"level": "info", "fields.level": 1, "msg": "hello", "time": "..."}
//
// 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
,
fieldMap
FieldMap
,
reportCaller
bool
)
{
timeKey
:=
fieldMap
.
resolve
(
FieldKeyTime
)
if
t
,
ok
:=
data
[
timeKey
];
ok
{
data
[
"fields."
+
timeKey
]
=
t
delete
(
data
,
timeKey
)
}
msgKey
:=
fieldMap
.
resolve
(
FieldKeyMsg
)
if
m
,
ok
:=
data
[
msgKey
];
ok
{
data
[
"fields."
+
msgKey
]
=
m
delete
(
data
,
msgKey
)
}
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
}
}
}
vendor/github.com/sirupsen/logrus/hooks.go
0 → 100644
View file @
d7e13eb9
package
logrus
// A hook to be fired when logging on the logging levels returned from
// `Levels()` on your implementation of the interface. Note that this is not
// fired in a goroutine or a channel with workers, you should handle such
// functionality yourself if your call is non-blocking and you don't wish for
// the logging calls for levels returned from `Levels()` to block.
type
Hook
interface
{
Levels
()
[]
Level
Fire
(
*
Entry
)
error
}
// Internal type for storing the hooks on a logger instance.
type
LevelHooks
map
[
Level
][]
Hook
// Add a hook to an instance of logger. This is called with
// `log.Hooks.Add(new(MyHook))` where `MyHook` implements the `Hook` interface.
func
(
hooks
LevelHooks
)
Add
(
hook
Hook
)
{
for
_
,
level
:=
range
hook
.
Levels
()
{
hooks
[
level
]
=
append
(
hooks
[
level
],
hook
)
}
}
// Fire all the hooks for the passed level. Used by `entry.log` to fire
// appropriate hooks for a log entry.
func
(
hooks
LevelHooks
)
Fire
(
level
Level
,
entry
*
Entry
)
error
{
for
_
,
hook
:=
range
hooks
[
level
]
{
if
err
:=
hook
.
Fire
(
entry
);
err
!=
nil
{
return
err
}
}
return
nil
}
vendor/github.com/sirupsen/logrus/json_formatter.go
0 → 100644
View file @
d7e13eb9
package
logrus
import
(
"bytes"
"encoding/json"
"fmt"
"runtime"
)
type
fieldKey
string
// FieldMap allows customization of the key names for default fields.
type
FieldMap
map
[
fieldKey
]
string
func
(
f
FieldMap
)
resolve
(
key
fieldKey
)
string
{
if
k
,
ok
:=
f
[
key
];
ok
{
return
k
}
return
string
(
key
)
}
// JSONFormatter formats logs into parsable json
type
JSONFormatter
struct
{
// TimestampFormat sets the format used for marshaling timestamps.
// The format to use is the same than for time.Format or time.Parse from the standard
// library.
// The standard Library already provides a set of predefined format.
TimestampFormat
string
// DisableTimestamp allows disabling automatic timestamps in output
DisableTimestamp
bool
// DisableHTMLEscape allows disabling html escaping in output
DisableHTMLEscape
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",
// FieldKeyLevel: "@level",
// FieldKeyMsg: "@message",
// FieldKeyFunc: "@caller",
// },
// }
FieldMap
FieldMap
// CallerPrettyfier can be set by the user to modify the content
// of the function and file keys in the json data when ReportCaller is
// activated. If any of the returned value is the empty string the
// corresponding key will be removed from json fields.
CallerPrettyfier
func
(
*
runtime
.
Frame
)
(
function
string
,
file
string
)
// 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
)
+
4
)
for
k
,
v
:=
range
entry
.
Data
{
switch
v
:=
v
.
(
type
)
{
case
error
:
// Otherwise errors are ignored by `encoding/json`
// https://github.com/sirupsen/logrus/issues/137
data
[
k
]
=
v
.
Error
()
default
:
data
[
k
]
=
v
}
}
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
()
{
funcVal
:=
entry
.
Caller
.
Function
fileVal
:=
fmt
.
Sprintf
(
"%s:%d"
,
entry
.
Caller
.
File
,
entry
.
Caller
.
Line
)
if
f
.
CallerPrettyfier
!=
nil
{
funcVal
,
fileVal
=
f
.
CallerPrettyfier
(
entry
.
Caller
)
}
if
funcVal
!=
""
{
data
[
f
.
FieldMap
.
resolve
(
FieldKeyFunc
)]
=
funcVal
}
if
fileVal
!=
""
{
data
[
f
.
FieldMap
.
resolve
(
FieldKeyFile
)]
=
fileVal
}
}
var
b
*
bytes
.
Buffer
if
entry
.
Buffer
!=
nil
{
b
=
entry
.
Buffer
}
else
{
b
=
&
bytes
.
Buffer
{}
}
encoder
:=
json
.
NewEncoder
(
b
)
encoder
.
SetEscapeHTML
(
!
f
.
DisableHTMLEscape
)
if
f
.
PrettyPrint
{
encoder
.
SetIndent
(
""
,
" "
)
}
if
err
:=
encoder
.
Encode
(
data
);
err
!=
nil
{
return
nil
,
fmt
.
Errorf
(
"failed to marshal fields to JSON, %w"
,
err
)
}
return
b
.
Bytes
(),
nil
}
vendor/github.com/sirupsen/logrus/logger.go
0 → 100644
View file @
d7e13eb9
package
logrus
import
(
"context"
"io"
"os"
"sync"
"sync/atomic"
"time"
)
// LogFunction For big messages, it can be more efficient to pass a function
// and only call it if the log level is actually enables rather than
// generating the log message and then checking if the level is enabled
type
LogFunction
func
()
[]
interface
{}
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 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
// service, log to StatsD or dump the core on fatal errors.
Hooks
LevelHooks
// All log entries pass through the formatter before logged to Out. The
// included formatters are `TextFormatter` and `JSONFormatter` for which
// TextFormatter is the default. In development (when a TTY is attached) it
// logs with colors, but to a file it wouldn't. You can easily implement your
// 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.
Level
Level
// Used to sync writing to the log. Locking is enabled by Default
mu
MutexWrap
// Reusable empty entry
entryPool
sync
.
Pool
// Function to exit the application, defaults to `os.Exit()`
ExitFunc
exitFunc
// The buffer pool used to format the log. If it is nil, the default global
// buffer pool will be used.
BufferPool
BufferPool
}
type
exitFunc
func
(
int
)
type
MutexWrap
struct
{
lock
sync
.
Mutex
disabled
bool
}
func
(
mw
*
MutexWrap
)
Lock
()
{
if
!
mw
.
disabled
{
mw
.
lock
.
Lock
()
}
}
func
(
mw
*
MutexWrap
)
Unlock
()
{
if
!
mw
.
disabled
{
mw
.
lock
.
Unlock
()
}
}
func
(
mw
*
MutexWrap
)
Disable
()
{
mw
.
disabled
=
true
}
// Creates a new logger. Configuration should be set by changing `Formatter`,
// `Out` and `Hooks` directly on the default logger instance. You can also just
// instantiate your own:
//
// var log = &logrus.Logger{
// Out: os.Stderr,
// Formatter: new(logrus.TextFormatter),
// Hooks: make(logrus.LevelHooks),
// Level: logrus.DebugLevel,
// }
//
// 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
,
ExitFunc
:
os
.
Exit
,
ReportCaller
:
false
,
}
}
func
(
logger
*
Logger
)
newEntry
()
*
Entry
{
entry
,
ok
:=
logger
.
entryPool
.
Get
()
.
(
*
Entry
)
if
ok
{
return
entry
}
return
NewEntry
(
logger
)
}
func
(
logger
*
Logger
)
releaseEntry
(
entry
*
Entry
)
{
entry
.
Data
=
map
[
string
]
interface
{}{}
logger
.
entryPool
.
Put
(
entry
)
}
// WithField allocates a new entry and adds a field to it.
// Debug, Print, Info, Warn, Error, Fatal or Panic must be then applied to
// this new returned entry.
// If you want multiple fields, use `WithFields`.
func
(
logger
*
Logger
)
WithField
(
key
string
,
value
interface
{})
*
Entry
{
entry
:=
logger
.
newEntry
()
defer
logger
.
releaseEntry
(
entry
)
return
entry
.
WithField
(
key
,
value
)
}
// Adds a struct of fields to the log entry. All it does is call `WithField` for
// each `Field`.
func
(
logger
*
Logger
)
WithFields
(
fields
Fields
)
*
Entry
{
entry
:=
logger
.
newEntry
()
defer
logger
.
releaseEntry
(
entry
)
return
entry
.
WithFields
(
fields
)
}
// Add an error as single field to the log entry. All it does is call
// `WithError` for the given `error`.
func
(
logger
*
Logger
)
WithError
(
err
error
)
*
Entry
{
entry
:=
logger
.
newEntry
()
defer
logger
.
releaseEntry
(
entry
)
return
entry
.
WithError
(
err
)
}
// Add a context to the log entry.
func
(
logger
*
Logger
)
WithContext
(
ctx
context
.
Context
)
*
Entry
{
entry
:=
logger
.
newEntry
()
defer
logger
.
releaseEntry
(
entry
)
return
entry
.
WithContext
(
ctx
)
}
// 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
.
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
{})
{
logger
.
Logf
(
InfoLevel
,
format
,
args
...
)
}
func
(
logger
*
Logger
)
Printf
(
format
string
,
args
...
interface
{})
{
entry
:=
logger
.
newEntry
()
entry
.
Printf
(
format
,
args
...
)
logger
.
releaseEntry
(
entry
)
}
func
(
logger
*
Logger
)
Warnf
(
format
string
,
args
...
interface
{})
{
logger
.
Logf
(
WarnLevel
,
format
,
args
...
)
}
func
(
logger
*
Logger
)
Warningf
(
format
string
,
args
...
interface
{})
{
logger
.
Warnf
(
format
,
args
...
)
}
func
(
logger
*
Logger
)
Errorf
(
format
string
,
args
...
interface
{})
{
logger
.
Logf
(
ErrorLevel
,
format
,
args
...
)
}
func
(
logger
*
Logger
)
Fatalf
(
format
string
,
args
...
interface
{})
{
logger
.
Logf
(
FatalLevel
,
format
,
args
...
)
logger
.
Exit
(
1
)
}
func
(
logger
*
Logger
)
Panicf
(
format
string
,
args
...
interface
{})
{
logger
.
Logf
(
PanicLevel
,
format
,
args
...
)
}
// Log will log a message at the level given as parameter.
// Warning: using Log at Panic or Fatal level will not respectively Panic nor Exit.
// For this behaviour Logger.Panic or Logger.Fatal should be used instead.
func
(
logger
*
Logger
)
Log
(
level
Level
,
args
...
interface
{})
{
if
logger
.
IsLevelEnabled
(
level
)
{
entry
:=
logger
.
newEntry
()
entry
.
Log
(
level
,
args
...
)
logger
.
releaseEntry
(
entry
)
}
}
func
(
logger
*
Logger
)
LogFn
(
level
Level
,
fn
LogFunction
)
{
if
logger
.
IsLevelEnabled
(
level
)
{
entry
:=
logger
.
newEntry
()
entry
.
Log
(
level
,
fn
()
...
)
logger
.
releaseEntry
(
entry
)
}
}
func
(
logger
*
Logger
)
Trace
(
args
...
interface
{})
{
logger
.
Log
(
TraceLevel
,
args
...
)
}
func
(
logger
*
Logger
)
Debug
(
args
...
interface
{})
{
logger
.
Log
(
DebugLevel
,
args
...
)
}
func
(
logger
*
Logger
)
Info
(
args
...
interface
{})
{
logger
.
Log
(
InfoLevel
,
args
...
)
}
func
(
logger
*
Logger
)
Print
(
args
...
interface
{})
{
entry
:=
logger
.
newEntry
()
entry
.
Print
(
args
...
)
logger
.
releaseEntry
(
entry
)
}
func
(
logger
*
Logger
)
Warn
(
args
...
interface
{})
{
logger
.
Log
(
WarnLevel
,
args
...
)
}
func
(
logger
*
Logger
)
Warning
(
args
...
interface
{})
{
logger
.
Warn
(
args
...
)
}
func
(
logger
*
Logger
)
Error
(
args
...
interface
{})
{
logger
.
Log
(
ErrorLevel
,
args
...
)
}
func
(
logger
*
Logger
)
Fatal
(
args
...
interface
{})
{
logger
.
Log
(
FatalLevel
,
args
...
)
logger
.
Exit
(
1
)
}
func
(
logger
*
Logger
)
Panic
(
args
...
interface
{})
{
logger
.
Log
(
PanicLevel
,
args
...
)
}
func
(
logger
*
Logger
)
TraceFn
(
fn
LogFunction
)
{
logger
.
LogFn
(
TraceLevel
,
fn
)
}
func
(
logger
*
Logger
)
DebugFn
(
fn
LogFunction
)
{
logger
.
LogFn
(
DebugLevel
,
fn
)
}
func
(
logger
*
Logger
)
InfoFn
(
fn
LogFunction
)
{
logger
.
LogFn
(
InfoLevel
,
fn
)
}
func
(
logger
*
Logger
)
PrintFn
(
fn
LogFunction
)
{
entry
:=
logger
.
newEntry
()
entry
.
Print
(
fn
()
...
)
logger
.
releaseEntry
(
entry
)
}
func
(
logger
*
Logger
)
WarnFn
(
fn
LogFunction
)
{
logger
.
LogFn
(
WarnLevel
,
fn
)
}
func
(
logger
*
Logger
)
WarningFn
(
fn
LogFunction
)
{
logger
.
WarnFn
(
fn
)
}
func
(
logger
*
Logger
)
ErrorFn
(
fn
LogFunction
)
{
logger
.
LogFn
(
ErrorLevel
,
fn
)
}
func
(
logger
*
Logger
)
FatalFn
(
fn
LogFunction
)
{
logger
.
LogFn
(
FatalLevel
,
fn
)
logger
.
Exit
(
1
)
}
func
(
logger
*
Logger
)
PanicFn
(
fn
LogFunction
)
{
logger
.
LogFn
(
PanicLevel
,
fn
)
}
func
(
logger
*
Logger
)
Logln
(
level
Level
,
args
...
interface
{})
{
if
logger
.
IsLevelEnabled
(
level
)
{
entry
:=
logger
.
newEntry
()
entry
.
Logln
(
level
,
args
...
)
logger
.
releaseEntry
(
entry
)
}
}
func
(
logger
*
Logger
)
Traceln
(
args
...
interface
{})
{
logger
.
Logln
(
TraceLevel
,
args
...
)
}
func
(
logger
*
Logger
)
Debugln
(
args
...
interface
{})
{
logger
.
Logln
(
DebugLevel
,
args
...
)
}
func
(
logger
*
Logger
)
Infoln
(
args
...
interface
{})
{
logger
.
Logln
(
InfoLevel
,
args
...
)
}
func
(
logger
*
Logger
)
Println
(
args
...
interface
{})
{
entry
:=
logger
.
newEntry
()
entry
.
Println
(
args
...
)
logger
.
releaseEntry
(
entry
)
}
func
(
logger
*
Logger
)
Warnln
(
args
...
interface
{})
{
logger
.
Logln
(
WarnLevel
,
args
...
)
}
func
(
logger
*
Logger
)
Warningln
(
args
...
interface
{})
{
logger
.
Warnln
(
args
...
)
}
func
(
logger
*
Logger
)
Errorln
(
args
...
interface
{})
{
logger
.
Logln
(
ErrorLevel
,
args
...
)
}
func
(
logger
*
Logger
)
Fatalln
(
args
...
interface
{})
{
logger
.
Logln
(
FatalLevel
,
args
...
)
logger
.
Exit
(
1
)
}
func
(
logger
*
Logger
)
Panicln
(
args
...
interface
{})
{
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
//write concurrently to a file (within 4k message on Linux).
//In these cases user can choose to disable the lock.
func
(
logger
*
Logger
)
SetNoLock
()
{
logger
.
mu
.
Disable
()
}
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
}
// SetBufferPool sets the logger buffer pool.
func
(
logger
*
Logger
)
SetBufferPool
(
pool
BufferPool
)
{
logger
.
mu
.
Lock
()
defer
logger
.
mu
.
Unlock
()
logger
.
BufferPool
=
pool
}
vendor/github.com/sirupsen/logrus/logrus.go
0 → 100644
View file @
d7e13eb9
package
logrus
import
(
"fmt"
"log"
"strings"
)
// Fields type, used to pass to `WithFields`.
type
Fields
map
[
string
]
interface
{}
// Level type
type
Level
uint32
// Convert the Level to a string. E.g. PanicLevel becomes "panic".
func
(
level
Level
)
String
()
string
{
if
b
,
err
:=
level
.
MarshalText
();
err
==
nil
{
return
string
(
b
)
}
else
{
return
"unknown"
}
}
// ParseLevel takes a string level and returns the Logrus log level constant.
func
ParseLevel
(
lvl
string
)
(
Level
,
error
)
{
switch
strings
.
ToLower
(
lvl
)
{
case
"panic"
:
return
PanicLevel
,
nil
case
"fatal"
:
return
FatalLevel
,
nil
case
"error"
:
return
ErrorLevel
,
nil
case
"warn"
,
"warning"
:
return
WarnLevel
,
nil
case
"info"
:
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
=
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 logrus level %d"
,
level
)
}
// A constant exposing all logging levels
var
AllLevels
=
[]
Level
{
PanicLevel
,
FatalLevel
,
ErrorLevel
,
WarnLevel
,
InfoLevel
,
DebugLevel
,
TraceLevel
,
}
// These are the different logging levels. You can set the logging level to log
// on your instance of logger, obtained with `logrus.New()`.
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 `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.
// Commonly used for hooks to send errors to an error tracking service.
ErrorLevel
// WarnLevel level. Non-critical entries that deserve eyes.
WarnLevel
// InfoLevel level. General operational entries about what's going on inside the
// application.
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
var
(
_
StdLogger
=
&
log
.
Logger
{}
_
StdLogger
=
&
Entry
{}
_
StdLogger
=
&
Logger
{}
)
// StdLogger is what your logrus-enabled library should take, that way
// it'll accept a stdlib logger and a logrus logger. There's no standard
// interface, this is the closest we get, unfortunately.
type
StdLogger
interface
{
Print
(
...
interface
{})
Printf
(
string
,
...
interface
{})
Println
(
...
interface
{})
Fatal
(
...
interface
{})
Fatalf
(
string
,
...
interface
{})
Fatalln
(
...
interface
{})
Panic
(
...
interface
{})
Panicf
(
string
,
...
interface
{})
Panicln
(
...
interface
{})
}
// The FieldLogger interface generalizes the Entry and Logger types
type
FieldLogger
interface
{
WithField
(
key
string
,
value
interface
{})
*
Entry
WithFields
(
fields
Fields
)
*
Entry
WithError
(
err
error
)
*
Entry
Debugf
(
format
string
,
args
...
interface
{})
Infof
(
format
string
,
args
...
interface
{})
Printf
(
format
string
,
args
...
interface
{})
Warnf
(
format
string
,
args
...
interface
{})
Warningf
(
format
string
,
args
...
interface
{})
Errorf
(
format
string
,
args
...
interface
{})
Fatalf
(
format
string
,
args
...
interface
{})
Panicf
(
format
string
,
args
...
interface
{})
Debug
(
args
...
interface
{})
Info
(
args
...
interface
{})
Print
(
args
...
interface
{})
Warn
(
args
...
interface
{})
Warning
(
args
...
interface
{})
Error
(
args
...
interface
{})
Fatal
(
args
...
interface
{})
Panic
(
args
...
interface
{})
Debugln
(
args
...
interface
{})
Infoln
(
args
...
interface
{})
Println
(
args
...
interface
{})
Warnln
(
args
...
interface
{})
Warningln
(
args
...
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
{})
}
vendor/github.com/sirupsen/logrus/terminal_check_appengine.go
0 → 100644
View file @
d7e13eb9
// +build appengine
package
logrus
import
(
"io"
)
func
checkIfTerminal
(
w
io
.
Writer
)
bool
{
return
true
}
vendor/github.com/sirupsen/logrus/terminal_check_bsd.go
0 → 100644
View file @
d7e13eb9
// +build darwin dragonfly freebsd netbsd openbsd
// +build !js
package
logrus
import
"golang.org/x/sys/unix"
const
ioctlReadTermios
=
unix
.
TIOCGETA
func
isTerminal
(
fd
int
)
bool
{
_
,
err
:=
unix
.
IoctlGetTermios
(
fd
,
ioctlReadTermios
)
return
err
==
nil
}
vendor/github.com/sirupsen/logrus/terminal_check_js.go
0 → 100644
View file @
d7e13eb9
// +build js
package
logrus
func
isTerminal
(
fd
int
)
bool
{
return
false
}
vendor/github.com/sirupsen/logrus/terminal_check_no_terminal.go
0 → 100644
View file @
d7e13eb9
// +build js nacl plan9
package
logrus
import
(
"io"
)
func
checkIfTerminal
(
w
io
.
Writer
)
bool
{
return
false
}
vendor/github.com/sirupsen/logrus/terminal_check_notappengine.go
0 → 100644
View file @
d7e13eb9
// +build !appengine,!js,!windows,!nacl,!plan9
package
logrus
import
(
"io"
"os"
)
func
checkIfTerminal
(
w
io
.
Writer
)
bool
{
switch
v
:=
w
.
(
type
)
{
case
*
os
.
File
:
return
isTerminal
(
int
(
v
.
Fd
()))
default
:
return
false
}
}
vendor/github.com/sirupsen/logrus/terminal_check_solaris.go
0 → 100644
View file @
d7e13eb9
package
logrus
import
(
"golang.org/x/sys/unix"
)
// IsTerminal returns true if the given file descriptor is a terminal.
func
isTerminal
(
fd
int
)
bool
{
_
,
err
:=
unix
.
IoctlGetTermio
(
fd
,
unix
.
TCGETA
)
return
err
==
nil
}
vendor/github.com/sirupsen/logrus/terminal_check_unix.go
0 → 100644
View file @
d7e13eb9
// +build linux aix zos
// +build !js
package
logrus
import
"golang.org/x/sys/unix"
const
ioctlReadTermios
=
unix
.
TCGETS
func
isTerminal
(
fd
int
)
bool
{
_
,
err
:=
unix
.
IoctlGetTermios
(
fd
,
ioctlReadTermios
)
return
err
==
nil
}
vendor/github.com/sirupsen/logrus/terminal_check_windows.go
0 → 100644
View file @
d7e13eb9
// +build !appengine,!js,windows
package
logrus
import
(
"io"
"os"
"golang.org/x/sys/windows"
)
func
checkIfTerminal
(
w
io
.
Writer
)
bool
{
switch
v
:=
w
.
(
type
)
{
case
*
os
.
File
:
handle
:=
windows
.
Handle
(
v
.
Fd
())
var
mode
uint32
if
err
:=
windows
.
GetConsoleMode
(
handle
,
&
mode
);
err
!=
nil
{
return
false
}
mode
|=
windows
.
ENABLE_VIRTUAL_TERMINAL_PROCESSING
if
err
:=
windows
.
SetConsoleMode
(
handle
,
mode
);
err
!=
nil
{
return
false
}
return
true
}
return
false
}
vendor/github.com/sirupsen/logrus/text_formatter.go
0 → 100644
View file @
d7e13eb9
package
logrus
import
(
"bytes"
"fmt"
"os"
"runtime"
"sort"
"strconv"
"strings"
"sync"
"time"
"unicode/utf8"
)
const
(
red
=
31
yellow
=
33
blue
=
36
gray
=
37
)
var
baseTimestamp
time
.
Time
func
init
()
{
baseTimestamp
=
time
.
Now
()
}
// TextFormatter formats logs into text
type
TextFormatter
struct
{
// Set to true to bypass checking for a TTY before outputting colors.
ForceColors
bool
// Force disabling colors.
DisableColors
bool
// Force quoting of all values
ForceQuote
bool
// DisableQuote disables quoting for all values.
// DisableQuote will have a lower priority than ForceQuote.
// If both of them are set to true, quote will be forced on all values.
DisableQuote
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
// Enable logging the full timestamp when a TTY is attached instead of just
// the time passed since beginning of execution.
FullTimestamp
bool
// TimestampFormat to use for display when a full timestamp is printed.
// The format to use is the same than for time.Format or time.Parse from the standard
// library.
// The standard Library already provides a set of predefined format.
TimestampFormat
string
// The fields are sorted by default for a consistent output. For applications
// that log extremely frequently and don't use the JSON formatter this may not
// 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
// PadLevelText Adds padding the level text so that all the levels output at the same length
// PadLevelText is a superset of the DisableLevelTruncation option
PadLevelText
bool
// QuoteEmptyFields will wrap empty fields in quotes if true
QuoteEmptyFields
bool
// Whether the logger's out is to a terminal
isTerminal
bool
// 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
// CallerPrettyfier can be set by the user to modify the content
// of the function and file keys in the data when ReportCaller is
// activated. If any of the returned value is the empty string the
// corresponding key will be removed from fields.
CallerPrettyfier
func
(
*
runtime
.
Frame
)
(
function
string
,
file
string
)
terminalInitOnce
sync
.
Once
// The max length of the level text, generated dynamically on init
levelTextMaxLength
int
}
func
(
f
*
TextFormatter
)
init
(
entry
*
Entry
)
{
if
entry
.
Logger
!=
nil
{
f
.
isTerminal
=
checkIfTerminal
(
entry
.
Logger
.
Out
)
}
// Get the max length of the level text
for
_
,
level
:=
range
AllLevels
{
levelTextLength
:=
utf8
.
RuneCount
([]
byte
(
level
.
String
()))
if
levelTextLength
>
f
.
levelTextMaxLength
{
f
.
levelTextMaxLength
=
levelTextLength
}
}
}
func
(
f
*
TextFormatter
)
isColored
()
bool
{
isColored
:=
f
.
ForceColors
||
(
f
.
isTerminal
&&
(
runtime
.
GOOS
!=
"windows"
))
if
f
.
EnvironmentOverrideColors
{
switch
force
,
ok
:=
os
.
LookupEnv
(
"CLICOLOR_FORCE"
);
{
case
ok
&&
force
!=
"0"
:
isColored
=
true
case
ok
&&
force
==
"0"
,
os
.
Getenv
(
"CLICOLOR"
)
==
"0"
:
isColored
=
false
}
}
return
isColored
&&
!
f
.
DisableColors
}
// Format renders a single log entry
func
(
f
*
TextFormatter
)
Format
(
entry
*
Entry
)
([]
byte
,
error
)
{
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
)
}
var
funcVal
,
fileVal
string
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
()
{
if
f
.
CallerPrettyfier
!=
nil
{
funcVal
,
fileVal
=
f
.
CallerPrettyfier
(
entry
.
Caller
)
}
else
{
funcVal
=
entry
.
Caller
.
Function
fileVal
=
fmt
.
Sprintf
(
"%s:%d"
,
entry
.
Caller
.
File
,
entry
.
Caller
.
Line
)
}
if
funcVal
!=
""
{
fixedKeys
=
append
(
fixedKeys
,
f
.
FieldMap
.
resolve
(
FieldKeyFunc
))
}
if
fileVal
!=
""
{
fixedKeys
=
append
(
fixedKeys
,
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
{}
}
f
.
terminalInitOnce
.
Do
(
func
()
{
f
.
init
(
entry
)
})
timestampFormat
:=
f
.
TimestampFormat
if
timestampFormat
==
""
{
timestampFormat
=
defaultTimestampFormat
}
if
f
.
isColored
()
{
f
.
printColored
(
b
,
entry
,
keys
,
data
,
timestampFormat
)
}
else
{
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
=
funcVal
case
key
==
f
.
FieldMap
.
resolve
(
FieldKeyFile
)
&&
entry
.
HasCaller
()
:
value
=
fileVal
default
:
value
=
data
[
key
]
}
f
.
appendKeyValue
(
b
,
key
,
value
)
}
}
b
.
WriteByte
(
'\n'
)
return
b
.
Bytes
(),
nil
}
func
(
f
*
TextFormatter
)
printColored
(
b
*
bytes
.
Buffer
,
entry
*
Entry
,
keys
[]
string
,
data
Fields
,
timestampFormat
string
)
{
var
levelColor
int
switch
entry
.
Level
{
case
DebugLevel
,
TraceLevel
:
levelColor
=
gray
case
WarnLevel
:
levelColor
=
yellow
case
ErrorLevel
,
FatalLevel
,
PanicLevel
:
levelColor
=
red
case
InfoLevel
:
levelColor
=
blue
default
:
levelColor
=
blue
}
levelText
:=
strings
.
ToUpper
(
entry
.
Level
.
String
())
if
!
f
.
DisableLevelTruncation
&&
!
f
.
PadLevelText
{
levelText
=
levelText
[
0
:
4
]
}
if
f
.
PadLevelText
{
// Generates the format string used in the next line, for example "%-6s" or "%-7s".
// Based on the max level text length.
formatString
:=
"%-"
+
strconv
.
Itoa
(
f
.
levelTextMaxLength
)
+
"s"
// Formats the level text by appending spaces up to the max length, for example:
// - "INFO "
// - "WARNING"
levelText
=
fmt
.
Sprintf
(
formatString
,
levelText
)
}
// 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
()
{
funcVal
:=
fmt
.
Sprintf
(
"%s()"
,
entry
.
Caller
.
Function
)
fileVal
:=
fmt
.
Sprintf
(
"%s:%d"
,
entry
.
Caller
.
File
,
entry
.
Caller
.
Line
)
if
f
.
CallerPrettyfier
!=
nil
{
funcVal
,
fileVal
=
f
.
CallerPrettyfier
(
entry
.
Caller
)
}
if
fileVal
==
""
{
caller
=
funcVal
}
else
if
funcVal
==
""
{
caller
=
fileVal
}
else
{
caller
=
fileVal
+
" "
+
funcVal
}
}
switch
{
case
f
.
DisableTimestamp
:
fmt
.
Fprintf
(
b
,
"
\x1b
[%dm%s
\x1b
[0m%s %-44s "
,
levelColor
,
levelText
,
caller
,
entry
.
Message
)
case
!
f
.
FullTimestamp
:
fmt
.
Fprintf
(
b
,
"
\x1b
[%dm%s
\x1b
[0m[%04d]%s %-44s "
,
levelColor
,
levelText
,
int
(
entry
.
Time
.
Sub
(
baseTimestamp
)
/
time
.
Second
),
caller
,
entry
.
Message
)
default
:
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
:=
data
[
k
]
fmt
.
Fprintf
(
b
,
"
\x1b
[%dm%s
\x1b
[0m="
,
levelColor
,
k
)
f
.
appendValue
(
b
,
v
)
}
}
func
(
f
*
TextFormatter
)
needsQuoting
(
text
string
)
bool
{
if
f
.
ForceQuote
{
return
true
}
if
f
.
QuoteEmptyFields
&&
len
(
text
)
==
0
{
return
true
}
if
f
.
DisableQuote
{
return
false
}
for
_
,
ch
:=
range
text
{
if
!
((
ch
>=
'a'
&&
ch
<=
'z'
)
||
(
ch
>=
'A'
&&
ch
<=
'Z'
)
||
(
ch
>=
'0'
&&
ch
<=
'9'
)
||
ch
==
'-'
||
ch
==
'.'
||
ch
==
'_'
||
ch
==
'/'
||
ch
==
'@'
||
ch
==
'^'
||
ch
==
'+'
)
{
return
true
}
}
return
false
}
func
(
f
*
TextFormatter
)
appendKeyValue
(
b
*
bytes
.
Buffer
,
key
string
,
value
interface
{})
{
if
b
.
Len
()
>
0
{
b
.
WriteByte
(
' '
)
}
b
.
WriteString
(
key
)
b
.
WriteByte
(
'='
)
f
.
appendValue
(
b
,
value
)
}
func
(
f
*
TextFormatter
)
appendValue
(
b
*
bytes
.
Buffer
,
value
interface
{})
{
stringVal
,
ok
:=
value
.
(
string
)
if
!
ok
{
stringVal
=
fmt
.
Sprint
(
value
)
}
if
!
f
.
needsQuoting
(
stringVal
)
{
b
.
WriteString
(
stringVal
)
}
else
{
b
.
WriteString
(
fmt
.
Sprintf
(
"%q"
,
stringVal
))
}
}
Prev
1
…
11
12
13
14
15
16
17
18
Next
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment