diff --git a/go.mod b/go.mod index 187f4e89..1ee49c53 100644 --- a/go.mod +++ b/go.mod @@ -15,7 +15,7 @@ require ( github.com/pivotal-cf-experimental/warrant v0.0.0-20211122194707-17385443920f github.com/pivotal-cf/uaa-sso-golang v0.0.0-20141119184546-0b91e8ad4bb6 github.com/pivotal-golang/conceal v0.0.0-20141120010127-31656578115c - github.com/pivotal-golang/lager v0.0.0-20150428205713-c88fa6d6c4d2 + github.com/pivotal-golang/lager v2.0.0+incompatible github.com/rcrowley/go-metrics v0.0.0-20180125231941-8732c616f529 github.com/rubenv/sql-migrate v0.0.0-20150713140751-53184e1edfb4 github.com/ryanmoran/stack v0.0.0-20140916210556-3debe7a5953a @@ -26,6 +26,7 @@ require ( require ( bitbucket.org/chrj/smtpd v0.0.0-20170817182725-9ddcdbda0f7a // indirect + code.cloudfoundry.org/lager v2.0.0+incompatible // indirect github.com/andybalholm/cascadia v1.3.1 // indirect github.com/dgrijalva/jwt-go v3.2.1-0.20210802184156-9742bd7fca1c+incompatible // indirect github.com/go-logr/logr v1.2.4 // indirect diff --git a/go.sum b/go.sum index 38ba5ee8..ea4e2bb6 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,7 @@ bitbucket.org/chrj/smtpd v0.0.0-20170817182725-9ddcdbda0f7a h1:qPZv7NxewNKcHj/TvDO1RbRVGgbsIdzkj4O+9q/5cz4= bitbucket.org/chrj/smtpd v0.0.0-20170817182725-9ddcdbda0f7a/go.mod h1:rmAH0EKvCdvvOZLc6nphIlzAxGW3Y0Dz0PLoXCJ2YO8= +code.cloudfoundry.org/lager v2.0.0+incompatible h1:WZwDKDB2PLd/oL+USK4b4aEjUymIej9My2nUQ9oWEwQ= +code.cloudfoundry.org/lager v2.0.0+incompatible/go.mod h1:O2sS7gKP3HM2iemG+EnwvyNQK7pTSC6Foi4QiMp9sSk= github.com/DATA-DOG/go-sqlmock v0.0.0-20180221072120-a6b4b164c6d1 h1:VCMK4Ry+CJWJeKkda76Nmffpwe5ECtkcpqN0TsRSQxM= github.com/DATA-DOG/go-sqlmock v0.0.0-20180221072120-a6b4b164c6d1/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= github.com/PuerkitoBio/goquery v1.8.1 h1:uQxhNlArOIdbrH1tr0UXwdVFgDcZDrZVdcpygAcwmWM= @@ -80,8 +82,8 @@ github.com/pivotal-cf/uaa-sso-golang v0.0.0-20141119184546-0b91e8ad4bb6 h1:VIZLj github.com/pivotal-cf/uaa-sso-golang v0.0.0-20141119184546-0b91e8ad4bb6/go.mod h1:x46WK+FVJdMtvVKBfTAt3fY2EZg/KLS3XXSzx1SAF+I= github.com/pivotal-golang/conceal v0.0.0-20141120010127-31656578115c h1:reyrySYbaC7Gqj8x2Ko7pjglufeYH0UjxBbimAGVsDM= github.com/pivotal-golang/conceal v0.0.0-20141120010127-31656578115c/go.mod h1:Kw/kMv1fNuHwfszQT6ZI0ClXyVdezduXsKd/70TUSjc= -github.com/pivotal-golang/lager v0.0.0-20150428205713-c88fa6d6c4d2 h1:5mfs0yZ4ijQYZr5DDwhwbzjAEqdbvFOoePnDg3w+erU= -github.com/pivotal-golang/lager v0.0.0-20150428205713-c88fa6d6c4d2/go.mod h1:EJZBAWMz/TvxVfLaBRwCv+gszrSByWbqQBRwfVbUhvM= +github.com/pivotal-golang/lager v2.0.0+incompatible h1:RJfBQxoH+1xT8GfxIaMNq+FMcYqx50fKdq7MUkuKzv0= +github.com/pivotal-golang/lager v2.0.0+incompatible/go.mod h1:EJZBAWMz/TvxVfLaBRwCv+gszrSByWbqQBRwfVbUhvM= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/rcrowley/go-metrics v0.0.0-20180125231941-8732c616f529 h1:QdrarV+Ze3cQpiZZ410O4mpB0WUdOgMc3Rwu8zOmLVg= diff --git a/vendor/github.com/pivotal-golang/lager/LICENSE b/vendor/github.com/pivotal-golang/lager/LICENSE index 5c304d1a..f49a4e16 100644 --- a/vendor/github.com/pivotal-golang/lager/LICENSE +++ b/vendor/github.com/pivotal-golang/lager/LICENSE @@ -1,4 +1,4 @@ -Apache License + Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ @@ -178,7 +178,7 @@ Apache License APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" + boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a @@ -186,7 +186,7 @@ Apache License same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright {yyyy} {name of copyright owner} + Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -198,4 +198,4 @@ Apache License distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and - limitations under the License. + limitations under the License. \ No newline at end of file diff --git a/vendor/github.com/pivotal-golang/lager/NOTICE b/vendor/github.com/pivotal-golang/lager/NOTICE new file mode 100644 index 00000000..3c8dd5b6 --- /dev/null +++ b/vendor/github.com/pivotal-golang/lager/NOTICE @@ -0,0 +1,20 @@ +Copyright (c) 2015-Present CloudFoundry.org Foundation, Inc. All Rights Reserved. + +This project contains software that is Copyright (c) 2014-2015 Pivotal Software, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +This project may include a number of subcomponents with separate +copyright notices and license terms. Your use of these subcomponents +is subject to the terms and conditions of each subcomponent's license, +as noted in the LICENSE file. diff --git a/vendor/github.com/pivotal-golang/lager/README.md b/vendor/github.com/pivotal-golang/lager/README.md index a5ea5e01..c9f28cc6 100644 --- a/vendor/github.com/pivotal-golang/lager/README.md +++ b/vendor/github.com/pivotal-golang/lager/README.md @@ -1,6 +1,8 @@ lager ===== +**Note**: This repository should be imported as `code.cloudfoundry.org/lager`. + Lager is a logging library for go. ## Usage @@ -9,7 +11,7 @@ Instantiate a logger with the name of your component. ```go import ( - "github.com/pivotal-golang/lager" + "code.cloudfoundry.org/lager" ) logger := lager.NewLogger("my-app") @@ -31,7 +33,7 @@ logger.RegisterSink(lager.NewWriterSink(myWriter, lager.INFO)) Lager supports the usual level-based logging, with an optional argument for arbitrary key-value data. ```go -logger.Info("doing-stuff", logger.Data{ +logger.Info("doing-stuff", lager.Data{ "informative": true, }) ``` @@ -58,7 +60,7 @@ You can avoid repetition of contextual data using 'Sessions': ```go -contextualLogger := logger.Session("my-task", logger.Data{ +contextualLogger := logger.Session("my-task", lager.Data{ "request-id": 5, }) @@ -73,4 +75,4 @@ output: ## License -Lager is [Apache 2.0](https://github.com/pivotal-golang/lager/blob/master/LICENSE) licensed. +Lager is [Apache 2.0](https://github.com/cloudfoundry/lager/blob/master/LICENSE) licensed. diff --git a/vendor/github.com/pivotal-golang/lager/json_redacter.go b/vendor/github.com/pivotal-golang/lager/json_redacter.go new file mode 100644 index 00000000..12263c64 --- /dev/null +++ b/vendor/github.com/pivotal-golang/lager/json_redacter.go @@ -0,0 +1,111 @@ +package lager + +import ( + "encoding/json" + "regexp" +) + +const awsAccessKeyIDPattern = `AKIA[A-Z0-9]{16}` +const awsSecretAccessKeyPattern = `KEY["']?\s*(?::|=>|=)\s*["']?[A-Z0-9/\+=]{40}["']?` +const cryptMD5Pattern = `\$1\$[A-Z0-9./]{1,16}\$[A-Z0-9./]{22}` +const cryptSHA256Pattern = `\$5\$[A-Z0-9./]{1,16}\$[A-Z0-9./]{43}` +const cryptSHA512Pattern = `\$6\$[A-Z0-9./]{1,16}\$[A-Z0-9./]{86}` +const privateKeyHeaderPattern = `-----BEGIN(.*)PRIVATE KEY-----` + +type JSONRedacter struct { + keyMatchers []*regexp.Regexp + valueMatchers []*regexp.Regexp +} + +func NewJSONRedacter(keyPatterns []string, valuePatterns []string) (*JSONRedacter, error) { + if keyPatterns == nil { + keyPatterns = []string{"[Pp]wd", "[Pp]ass"} + } + if valuePatterns == nil { + valuePatterns = []string{awsAccessKeyIDPattern, awsSecretAccessKeyPattern, cryptMD5Pattern, cryptSHA256Pattern, cryptSHA512Pattern, privateKeyHeaderPattern} + } + ret := &JSONRedacter{} + for _, v := range keyPatterns { + r, err := regexp.Compile(v) + if err != nil { + return nil, err + } + ret.keyMatchers = append(ret.keyMatchers, r) + } + for _, v := range valuePatterns { + r, err := regexp.Compile(v) + if err != nil { + return nil, err + } + ret.valueMatchers = append(ret.valueMatchers, r) + } + return ret, nil +} + +func (r JSONRedacter) Redact(data []byte) []byte { + var jsonBlob interface{} + err := json.Unmarshal(data, &jsonBlob) + if err != nil { + return handleError(err) + } + r.redactValue(&jsonBlob) + + data, err = json.Marshal(jsonBlob) + if err != nil { + return handleError(err) + } + + return data +} + +func (r JSONRedacter) redactValue(data *interface{}) interface{} { + if data == nil { + return data + } + + if a, ok := (*data).([]interface{}); ok { + r.redactArray(&a) + } else if m, ok := (*data).(map[string]interface{}); ok { + r.redactObject(&m) + } else if s, ok := (*data).(string); ok { + for _, m := range r.valueMatchers { + if m.MatchString(s) { + (*data) = "*REDACTED*" + break + } + } + } + return (*data) +} + +func (r JSONRedacter) redactArray(data *[]interface{}) { + for i, _ := range *data { + r.redactValue(&((*data)[i])) + } +} + +func (r JSONRedacter) redactObject(data *map[string]interface{}) { + for k, v := range *data { + for _, m := range r.keyMatchers { + if m.MatchString(k) { + (*data)[k] = "*REDACTED*" + break + } + } + if (*data)[k] != "*REDACTED*" { + (*data)[k] = r.redactValue(&v) + } + } +} + +func handleError(err error) []byte { + var content []byte + if _, ok := err.(*json.UnsupportedTypeError); ok { + data := map[string]interface{}{"lager serialisation error": err.Error()} + content, err = json.Marshal(data) + } + if err != nil { + panic(err) + } + return content +} diff --git a/vendor/github.com/pivotal-golang/lager/logger.go b/vendor/github.com/pivotal-golang/lager/logger.go index 7fee372d..6167220f 100644 --- a/vendor/github.com/pivotal-golang/lager/logger.go +++ b/vendor/github.com/pivotal-golang/lager/logger.go @@ -7,7 +7,7 @@ import ( "time" ) -const STACK_TRACE_BUFFER_SIZE = 1024 * 100 +const StackTraceBufferSize = 1024 * 100 type Logger interface { RegisterSink(Sink) @@ -25,7 +25,7 @@ type logger struct { task string sinks []Sink sessionID string - nextSession uint64 + nextSession uint32 data Data } @@ -47,7 +47,7 @@ func (l *logger) SessionName() string { } func (l *logger) Session(task string, data ...Data) Logger { - sid := atomic.AddUint64(&l.nextSession, 1) + sid := atomic.AddUint32(&l.nextSession, 1) var sessionIDstr string @@ -77,8 +77,10 @@ func (l *logger) WithData(data Data) Logger { } func (l *logger) Debug(action string, data ...Data) { + t := time.Now().UTC() log := LogFormat{ - Timestamp: currentTimestamp(), + time: t, + Timestamp: formatTimestamp(t), Source: l.component, Message: fmt.Sprintf("%s.%s", l.task, action), LogLevel: DEBUG, @@ -86,13 +88,15 @@ func (l *logger) Debug(action string, data ...Data) { } for _, sink := range l.sinks { - sink.Log(DEBUG, log.ToJSON()) + sink.Log(log) } } func (l *logger) Info(action string, data ...Data) { + t := time.Now().UTC() log := LogFormat{ - Timestamp: currentTimestamp(), + time: t, + Timestamp: formatTimestamp(t), Source: l.component, Message: fmt.Sprintf("%s.%s", l.task, action), LogLevel: INFO, @@ -100,7 +104,7 @@ func (l *logger) Info(action string, data ...Data) { } for _, sink := range l.sinks { - sink.Log(INFO, log.ToJSON()) + sink.Log(log) } } @@ -111,23 +115,26 @@ func (l *logger) Error(action string, err error, data ...Data) { logData["error"] = err.Error() } + t := time.Now().UTC() log := LogFormat{ - Timestamp: currentTimestamp(), + time: t, + Timestamp: formatTimestamp(t), Source: l.component, Message: fmt.Sprintf("%s.%s", l.task, action), LogLevel: ERROR, Data: logData, + Error: err, } for _, sink := range l.sinks { - sink.Log(ERROR, log.ToJSON()) + sink.Log(log) } } func (l *logger) Fatal(action string, err error, data ...Data) { logData := l.baseData(data...) - stackTrace := make([]byte, STACK_TRACE_BUFFER_SIZE) + stackTrace := make([]byte, StackTraceBufferSize) stackSize := runtime.Stack(stackTrace, false) stackTrace = stackTrace[:stackSize] @@ -137,16 +144,19 @@ func (l *logger) Fatal(action string, err error, data ...Data) { logData["trace"] = string(stackTrace) + t := time.Now().UTC() log := LogFormat{ - Timestamp: currentTimestamp(), + time: t, + Timestamp: formatTimestamp(t), Source: l.component, Message: fmt.Sprintf("%s.%s", l.task, action), LogLevel: FATAL, Data: logData, + Error: err, } for _, sink := range l.sinks { - sink.Log(FATAL, log.ToJSON()) + sink.Log(log) } panic(err) @@ -174,6 +184,6 @@ func (l *logger) baseData(givenData ...Data) Data { return data } -func currentTimestamp() string { - return fmt.Sprintf("%.9f", float64(time.Now().UnixNano())/1e9) +func formatTimestamp(t time.Time) string { + return fmt.Sprintf("%.9f", float64(t.UnixNano())/1e9) } diff --git a/vendor/github.com/pivotal-golang/lager/models.go b/vendor/github.com/pivotal-golang/lager/models.go index 94c0dac4..6571a4b0 100644 --- a/vendor/github.com/pivotal-golang/lager/models.go +++ b/vendor/github.com/pivotal-golang/lager/models.go @@ -1,6 +1,12 @@ package lager -import "encoding/json" +import ( + "encoding/json" + "fmt" + "strconv" + "strings" + "time" +) type LogLevel int @@ -11,20 +17,130 @@ const ( FATAL ) +var logLevelStr = [...]string{ + DEBUG: "debug", + INFO: "info", + ERROR: "error", + FATAL: "fatal", +} + +func (l LogLevel) String() string { + if DEBUG <= l && l <= FATAL { + return logLevelStr[l] + } + return "invalid" +} + +func LogLevelFromString(s string) (LogLevel, error) { + for k, v := range logLevelStr { + if v == s { + return LogLevel(k), nil + } + } + return -1, fmt.Errorf("invalid log level: %s", s) +} + type Data map[string]interface{} +type rfc3339Time time.Time + +const rfc3339Nano = "2006-01-02T15:04:05.000000000Z07:00" + +func (t rfc3339Time) MarshalJSON() ([]byte, error) { + stamp := fmt.Sprintf(`"%s"`, time.Time(t).UTC().Format(rfc3339Nano)) + return []byte(stamp), nil +} + +func (t *rfc3339Time) UnmarshalJSON(data []byte) error { + return (*time.Time)(t).UnmarshalJSON(data) +} + type LogFormat struct { Timestamp string `json:"timestamp"` Source string `json:"source"` Message string `json:"message"` LogLevel LogLevel `json:"log_level"` Data Data `json:"data"` + Error error `json:"-"` + time time.Time } func (log LogFormat) ToJSON() []byte { content, err := json.Marshal(log) if err != nil { - panic(err) + log.Data = dataForJSONMarhallingError(err, log.Data) + content, err = json.Marshal(log) + if err != nil { + panic(err) + } } return content } + +func (log LogFormat) toPrettyJSON() []byte { + t := log.time + if t.IsZero() { + t = parseTimestamp(log.Timestamp) + } + + prettyLog := struct { + Timestamp rfc3339Time `json:"timestamp"` + Level string `json:"level"` + Source string `json:"source"` + Message string `json:"message"` + Data Data `json:"data"` + Error error `json:"-"` + }{ + Timestamp: rfc3339Time(t), + Level: log.LogLevel.String(), + Source: log.Source, + Message: log.Message, + Data: log.Data, + Error: log.Error, + } + + content, err := json.Marshal(prettyLog) + + if err != nil { + prettyLog.Data = dataForJSONMarhallingError(err, prettyLog.Data) + content, err = json.Marshal(prettyLog) + if err != nil { + panic(err) + } + } + + return content +} + +func dataForJSONMarhallingError(err error, data Data) Data { + _, ok1 := err.(*json.UnsupportedTypeError) + _, ok2 := err.(*json.MarshalerError) + errKey := "unknown_error" + if ok1 || ok2 { + errKey = "lager serialisation error" + } + + return map[string]interface{}{ + errKey: err.Error(), + "data_dump": fmt.Sprintf("%#v", data), + } +} + +func parseTimestamp(s string) time.Time { + if s == "" { + return time.Now() + } + n := strings.IndexByte(s, '.') + if n <= 0 || n == len(s)-1 { + return time.Now() + } + sec, err := strconv.ParseInt(s[:n], 10, 64) + if err != nil || sec < 0 { + return time.Now() + } + nsec, err := strconv.ParseInt(s[n+1:], 10, 64) + if err != nil || nsec < 0 { + return time.Now() + } + return time.Unix(sec, nsec) +} diff --git a/vendor/github.com/pivotal-golang/lager/package.go b/vendor/github.com/pivotal-golang/lager/package.go new file mode 100644 index 00000000..7e8b063d --- /dev/null +++ b/vendor/github.com/pivotal-golang/lager/package.go @@ -0,0 +1 @@ +package lager // import "code.cloudfoundry.org/lager" diff --git a/vendor/github.com/pivotal-golang/lager/reconfigurable_sink.go b/vendor/github.com/pivotal-golang/lager/reconfigurable_sink.go index 0fc145e4..7c3b228e 100644 --- a/vendor/github.com/pivotal-golang/lager/reconfigurable_sink.go +++ b/vendor/github.com/pivotal-golang/lager/reconfigurable_sink.go @@ -16,14 +16,14 @@ func NewReconfigurableSink(sink Sink, initialMinLogLevel LogLevel) *Reconfigurab } } -func (sink *ReconfigurableSink) Log(level LogLevel, log []byte) { +func (sink *ReconfigurableSink) Log(log LogFormat) { minLogLevel := LogLevel(atomic.LoadInt32(&sink.minLogLevel)) - if level < minLogLevel { + if log.LogLevel < minLogLevel { return } - sink.sink.Log(level, log) + sink.sink.Log(log) } func (sink *ReconfigurableSink) SetMinLevel(level LogLevel) { diff --git a/vendor/github.com/pivotal-golang/lager/redacting_sink.go b/vendor/github.com/pivotal-golang/lager/redacting_sink.go new file mode 100644 index 00000000..17a30295 --- /dev/null +++ b/vendor/github.com/pivotal-golang/lager/redacting_sink.go @@ -0,0 +1,62 @@ +package lager + +import ( + "encoding/json" +) + +type redactingSink struct { + sink Sink + jsonRedacter *JSONRedacter +} + +// NewRedactingSink creates a sink that redacts sensitive information from the +// data field. The old behavior of NewRedactingWriterSink (which was removed +// in v2) can be obtained using the following code: +// +// redactingSink, err := NewRedactingSink( +// NewWriterSink(writer, minLogLevel), +// keyPatterns, +// valuePatterns, +// ) +// +// if err != nil { +// return nil, err +// } +// +// return NewReconfigurableSink( +// redactingSink, +// minLogLevel, +// ), nil +// +func NewRedactingSink(sink Sink, keyPatterns []string, valuePatterns []string) (Sink, error) { + jsonRedacter, err := NewJSONRedacter(keyPatterns, valuePatterns) + if err != nil { + return nil, err + } + + return &redactingSink{ + sink: sink, + jsonRedacter: jsonRedacter, + }, nil +} + +func (sink *redactingSink) Log(log LogFormat) { + rawJSON, err := json.Marshal(log.Data) + if err != nil { + log.Data = dataForJSONMarhallingError(err, log.Data) + + rawJSON, err = json.Marshal(log.Data) + if err != nil { + panic(err) + } + } + + redactedJSON := sink.jsonRedacter.Redact(rawJSON) + + err = json.Unmarshal(redactedJSON, &log.Data) + if err != nil { + panic(err) + } + + sink.sink.Log(log) +} diff --git a/vendor/github.com/pivotal-golang/lager/writer_sink.go b/vendor/github.com/pivotal-golang/lager/writer_sink.go index 81885f79..bb77d708 100644 --- a/vendor/github.com/pivotal-golang/lager/writer_sink.go +++ b/vendor/github.com/pivotal-golang/lager/writer_sink.go @@ -5,13 +5,11 @@ import ( "sync" ) -const logBufferSize = 1024 - // A Sink represents a write destination for a Logger. It provides // a thread-safe interface for writing logs type Sink interface { //Log to the sink. Best effort -- no need to worry about errors. - Log(level LogLevel, payload []byte) + Log(LogFormat) } type writerSink struct { @@ -28,13 +26,37 @@ func NewWriterSink(writer io.Writer, minLogLevel LogLevel) Sink { } } -func (sink *writerSink) Log(level LogLevel, log []byte) { - if level < sink.minLogLevel { +func (sink *writerSink) Log(log LogFormat) { + if log.LogLevel < sink.minLogLevel { + return + } + + sink.writeL.Lock() + sink.writer.Write(log.ToJSON()) + sink.writer.Write([]byte("\n")) + sink.writeL.Unlock() +} + +type prettySink struct { + writer io.Writer + minLogLevel LogLevel + writeL sync.Mutex +} + +func NewPrettySink(writer io.Writer, minLogLevel LogLevel) Sink { + return &prettySink{ + writer: writer, + minLogLevel: minLogLevel, + } +} + +func (sink *prettySink) Log(log LogFormat) { + if log.LogLevel < sink.minLogLevel { return } sink.writeL.Lock() - sink.writer.Write(log) + sink.writer.Write(log.toPrettyJSON()) sink.writer.Write([]byte("\n")) sink.writeL.Unlock() } diff --git a/vendor/modules.txt b/vendor/modules.txt index 84c08c41..a37be536 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -1,5 +1,7 @@ # bitbucket.org/chrj/smtpd v0.0.0-20170817182725-9ddcdbda0f7a ## explicit +# code.cloudfoundry.org/lager v2.0.0+incompatible +## explicit # github.com/DATA-DOG/go-sqlmock v0.0.0-20180221072120-a6b4b164c6d1 ## explicit github.com/DATA-DOG/go-sqlmock @@ -105,7 +107,7 @@ github.com/pivotal-cf/uaa-sso-golang/uaa # github.com/pivotal-golang/conceal v0.0.0-20141120010127-31656578115c ## explicit github.com/pivotal-golang/conceal -# github.com/pivotal-golang/lager v0.0.0-20150428205713-c88fa6d6c4d2 +# github.com/pivotal-golang/lager v2.0.0+incompatible ## explicit github.com/pivotal-golang/lager # github.com/rcrowley/go-metrics v0.0.0-20180125231941-8732c616f529