summaryrefslogtreecommitdiffstats
path: root/vendor/go.uber.org/zap/writer.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/go.uber.org/zap/writer.go')
-rw-r--r--vendor/go.uber.org/zap/writer.go51
1 files changed, 27 insertions, 24 deletions
diff --git a/vendor/go.uber.org/zap/writer.go b/vendor/go.uber.org/zap/writer.go
index 16f55ce48..86a709ab0 100644
--- a/vendor/go.uber.org/zap/writer.go
+++ b/vendor/go.uber.org/zap/writer.go
@@ -21,21 +21,33 @@
package zap
import (
+ "fmt"
+ "io"
"io/ioutil"
- "os"
"go.uber.org/zap/zapcore"
"go.uber.org/multierr"
)
-// Open is a high-level wrapper that takes a variadic number of paths, opens or
-// creates each of the specified files, and combines them into a locked
+// Open is a high-level wrapper that takes a variadic number of URLs, opens or
+// creates each of the specified resources, and combines them into a locked
// WriteSyncer. It also returns any error encountered and a function to close
// any opened files.
//
-// Passing no paths returns a no-op WriteSyncer. The special paths "stdout" and
-// "stderr" are interpreted as os.Stdout and os.Stderr, respectively.
+// Passing no URLs returns a no-op WriteSyncer. Zap handles URLs without a
+// scheme and URLs with the "file" scheme. Third-party code may register
+// factories for other schemes using RegisterSink.
+//
+// URLs with the "file" scheme must use absolute paths on the local
+// filesystem. No user, password, port, fragments, or query parameters are
+// allowed, and the hostname must be empty or "localhost".
+//
+// Since it's common to write logs to the local filesystem, URLs without a
+// scheme (e.g., "/var/log/foo.log") are treated as local file paths. Without
+// a scheme, the special paths "stdout" and "stderr" are interpreted as
+// os.Stdout and os.Stderr. When specified without a scheme, relative file
+// paths also work.
func Open(paths ...string) (zapcore.WriteSyncer, func(), error) {
writers, close, err := open(paths)
if err != nil {
@@ -47,33 +59,24 @@ func Open(paths ...string) (zapcore.WriteSyncer, func(), error) {
}
func open(paths []string) ([]zapcore.WriteSyncer, func(), error) {
- var openErr error
writers := make([]zapcore.WriteSyncer, 0, len(paths))
- files := make([]*os.File, 0, len(paths))
+ closers := make([]io.Closer, 0, len(paths))
close := func() {
- for _, f := range files {
- f.Close()
+ for _, c := range closers {
+ c.Close()
}
}
+
+ var openErr error
for _, path := range paths {
- switch path {
- case "stdout":
- writers = append(writers, os.Stdout)
- // Don't close standard out.
- continue
- case "stderr":
- writers = append(writers, os.Stderr)
- // Don't close standard error.
+ sink, err := newSink(path)
+ if err != nil {
+ openErr = multierr.Append(openErr, fmt.Errorf("couldn't open sink %q: %v", path, err))
continue
}
- f, err := os.OpenFile(path, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0644)
- openErr = multierr.Append(openErr, err)
- if err == nil {
- writers = append(writers, f)
- files = append(files, f)
- }
+ writers = append(writers, sink)
+ closers = append(closers, sink)
}
-
if openErr != nil {
close()
return writers, nil, openErr