diff --git a/mackerel.go b/mackerel.go index cbf8696..704ab32 100644 --- a/mackerel.go +++ b/mackerel.go @@ -24,6 +24,10 @@ type Client struct { UserAgent string AdditionalHeaders http.Header HTTPClient *http.Client + + // Logger specifies an optional logger. + // If nil, logging is done via the log package's standard logger. + Logger *log.Logger } // NewClient returns new mackerel.Client @@ -40,7 +44,7 @@ func NewClientWithOptions(apikey string, rawurl string, verbose bool) (*Client, } client := &http.Client{} client.Timeout = apiRequestTimeout - return &Client{u, apikey, verbose, defaultUserAgent, http.Header{}, client}, nil + return &Client{u, apikey, verbose, defaultUserAgent, http.Header{}, client, nil}, nil } func (c *Client) urlFor(path string) *url.URL { @@ -69,10 +73,15 @@ func (c *Client) buildReq(req *http.Request) *http.Request { func (c *Client) Request(req *http.Request) (resp *http.Response, err error) { req = c.buildReq(req) + logPrintf := log.Printf + if c.Logger != nil { + logPrintf = c.Logger.Printf + } + if c.Verbose { dump, err := httputil.DumpRequest(req, true) if err == nil { - log.Printf("%s", dump) + logPrintf("%s", dump) } } @@ -83,7 +92,7 @@ func (c *Client) Request(req *http.Request) (resp *http.Response, err error) { if c.Verbose { dump, err := httputil.DumpResponse(resp, true) if err == nil { - log.Printf("%s", dump) + logPrintf("%s", dump) } } if resp.StatusCode < 200 || resp.StatusCode > 299 { diff --git a/mackerel_test.go b/mackerel_test.go index ad9fa60..e16b2d1 100644 --- a/mackerel_test.go +++ b/mackerel_test.go @@ -1,8 +1,11 @@ package mackerel import ( + "bytes" + "log" "net/http" "net/http/httptest" + "strings" "testing" ) @@ -57,3 +60,20 @@ func TestBuildReq(t *testing.T) { t.Errorf("X-Revision should be '%s' but %s", xRev, h) } } + +func TestLogger(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(func(res http.ResponseWriter, req *http.Request) { + res.Write([]byte("OK")) + })) + defer ts.Close() + + client, _ := NewClientWithOptions("dummy-key", ts.URL, true) + var buf bytes.Buffer + client.Logger = log.New(&buf, "", 0) + req, _ := http.NewRequest("GET", client.urlFor("/").String(), nil) + client.Request(req) + s := strings.TrimSpace(buf.String()) + if !strings.HasPrefix(s, "") || !strings.HasSuffix(s, "OK") { + t.Errorf("verbose log should match /.*OK/; but %s", s) + } +}