Commit e726dca2 authored by Miek Gieben's avatar Miek Gieben

Fix error reporting (#128)

Put error back in the correct place in the directives.go. Also don't
make it a pointer. If it *is* a pointer the buildstack function does
not correctly set the Next Handler. Don't understand *why* this is
different from Caddy. Anyway this fixes it, with the caveat that
the error log file is now openend earlier in the startup.

Fixes #127
parent a1e6cb7c
...@@ -53,7 +53,9 @@ var directiveOrder = []directive{ ...@@ -53,7 +53,9 @@ var directiveOrder = []directive{
// Directives that inject handlers (middleware) // Directives that inject handlers (middleware)
{"prometheus", setup.Prometheus}, {"prometheus", setup.Prometheus},
{"errors", setup.Errors},
{"log", setup.Log}, {"log", setup.Log},
{"chaos", setup.Chaos}, {"chaos", setup.Chaos},
{"rewrite", setup.Rewrite}, {"rewrite", setup.Rewrite},
{"loadbalance", setup.Loadbalance}, {"loadbalance", setup.Loadbalance},
...@@ -62,7 +64,6 @@ var directiveOrder = []directive{ ...@@ -62,7 +64,6 @@ var directiveOrder = []directive{
{"secondary", setup.Secondary}, {"secondary", setup.Secondary},
{"etcd", setup.Etcd}, {"etcd", setup.Etcd},
{"proxy", setup.Proxy}, {"proxy", setup.Proxy},
{"errors", setup.Errors},
} }
// RegisterDirective adds the given directive to caddy's list of directives. // RegisterDirective adds the given directive to caddy's list of directives.
...@@ -90,5 +91,5 @@ type directive struct { ...@@ -90,5 +91,5 @@ type directive struct {
// SetupFunc takes a controller and may optionally return a middleware. // SetupFunc takes a controller and may optionally return a middleware.
// If the resulting middleware is not nil, it will be chained into // If the resulting middleware is not nil, it will be chained into
// the HTTP handlers in the order specified in this package. // the DNS handlers in the order specified in this package.
type SetupFunc func(c *setup.Controller) (middleware.Middleware, error) type SetupFunc func(c *setup.Controller) (middleware.Middleware, error)
...@@ -5,9 +5,10 @@ import ( ...@@ -5,9 +5,10 @@ import (
"log" "log"
"os" "os"
"github.com/hashicorp/go-syslog"
"github.com/miekg/coredns/middleware" "github.com/miekg/coredns/middleware"
"github.com/miekg/coredns/middleware/errors" "github.com/miekg/coredns/middleware/errors"
"github.com/hashicorp/go-syslog"
) )
// Errors configures a new errors middleware instance. // Errors configures a new errors middleware instance.
...@@ -17,48 +18,42 @@ func Errors(c *Controller) (middleware.Middleware, error) { ...@@ -17,48 +18,42 @@ func Errors(c *Controller) (middleware.Middleware, error) {
return nil, err return nil, err
} }
// Open the log file for writing when the server starts var writer io.Writer
c.Startup = append(c.Startup, func() error {
var err error switch handler.LogFile {
var writer io.Writer case "visible":
handler.Debug = true
switch handler.LogFile { case "stdout":
case "visible": writer = os.Stdout
handler.Debug = true case "stderr":
case "stdout": writer = os.Stderr
writer = os.Stdout case "syslog":
case "stderr": writer, err = gsyslog.NewLogger(gsyslog.LOG_ERR, "LOCAL0", "coredns")
writer = os.Stderr if err != nil {
case "syslog": return nil, err
writer, err = gsyslog.NewLogger(gsyslog.LOG_ERR, "LOCAL0", "coredns") }
if err != nil { default:
return err if handler.LogFile == "" {
} writer = os.Stderr // default
default: break
if handler.LogFile == "" { }
writer = os.Stderr // default
break
}
var file *os.File var file *os.File
file, err = os.OpenFile(handler.LogFile, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0644) file, err = os.OpenFile(handler.LogFile, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0644)
if err != nil { if err != nil {
return err return nil, err
} }
if handler.LogRoller != nil { if handler.LogRoller != nil {
file.Close() file.Close()
handler.LogRoller.Filename = handler.LogFile handler.LogRoller.Filename = handler.LogFile
writer = handler.LogRoller.GetLogWriter() writer = handler.LogRoller.GetLogWriter()
} else { } else {
writer = file writer = file
}
} }
}
handler.Log = log.New(writer, "", 0) handler.Log = log.New(writer, "", 0)
return nil
})
return func(next middleware.Handler) middleware.Handler { return func(next middleware.Handler) middleware.Handler {
handler.Next = next handler.Next = next
...@@ -66,11 +61,8 @@ func Errors(c *Controller) (middleware.Middleware, error) { ...@@ -66,11 +61,8 @@ func Errors(c *Controller) (middleware.Middleware, error) {
}, nil }, nil
} }
func errorsParse(c *Controller) (*errors.ErrorHandler, error) { func errorsParse(c *Controller) (errors.ErrorHandler, error) {
// Very important that we make a pointer because the Startup handler := errors.ErrorHandler{}
// function that opens the log file must have access to the
// same instance of the handler, not a copy.
handler := &errors.ErrorHandler{}
optionalBlock := func() (bool, error) { optionalBlock := func() (bool, error) {
var hadBlock bool var hadBlock bool
......
...@@ -73,7 +73,6 @@ func (e Etcd) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.Msg) (i ...@@ -73,7 +73,6 @@ func (e Etcd) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.Msg) (i
return e.Err(zone, dns.RcodeNameError, state) return e.Err(zone, dns.RcodeNameError, state)
} }
if err != nil { if err != nil {
println("returning error", err.Error())
return dns.RcodeServerFailure, err return dns.RcodeServerFailure, err
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment