diff --git a/.gitignore b/.gitignore index d70873d4d98..81e2de79eb9 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,4 @@ default.pd tags /.retools/ vendor +default* diff --git a/cmd/pd-server/main.go b/cmd/pd-server/main.go index 39c457415ce..8cf1306930c 100644 --- a/cmd/pd-server/main.go +++ b/cmd/pd-server/main.go @@ -16,18 +16,18 @@ package main import ( "context" "flag" - "fmt" "os" "os/signal" "syscall" - "github.com/grpc-ecosystem/go-grpc-prometheus" + grpc_prometheus "github.com/grpc-ecosystem/go-grpc-prometheus" + log "github.com/pingcap/log" "github.com/pingcap/pd/pkg/logutil" "github.com/pingcap/pd/pkg/metricutil" "github.com/pingcap/pd/server" "github.com/pingcap/pd/server/api" "github.com/pkg/errors" - log "github.com/sirupsen/logrus" + "go.uber.org/zap" // Register schedulers. _ "github.com/pingcap/pd/server/schedulers" @@ -41,7 +41,7 @@ func main() { if cfg.Version { server.PrintPDInfo() - os.Exit(0) + exit(0) } defer logutil.LogPanic() @@ -49,14 +49,24 @@ func main() { switch errors.Cause(err) { case nil: case flag.ErrHelp: - os.Exit(0) + exit(0) default: - log.Fatalf("parse cmd flags error: %s\n", fmt.Sprintf("%+v", err)) + log.Fatal("parse cmd flags error", zap.Error(err)) } + // New zap logger + err = cfg.SetupLogger() + if err == nil { + log.ReplaceGlobals(cfg.GetZapLogger(), cfg.GetZapLogProperties()) + } else { + log.Fatal("initialize logger error", zap.Error(err)) + } + // Flushing any buffered log entries + defer log.Sync() + // The old logger err = logutil.InitLogger(&cfg.Log) if err != nil { - log.Fatalf("initialize logger error: %s\n", fmt.Sprintf("%+v", err)) + log.Fatal("initialize logger error", zap.Error(err)) } server.LogPDInfo() @@ -72,15 +82,15 @@ func main() { err = server.PrepareJoinCluster(cfg) if err != nil { - log.Fatal("join error ", fmt.Sprintf("%+v", err)) + log.Fatal("join meet error", zap.Error(err)) } svr, err := server.CreateServer(cfg, api.NewHandler) if err != nil { - log.Fatalf("create server failed: %v", fmt.Sprintf("%+v", err)) + log.Fatal("create server failed", zap.Error(err)) } if err = server.InitHTTPClient(svr); err != nil { - log.Fatalf("initial http client for api handler failed: %v", fmt.Sprintf("%+v", err)) + log.Fatal("initial http client for api handler failed", zap.Error(err)) } sc := make(chan os.Signal, 1) @@ -98,17 +108,22 @@ func main() { }() if err := svr.Run(ctx); err != nil { - log.Fatalf("run server failed: %v", fmt.Sprintf("%+v", err)) + log.Fatal("run server failed", zap.Error(err)) } <-ctx.Done() - log.Infof("Got signal [%d] to exit.", sig) + log.Info("Got signal to exit", zap.String("signal", sig.String())) svr.Close() switch sig { case syscall.SIGTERM: - os.Exit(0) + exit(0) default: - os.Exit(1) + exit(1) } } + +func exit(code int) { + log.Sync() + os.Exit(code) +} diff --git a/go.mod b/go.mod index 2af66030a57..18227c52aff 100644 --- a/go.mod +++ b/go.mod @@ -30,18 +30,19 @@ require ( github.com/inconshreveable/mousetrap v1.0.0 // indirect github.com/jonboulle/clockwork v0.1.0 // indirect github.com/juju/ratelimit v1.0.1 + github.com/kr/pretty v0.1.0 // indirect github.com/mattn/go-shellwords v1.0.3 github.com/matttproud/golang_protobuf_extensions v1.0.0 // indirect github.com/montanaflynn/stats v0.0.0-20151014174947-eeaced052adb github.com/onsi/gomega v1.4.2 // indirect github.com/opentracing/opentracing-go v1.0.2 - github.com/pingcap/check v0.0.0-20171206051426-1c287c953996 + github.com/pingcap/check v0.0.0-20190102082844-67f458068fc8 github.com/pingcap/errcode v0.0.0-20180921232412-a1a7271709d9 github.com/pingcap/errors v0.10.1 // indirect github.com/pingcap/gofail v0.0.0-20181217135706-6a951c1e42c3 github.com/pingcap/kvproto v0.0.0-20181123124450-d48563486f61 - github.com/pkg/errors v0.8.0 - github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/pingcap/log v0.0.0-20190214045112-b37da76f67a7 + github.com/pkg/errors v0.8.1 github.com/prometheus/client_golang v0.8.0 github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5 // indirect github.com/prometheus/common v0.0.0-20180426121432-d811d2e9bf89 // indirect @@ -50,22 +51,20 @@ require ( github.com/soheilhy/cmux v0.1.4 // indirect github.com/spf13/cobra v0.0.2 github.com/spf13/pflag v1.0.1 - github.com/stretchr/testify v1.2.2 // indirect github.com/syndtr/goleveldb v0.0.0-20180815032940-ae2bd5eed72d github.com/tmc/grpc-websocket-proxy v0.0.0-20171017195756-830351dc03c6 // indirect github.com/ugorji/go v1.1.1 // indirect github.com/unrolled/render v0.0.0-20171102162132-65450fb6b2d3 github.com/urfave/negroni v0.3.0 github.com/xiang90/probing v0.0.0-20160813154853-07dd2e8dfe18 // indirect - go.uber.org/atomic v1.3.2 // indirect - go.uber.org/multierr v1.1.0 // indirect - go.uber.org/zap v1.8.0 // indirect + go.uber.org/zap v1.9.1 golang.org/x/crypto v0.0.0-20180503215945-1f94bef427e3 // indirect golang.org/x/sync v0.0.0-20181108010431-42b317875d0f // indirect golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2 // indirect google.golang.org/genproto v0.0.0-20180427144745-86e600f69ee4 // indirect google.golang.org/grpc v1.12.2 gopkg.in/airbrake/gobrake.v2 v2.0.9 // indirect + gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 // indirect gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2 // indirect - gopkg.in/natefinch/lumberjack.v2 v2.0.0-20170531160350-a96e63847dc3 + gopkg.in/natefinch/lumberjack.v2 v2.0.0 ) diff --git a/go.sum b/go.sum index 67b8e2dd904..96c706e6fc5 100644 --- a/go.sum +++ b/go.sum @@ -18,6 +18,7 @@ github.com/coreos/go-systemd v0.0.0-20180202092358-40e2722dffea h1:IHPWgevPcOUjT github.com/coreos/go-systemd v0.0.0-20180202092358-40e2722dffea/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf h1:CAKfRE2YtTUIjjh1bkBtyYFaUT/WmOqsJjgtihT0vMI= github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= @@ -60,6 +61,11 @@ github.com/jonboulle/clockwork v0.1.0 h1:VKV+ZcuP6l3yW9doeqz6ziZGgcynBVQO+obU0+0 github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/juju/ratelimit v1.0.1 h1:+7AIFJVQ0EQgq/K9+0Krm7m530Du7tIz0METWzN0RgY= github.com/juju/ratelimit v1.0.1/go.mod h1:qapgC/Gy+xNh9UxzV13HGGl/6UXNN+ct+vwSgWNm/qk= +github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/mattn/go-shellwords v1.0.3 h1:K/VxK7SZ+cvuPgFSLKi5QPI9Vr/ipOf4C1gN+ntueUk= github.com/mattn/go-shellwords v1.0.3/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= github.com/matttproud/golang_protobuf_extensions v1.0.0 h1:YNOwxxSJzSUARoD9KRZLzM9Y858MNGCOACTvCW9TSAc= @@ -72,8 +78,8 @@ github.com/onsi/gomega v1.4.2 h1:3mYCb7aPxS/RU7TI1y4rkEn1oKmPRjNJLNEXgw7MH2I= github.com/onsi/gomega v1.4.2/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/opentracing/opentracing-go v1.0.2 h1:3jA2P6O1F9UOrWVpwrIo17pu01KWvNWg4X946/Y5Zwg= github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/pingcap/check v0.0.0-20171206051426-1c287c953996 h1:ZBdiJCMan6GSo/aPAM7gywcUKa0z58gczVrnG6TQnAQ= -github.com/pingcap/check v0.0.0-20171206051426-1c287c953996/go.mod h1:B1+S9LNcuMyLH/4HMTViQOJevkGiik3wW2AN9zb2fNQ= +github.com/pingcap/check v0.0.0-20190102082844-67f458068fc8 h1:USx2/E1bX46VG32FIw034Au6seQ2fY9NEILmNh/UlQg= +github.com/pingcap/check v0.0.0-20190102082844-67f458068fc8/go.mod h1:B1+S9LNcuMyLH/4HMTViQOJevkGiik3wW2AN9zb2fNQ= github.com/pingcap/errcode v0.0.0-20180921232412-a1a7271709d9 h1:KH4f4Si9XK6/IW50HtoaiLIFHGkapOM6w83za47UYik= github.com/pingcap/errcode v0.0.0-20180921232412-a1a7271709d9/go.mod h1:4b2X8xSqxIroj/IZ9MX/VGZhAwc11wB9wRIzHvz6SeM= github.com/pingcap/errors v0.10.1 h1:fGVuPMtwNcxbzQ3aoRyyi6kxvXKMkEsceP81f3b8wsk= @@ -82,8 +88,10 @@ github.com/pingcap/gofail v0.0.0-20181217135706-6a951c1e42c3 h1:04yuCf5NMvLU8rB2 github.com/pingcap/gofail v0.0.0-20181217135706-6a951c1e42c3/go.mod h1:DazNTg0PTldtpsQiT9I5tVJwV1onHMKBBgXzmJUlMns= github.com/pingcap/kvproto v0.0.0-20181123124450-d48563486f61 h1:Yms1MiO/ezhE9ozwEOnlh/HrEFHX/r3fPCV6vNThGDM= github.com/pingcap/kvproto v0.0.0-20181123124450-d48563486f61/go.mod h1:0gwbe1F2iBIjuQ9AH0DbQhL+Dpr5GofU8fgYyXk+ykk= -github.com/pkg/errors v0.8.0 h1:WdK/asTD0HN+q6hsWO3/vpuAkAr+tw6aNJNDFFf0+qw= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pingcap/log v0.0.0-20190214045112-b37da76f67a7 h1:kOHAMalwF69bJrtWrOdVaCSvZjLucrJhP4NQKIu6uM4= +github.com/pingcap/log v0.0.0-20190214045112-b37da76f67a7/go.mod h1:xsfkWVaFVV5B8e1K9seWfyJWFrIhbtUTAD8NV1Pq3+w= +github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 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/prometheus/client_golang v0.8.0 h1:1921Yw9Gc3iSc4VQh3PIoOqgPCZS7G/4xQNVUp8Mda8= @@ -102,8 +110,9 @@ github.com/spf13/cobra v0.0.2 h1:NfkwRbgViGoyjBKsLI0QMDcuMnhM+SBg3T0cGfpvKDE= github.com/spf13/cobra v0.0.2/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/pflag v1.0.1 h1:aCvUg6QPl3ibpQUxyLkrEkCHtPqYJL4x9AuhqVqFis4= github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/syndtr/goleveldb v0.0.0-20180815032940-ae2bd5eed72d h1:4J9HCZVpvDmj2tiKGSTUnb3Ok/9CEQb9oqu9LHKQQpc= github.com/syndtr/goleveldb v0.0.0-20180815032940-ae2bd5eed72d/go.mod h1:Z4AUp2Km+PwemOoO/VB5AOx9XSsIItzFjoJlOSiYmn0= github.com/tmc/grpc-websocket-proxy v0.0.0-20171017195756-830351dc03c6 h1:lYIiVDtZnyTWlNwiAxLj0bbpTcx1BWCFhXjfsvmPdNc= @@ -120,8 +129,8 @@ go.uber.org/atomic v1.3.2 h1:2Oa65PReHzfn29GpvgsYwloV9AVFHPDk8tYxt2c2tr4= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/multierr v1.1.0 h1:HoEmRHQPVSqub6w2z2d2EOVs2fjyFRGyofhKuyDq0QI= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/zap v1.8.0 h1:r6Za1Rii8+EGOYRDLvpooNOF6kP3iyDnkpzbw67gCQ8= -go.uber.org/zap v1.8.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.9.1 h1:XCJQEf3W6eZaVwhRBof6ImoYGJSITeKWsyeh3HFu/5o= +go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= golang.org/x/crypto v0.0.0-20180503215945-1f94bef427e3 h1:+U/hI4i24Enhs+2BEMCN7wg16uT6entqa2mTg/PUKB8= golang.org/x/crypto v0.0.0-20180503215945-1f94bef427e3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd h1:nTDtHvHSdCn1m6ITfMRqtOd/9+7a3s8RBNOZ3eYZzJA= @@ -143,13 +152,16 @@ gopkg.in/airbrake/gobrake.v2 v2.0.9 h1:7z2uVWwn7oVeeugY1DtlPAy5H+KYgB1KeKTnqjNat gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2 h1:OAj3g0cR6Dx/R07QgQe8wkA9RNjB2u4i700xBkIT4e0= gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= -gopkg.in/natefinch/lumberjack.v2 v2.0.0-20170531160350-a96e63847dc3 h1:AFxeG48hTWHhDTQDk/m2gorfVHUEa9vo3tp3D7TzwjI= -gopkg.in/natefinch/lumberjack.v2 v2.0.0-20170531160350-a96e63847dc3/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= +gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= +gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.2.1 h1:mUhvW9EsL+naU5Q3cakzfE91YhliOondGd6ZrsDBHQE= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/pkg/logutil/log.go b/pkg/logutil/log.go index 5681fbe8ab7..1f7c2b33f0d 100644 --- a/pkg/logutil/log.go +++ b/pkg/logutil/log.go @@ -25,6 +25,7 @@ import ( "github.com/coreos/etcd/raft" "github.com/coreos/pkg/capnslog" + zaplog "github.com/pingcap/log" "github.com/pkg/errors" log "github.com/sirupsen/logrus" "google.golang.org/grpc/grpclog" @@ -197,7 +198,7 @@ func StringToLogFormatter(format string, disableTimestamp bool) log.Formatter { } // InitFileLog initializes file based logging options. -func InitFileLog(cfg *FileLogConfig) error { +func InitFileLog(cfg *zaplog.FileLogConfig) error { if st, err := os.Stat(cfg.Filename); err == nil { if st.IsDir() { return errors.New("can't use directory as log file name") @@ -239,7 +240,7 @@ func (lg *wrapLogrus) V(l int) bool { var once sync.Once // InitLogger initializes PD's logger. -func InitLogger(cfg *LogConfig) error { +func InitLogger(cfg *zaplog.Config) error { var err error once.Do(func() { diff --git a/pkg/logutil/log_test.go b/pkg/logutil/log_test.go index ffaf7d881d9..258a884227a 100644 --- a/pkg/logutil/log_test.go +++ b/pkg/logutil/log_test.go @@ -20,6 +20,7 @@ import ( "github.com/coreos/pkg/capnslog" . "github.com/pingcap/check" + zaplog "github.com/pingcap/log" log "github.com/sirupsen/logrus" ) @@ -69,7 +70,7 @@ func (s *testLogSuite) TestStringToLogFormatter(c *C) { // TestLogging assure log format and log redirection works. func (s *testLogSuite) TestLogging(c *C) { - conf := &LogConfig{Level: "warn", File: FileLogConfig{}} + conf := &zaplog.Config{Level: "warn", File: zaplog.FileLogConfig{}} c.Assert(InitLogger(conf), IsNil) log.SetOutput(s.buf) @@ -94,6 +95,6 @@ func (s *testLogSuite) TestLogging(c *C) { } func (s *testLogSuite) TestFileLog(c *C) { - c.Assert(InitFileLog(&FileLogConfig{Filename: "/tmp"}), NotNil) - c.Assert(InitFileLog(&FileLogConfig{Filename: "/tmp/test_file_log", MaxSize: 0}), IsNil) + c.Assert(InitFileLog(&zaplog.FileLogConfig{Filename: "/tmp"}), NotNil) + c.Assert(InitFileLog(&zaplog.FileLogConfig{Filename: "/tmp/test_file_log", MaxSize: 0}), IsNil) } diff --git a/server/api/server_test.go b/server/api/server_test.go index 1d565f3368b..b6eef88b45c 100644 --- a/server/api/server_test.go +++ b/server/api/server_test.go @@ -18,12 +18,14 @@ import ( "net/http" "os" "strings" + "sync" "testing" "time" . "github.com/pingcap/check" "github.com/pingcap/kvproto/pkg/metapb" "github.com/pingcap/kvproto/pkg/pdpb" + log "github.com/pingcap/log" "github.com/pingcap/pd/pkg/testutil" "github.com/pingcap/pd/server" "google.golang.org/grpc" @@ -73,6 +75,8 @@ func mustNewServer(c *C) (*server.Server, cleanUpFunc) { return svrs[0], cleanup } +var zapLogOnce sync.Once + func mustNewCluster(c *C, num int) ([]*server.Config, []*server.Server, cleanUpFunc) { svrs := make([]*server.Server, 0, num) cfgs := server.NewTestMultiConfig(c, num) @@ -80,6 +84,11 @@ func mustNewCluster(c *C, num int) ([]*server.Config, []*server.Server, cleanUpF ch := make(chan *server.Server, num) for _, cfg := range cfgs { go func(cfg *server.Config) { + err := cfg.SetupLogger() + c.Assert(err, IsNil) + zapLogOnce.Do(func() { + log.ReplaceGlobals(cfg.GetZapLogger(), cfg.GetZapLogProperties()) + }) s, err := server.CreateServer(cfg, NewHandler) c.Assert(err, IsNil) err = s.Run(context.TODO()) diff --git a/server/config.go b/server/config.go index ff45a092885..e59f6001cac 100644 --- a/server/config.go +++ b/server/config.go @@ -28,11 +28,12 @@ import ( "github.com/coreos/etcd/embed" "github.com/coreos/etcd/pkg/transport" "github.com/coreos/go-semver/semver" - "github.com/pingcap/pd/pkg/logutil" + "github.com/pingcap/log" "github.com/pingcap/pd/pkg/metricutil" "github.com/pingcap/pd/pkg/typeutil" "github.com/pingcap/pd/server/namespace" "github.com/pkg/errors" + "go.uber.org/zap" ) // Config is the pd server configuration. @@ -62,7 +63,7 @@ type Config struct { LeaderLease int64 `toml:"lease" json:"lease"` // Log related config. - Log logutil.LogConfig `toml:"log" json:"log"` + Log log.Config `toml:"log" json:"log"` // Backward compatibility. LogFileDeprecated string `toml:"log-file" json:"log-file"` @@ -126,6 +127,9 @@ type Config struct { heartbeatStreamBindInterval typeutil.Duration LeaderPriorityCheckInterval typeutil.Duration + + logger *zap.Logger + logProps *log.ZapProperties } // NewConfig creates a new config. @@ -772,6 +776,27 @@ func ParseUrls(s string) ([]url.URL, error) { return urls, nil } +// SetupLogger setup the logger. +func (c *Config) SetupLogger() error { + lg, p, err := log.InitLogger(&c.Log) + if err != nil { + return err + } + c.logger = lg + c.logProps = p + return nil +} + +// GetZapLogger gets the created zap logger. +func (c *Config) GetZapLogger() *zap.Logger { + return c.logger +} + +// GetZapLogProperties gets properties of the zap logger. +func (c *Config) GetZapLogProperties() *log.ZapProperties { + return c.logProps +} + // generates a configuration for embedded etcd. func (c *Config) genEmbedEtcdConfig() (*embed.Config, error) { cfg := embed.NewConfig() @@ -796,7 +821,9 @@ func (c *Config) genEmbedEtcdConfig() (*embed.Config, error) { cfg.PeerTLSInfo.TrustedCAFile = c.Security.CAPath cfg.PeerTLSInfo.CertFile = c.Security.CertPath cfg.PeerTLSInfo.KeyFile = c.Security.KeyPath - + // TODO: update etcd + // cfg.ZapLoggerBuilder = embed.NewZapCoreLoggerBuilder(c.logger, c.logger.Core(), c.logSyncer) + // cfg.Logger = "zap" var err error cfg.LPUrls, err = ParseUrls(c.PeerUrls) diff --git a/server/server.go b/server/server.go index 5f6127db7bb..810d9fac86e 100644 --- a/server/server.go +++ b/server/server.go @@ -33,12 +33,13 @@ import ( "github.com/golang/protobuf/proto" "github.com/pingcap/kvproto/pkg/metapb" "github.com/pingcap/kvproto/pkg/pdpb" + log "github.com/pingcap/log" "github.com/pingcap/pd/pkg/etcdutil" "github.com/pingcap/pd/pkg/logutil" "github.com/pingcap/pd/server/core" "github.com/pingcap/pd/server/namespace" "github.com/pkg/errors" - log "github.com/sirupsen/logrus" + "go.uber.org/zap" "google.golang.org/grpc" ) @@ -99,11 +100,14 @@ type Server struct { lastSavedTime time.Time // For async region heartbeat. hbStreams *heartbeatStreams + // Zap logger + lg *zap.Logger + logProps *log.ZapProperties } // CreateServer creates the UNINITIALIZED pd server with given configuration. func CreateServer(cfg *Config, apiRegister func(*Server) http.Handler) (*Server, error) { - log.Infof("PD config - %v", cfg) + log.Info("PD Config", zap.Reflect("config", cfg)) rand.Seed(time.Now().UnixNano()) s := &Server{ @@ -126,11 +130,14 @@ func CreateServer(cfg *Config, apiRegister func(*Server) http.Handler) (*Server, s.etcdCfg = etcdCfg if EnableZap { // The etcd master version has removed embed.Config.SetupLogging. - // Now logger is set up automatically based on embed.Config.Logger, embed.Config.LogOutputs, embed.Config.Debug fields. - // Use zap logger in the test, otherwise will panic. Reference: https://github.com/coreos/etcd/blob/master/embed/config_logging.go#L45 + // Now logger is set up automatically based on embed.Config.Logger, + // Use zap logger in the test, otherwise will panic. + // Reference: https://github.com/coreos/etcd/blob/master/embed/config_logging.go#L45 s.etcdCfg.Logger = "zap" s.etcdCfg.LogOutputs = []string{"stdout"} } + s.lg = cfg.logger + s.logProps = cfg.logProps return s, nil } @@ -165,7 +172,7 @@ func (s *Server) startEtcd(ctx context.Context) error { } endpoints := []string{s.etcdCfg.ACUrls[0].String()} - log.Infof("create etcd v3 client with endpoints %v", endpoints) + log.Info("create etcd v3 client", zap.Strings("endpoints", endpoints)) client, err := clientv3.New(clientv3.Config{ Endpoints: endpoints, @@ -187,7 +194,7 @@ func (s *Server) startEtcd(ctx context.Context) error { if etcdServerID == m.ID { etcdPeerURLs := strings.Join(m.PeerURLs, ",") if s.cfg.AdvertisePeerUrls != etcdPeerURLs { - log.Infof("update advertise peer urls from %s to %s", s.cfg.AdvertisePeerUrls, etcdPeerURLs) + log.Info("update advertise peer urls", zap.String("from", s.cfg.AdvertisePeerUrls), zap.String("to", etcdPeerURLs)) s.cfg.AdvertisePeerUrls = etcdPeerURLs } } @@ -204,7 +211,7 @@ func (s *Server) startServer() error { if err = s.initClusterID(); err != nil { return err } - log.Infof("init cluster id %v", s.clusterID) + log.Info("init cluster id", zap.Uint64("cluster-id", s.clusterID)) // It may lose accuracy if use float64 to store uint64. So we store the // cluster id in label. metadataGauge.WithLabelValues(fmt.Sprintf("cluster%d", s.clusterID)).Set(0) @@ -270,7 +277,7 @@ func (s *Server) Close() { s.hbStreams.Close() } if err := s.kv.Close(); err != nil { - log.Errorf("close kv meet error: %s", err) + log.Error("close kv meet error", zap.Error(err)) } log.Info("close server") @@ -287,7 +294,7 @@ var timeMonitorOnce sync.Once func (s *Server) Run(ctx context.Context) error { timeMonitorOnce.Do(func() { go StartMonitor(time.Now, func() { - log.Errorf("system time jumps backward") + log.Error("system time jumps backward") timeJumpBackCounter.Inc() }) }) @@ -349,7 +356,9 @@ func (s *Server) collectEtcdStateMetrics() { func (s *Server) bootstrapCluster(req *pdpb.BootstrapRequest) (*pdpb.BootstrapResponse, error) { clusterID := s.clusterID - log.Infof("try to bootstrap raft cluster %d with %v", clusterID, req) + log.Info("try to bootstrap raft cluster", + zap.Uint64("cluster-id", clusterID), + zap.String("request", fmt.Sprintf("%v", req))) if err := checkBootstrapRequest(clusterID, req); err != nil { return nil, err @@ -402,18 +411,18 @@ func (s *Server) bootstrapCluster(req *pdpb.BootstrapRequest) (*pdpb.BootstrapRe return nil, errors.WithStack(err) } if !resp.Succeeded { - log.Warnf("cluster %d already bootstrapped", clusterID) + log.Warn("cluster already bootstrapped", zap.Uint64("cluster-id", clusterID)) return nil, errors.Errorf("cluster %d already bootstrapped", clusterID) } - log.Infof("bootstrap cluster %d ok", clusterID) + log.Info("bootstrap cluster ok", zap.Uint64("cluster-id", clusterID)) err = s.kv.SaveRegion(req.GetRegion()) if err != nil { - log.Warnf("save the bootstrap region failed: %s", err) + log.Warn("save the bootstrap region failed", zap.Error(err)) } err = s.kv.Flush() if err != nil { - log.Warnf("flush the bootstrap region failed: %s", err) + log.Warn("flush the bootstrap region failed", zap.Error(err)) } if err := s.cluster.start(); err != nil { return nil, err @@ -529,7 +538,7 @@ func (s *Server) SetScheduleConfig(cfg ScheduleConfig) error { if err := s.scheduleOpt.persist(s.kv); err != nil { return err } - log.Infof("schedule config is updated: %+v, old: %+v", cfg, old) + log.Info("schedule config is updated", zap.Reflect("new", cfg), zap.Reflect("old", old)) return nil } @@ -550,7 +559,7 @@ func (s *Server) SetReplicationConfig(cfg ReplicationConfig) error { if err := s.scheduleOpt.persist(s.kv); err != nil { return err } - log.Infof("replication config is updated: %+v, old: %+v", cfg, old) + log.Info("replication config is updated", zap.Reflect("new", cfg), zap.Reflect("old", old)) return nil } @@ -561,7 +570,7 @@ func (s *Server) SetPDServerConfig(cfg PDServerConfig) error { if err := s.scheduleOpt.persist(s.kv); err != nil { return err } - log.Infof("replication config is updated: %+v, old: %+v", cfg, old) + log.Info("PD server config is updated", zap.Reflect("new", cfg), zap.Reflect("old", old)) return nil } @@ -598,13 +607,13 @@ func (s *Server) SetNamespaceConfig(name string, cfg NamespaceConfig) error { if err := s.scheduleOpt.persist(s.kv); err != nil { return err } - log.Infof("namespace:%v config is updated: %+v, old: %+v", name, cfg, old) + log.Info("namespace config is updated", zap.String("name", name), zap.Reflect("new", cfg), zap.Reflect("old", old)) } else { s.scheduleOpt.ns[name] = newNamespaceOption(&cfg) if err := s.scheduleOpt.persist(s.kv); err != nil { return err } - log.Infof("namespace:%v config is added: %+v", name, cfg) + log.Info("namespace config is added", zap.String("name", name), zap.Reflect("new", cfg)) } return nil } @@ -617,7 +626,7 @@ func (s *Server) DeleteNamespaceConfig(name string) error { if err := s.scheduleOpt.persist(s.kv); err != nil { return err } - log.Infof("namespace:%v config is deleted: %+v", name, *cfg) + log.Info("namespace config is deleted", zap.String("name", name), zap.Reflect("config", *cfg)) } return nil } @@ -629,7 +638,7 @@ func (s *Server) SetLabelProperty(typ, labelKey, labelValue string) error { if err != nil { return err } - log.Infof("label property config is updated: %+v", s.scheduleOpt.loadLabelPropertyConfig()) + log.Info("label property config is updated", zap.Reflect("config", s.scheduleOpt.loadLabelPropertyConfig())) return nil } @@ -640,7 +649,7 @@ func (s *Server) DeleteLabelProperty(typ, labelKey, labelValue string) error { if err != nil { return err } - log.Infof("label property config is updated: %+v", s.scheduleOpt.loadLabelPropertyConfig()) + log.Info("label property config is deleted", zap.Reflect("config", s.scheduleOpt.loadLabelPropertyConfig())) return nil } @@ -660,7 +669,7 @@ func (s *Server) SetClusterVersion(v string) error { if err != nil { return err } - log.Infof("cluster version is updated to %s", v) + log.Info("cluster version is updated", zap.String("new-version", v)) return nil } diff --git a/server/testutil.go b/server/testutil.go index b72209a22fa..d7547c729b1 100644 --- a/server/testutil.go +++ b/server/testutil.go @@ -19,10 +19,12 @@ import ( "io/ioutil" "os" "strings" + "sync" "time" "github.com/coreos/etcd/embed" "github.com/pingcap/check" + "github.com/pingcap/log" "github.com/pingcap/pd/pkg/tempurl" "github.com/pingcap/pd/pkg/typeutil" @@ -56,6 +58,8 @@ func NewTestServer(c *check.C) (*Config, *Server, CleanupFunc, error) { return cfg, s, cleanup, nil } +var zapLogOnce sync.Once + // NewTestSingleConfig is only for test to create one pd. // Because PD client also needs this, so export here. func NewTestSingleConfig(c *check.C) *Config { @@ -78,6 +82,11 @@ func NewTestSingleConfig(c *check.C) *Config { cfg.TickInterval = typeutil.NewDuration(100 * time.Millisecond) cfg.ElectionInterval = typeutil.NewDuration(3 * time.Second) cfg.LeaderPriorityCheckInterval = typeutil.NewDuration(100 * time.Millisecond) + err := cfg.SetupLogger() + c.Assert(err, check.IsNil) + zapLogOnce.Do(func() { + log.ReplaceGlobals(cfg.GetZapLogger(), cfg.GetZapLogProperties()) + }) c.Assert(cfg.Adjust(nil), check.IsNil) diff --git a/server/util.go b/server/util.go index 03965f6d998..bd20dd66cfc 100644 --- a/server/util.go +++ b/server/util.go @@ -26,9 +26,10 @@ import ( "github.com/golang/protobuf/proto" "github.com/pingcap/kvproto/pkg/metapb" "github.com/pingcap/kvproto/pkg/pdpb" + log "github.com/pingcap/log" "github.com/pingcap/pd/pkg/etcdutil" "github.com/pkg/errors" - log "github.com/sirupsen/logrus" + "go.uber.org/zap" ) const ( @@ -53,11 +54,11 @@ var DialClient = &http.Client{ // LogPDInfo prints the PD version information. func LogPDInfo() { - log.Infof("Welcome to Placement Driver (PD).") - log.Infof("Release Version: %s", PDReleaseVersion) - log.Infof("Git Commit Hash: %s", PDGitHash) - log.Infof("Git Branch: %s", PDGitBranch) - log.Infof("UTC Build Time: %s", PDBuildTS) + log.Info("Welcome to Placement Driver (PD)") + log.Info("PD", zap.String("release-version", PDReleaseVersion)) + log.Info("PD", zap.String("git-hash", PDGitHash)) + log.Info("PD", zap.String("git-branch", PDGitBranch)) + log.Info("PD", zap.String("utc-build-time", PDBuildTS)) } // PrintPDInfo prints the PD version information without log info. @@ -76,7 +77,10 @@ func CheckPDVersion(opt *scheduleOption) { } clusterVersion := opt.loadClusterVersion() if pdVersion.LessThan(clusterVersion) { - log.Warnf("PD version %s less than cluster version: %s, please upgrade PD", pdVersion, clusterVersion) + log.Warn( + "PD version less than cluster version, please upgrade PD", + zap.String("PD-version", pdVersion.String()), + zap.String("cluster-version", clusterVersion.String())) } } @@ -211,7 +215,10 @@ func (t *slowLogTxn) Commit() (*clientv3.TxnResponse, error) { cost := time.Since(start) if cost > slowRequestTime { - log.Warnf("txn runs too slow, resp: %v, err: %v, cost: %s", resp, err, cost) + log.Warn("txn runs too slow", + zap.Error(err), + zap.Reflect("response", resp), + zap.Duration("cost", cost)) } label := "success" if err != nil { diff --git a/tests/cluster.go b/tests/cluster.go index 57eceba3e38..8399af81046 100644 --- a/tests/cluster.go +++ b/tests/cluster.go @@ -23,11 +23,12 @@ import ( "github.com/coreos/go-semver/semver" "github.com/pingcap/kvproto/pkg/metapb" "github.com/pingcap/kvproto/pkg/pdpb" + log "github.com/pingcap/log" "github.com/pingcap/pd/server" "github.com/pingcap/pd/server/api" "github.com/pingcap/pd/server/core" "github.com/pkg/errors" - log "github.com/sirupsen/logrus" + "go.uber.org/zap" ) // TestServer states. @@ -47,9 +48,18 @@ type TestServer struct { var initHTTPClientOnce sync.Once +var zapLogOnce sync.Once + // NewTestServer creates a new TestServer. func NewTestServer(cfg *server.Config) (*TestServer, error) { - err := server.PrepareJoinCluster(cfg) + err := cfg.SetupLogger() + if err != nil { + return nil, err + } + zapLogOnce.Do(func() { + log.ReplaceGlobals(cfg.GetZapLogger(), cfg.GetZapLogProperties()) + }) + err = server.PrepareJoinCluster(cfg) if err != nil { return nil, err } @@ -430,7 +440,7 @@ func (c *TestCluster) Destroy() { for _, s := range c.servers { err := s.Destroy() if err != nil { - log.Errorf("failed to destroy the cluster: %v", err) + log.Error("failed to destroy the cluster:", zap.Error(err)) } } }