Skip to content

Commit 4453ae0

Browse files
committed
feat: add logger
1 parent 10e25a0 commit 4453ae0

File tree

5 files changed

+86
-5
lines changed

5 files changed

+86
-5
lines changed

client.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,9 @@ func (c *Workwx) WithApp(corpSecret string, agentID int64) *WorkwxApp {
5353
CorpSecret: corpSecret,
5454
AgentID: agentID,
5555

56-
accessToken: &token{mutex: &sync.RWMutex{}},
57-
jsapiTicket: &token{mutex: &sync.RWMutex{}},
58-
jsapiTicketAgentConfig: &token{mutex: &sync.RWMutex{}},
56+
accessToken: &token{mutex: &sync.RWMutex{}, logger: c.opts.Logger},
57+
jsapiTicket: &token{mutex: &sync.RWMutex{}, logger: c.opts.Logger},
58+
jsapiTicketAgentConfig: &token{mutex: &sync.RWMutex{}, logger: c.opts.Logger},
5959
}
6060
app.accessToken.setGetTokenFunc(app.getAccessToken)
6161
app.jsapiTicket.setGetTokenFunc(app.getJSAPITicket)

client_options.go

+22
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ const DefaultQYAPIHost = "https://qyapi.weixin.qq.com"
1010
type options struct {
1111
QYAPIHost string
1212
HTTP *http.Client
13+
Logger Logger
1314
}
1415

1516
// CtorOption 客户端对象构造参数
@@ -22,6 +23,7 @@ func defaultOptions() options {
2223
return options{
2324
QYAPIHost: DefaultQYAPIHost,
2425
HTTP: &http.Client{},
26+
Logger: newDefaultLogger(),
2527
}
2628
}
2729

@@ -62,3 +64,23 @@ var _ CtorOption = (*withHTTPClient)(nil)
6264
func (x *withHTTPClient) applyTo(y *options) {
6365
y.HTTP = x.x
6466
}
67+
68+
//
69+
//
70+
//
71+
72+
type withLogger struct {
73+
x Logger
74+
}
75+
76+
// WithLogger 使用给定的 logger 作为日志打印的方式。如果不使用 WithLogger 自定义 logger,
77+
// 则默认 logger 会将 Info 级别的日志打印在 stdout 中,将 Error 级别的日志打印在 stderr 中。
78+
func WithLogger(logger Logger) CtorOption {
79+
return &withLogger{x: logger}
80+
}
81+
82+
var _ CtorOption = (*withLogger)(nil)
83+
84+
func (x *withLogger) applyTo(y *options) {
85+
y.Logger = x.x
86+
}

client_options_test.go

+27
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package workwx
22

33
import (
4+
"fmt"
45
"net/http"
56
"testing"
67

@@ -52,3 +53,29 @@ func TestWithQYAPIHost(t *testing.T) {
5253
})
5354
})
5455
}
56+
57+
func TestWithLogger(t *testing.T) {
58+
c.Convey("给定一个 options", t, func() {
59+
opts := options{}
60+
61+
c.Convey("用 WithLogger 修饰它", func() {
62+
63+
l := &myLogger{}
64+
o := WithLogger(l)
65+
o.applyTo(&opts)
66+
67+
c.Convey("options.Logger 应该变了", func() {
68+
c.So(opts.Logger, c.ShouldEqual, l)
69+
})
70+
})
71+
})
72+
}
73+
74+
type myLogger struct{}
75+
76+
func (*myLogger) Info(msg string) {
77+
fmt.Println("INFO: " + msg)
78+
}
79+
func (*myLogger) Error(msg string) {
80+
fmt.Println("ERROR: " + msg)
81+
}

logger.go

+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package workwx
2+
3+
import (
4+
"log"
5+
"os"
6+
)
7+
8+
type Logger interface {
9+
Info(msg string)
10+
Error(msg string)
11+
}
12+
13+
type defaultLogger struct {
14+
stderr *log.Logger
15+
stdout *log.Logger
16+
}
17+
18+
func (l *defaultLogger) Info(msg string) {
19+
l.stdout.Println(msg)
20+
}
21+
22+
func (l *defaultLogger) Error(msg string) {
23+
l.stderr.Println(msg)
24+
}
25+
26+
func newDefaultLogger() *defaultLogger {
27+
stderr := log.New(os.Stderr, "[workwx INFO]", 0)
28+
stdout := log.New(os.Stdout, "[workwx ERR]", 0)
29+
return &defaultLogger{stderr: stderr, stdout: stdout}
30+
}

token.go

+4-2
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package workwx
22

33
import (
44
"context"
5+
"fmt"
56
"sync"
67
"time"
78

@@ -18,6 +19,7 @@ type token struct {
1819
tokenInfo
1920
lastRefresh time.Time
2021
getTokenFunc func() (tokenInfo, error)
22+
logger Logger
2123
}
2224

2325
// getAccessToken 获取 access token
@@ -150,8 +152,7 @@ func (t *token) tokenRefresher(ctx context.Context) {
150152
case <-time.After(waitDuration):
151153
retryer := backoff.WithContext(backoff.NewExponentialBackOff(), ctx)
152154
if err := backoff.Retry(t.syncToken, retryer); err != nil {
153-
// TODO: logging
154-
_ = err
155+
t.logger.Error(fmt.Sprintf("failed to refresh token: %v. will retry.", err))
155156
}
156157

157158
waitUntilTime := t.lastRefresh.Add(t.expiresIn).Add(-refreshTimeWindow)
@@ -160,6 +161,7 @@ func (t *token) tokenRefresher(ctx context.Context) {
160161
waitDuration = minRefreshDuration
161162
}
162163
case <-ctx.Done():
164+
t.logger.Info("tokenRefresher terminated")
163165
return
164166
}
165167
}

0 commit comments

Comments
 (0)