From 0619229ec57cd9992189a1c9315c3c77f10fdeb1 Mon Sep 17 00:00:00 2001 From: zhiqiang feng Date: Mon, 28 Dec 2020 15:58:00 +0800 Subject: [PATCH] add zap logger --- caller | 0 cmd/root.go | 51 ++++++++++++++++++++++++++++++++--------------- cmd/start.go | 16 ++++++++------- cmd/test.go | 2 +- go.mod | 2 ++ go.sum | 5 +++++ utils/serial.go | 18 ++++++++--------- utils/socket.go | 14 +++++++------ utils/sqlite.go | 19 +++++++++--------- utils/telegram.go | 4 +++- 10 files changed, 82 insertions(+), 49 deletions(-) create mode 100644 caller diff --git a/caller b/caller new file mode 100644 index 0000000..e69de29 diff --git a/cmd/root.go b/cmd/root.go index 862f9bb..e37fd07 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -18,9 +18,12 @@ package cmd import ( "fmt" "os" + "time" + rotatelogs "github.com/lestrrat-go/file-rotatelogs" "github.com/spf13/cobra" "go.uber.org/zap" + "go.uber.org/zap/zapcore" "github.com/spf13/viper" "it2000.com.cn/tele-recv/utils" @@ -55,7 +58,7 @@ Read the telegram from `, Mode = os.Getenv(ModeName) logger *zap.Logger - l *zap.SugaredLogger + // l *zap.SugaredLogger ) // Execute adds all child commands to the root command and sets flags appropriately. @@ -78,14 +81,12 @@ func init() { // Cobra also supports local flags, which will only run // when this action is called directly. rootCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle") - if Mode == "PROD" { - logger, _ = zap.NewProduction() - } else { - logger, _ = zap.NewDevelopment() - } + + initLog() defer logger.Sync() - l = logger.Sugar() - utils.Log = l + // l = logger.Sugar() + utils.Log = logger + } // initConfig reads in config file and ENV variables if set. @@ -94,13 +95,6 @@ func initConfig() { // Use config file from the flag. viper.SetConfigFile(cfgFile) } else { - // Find home directory. - //home, err := os.Open(".") - //if err != nil { - // fmt.Println(err) - // os.Exit(1) - //} - // Search config in home directory with name ".tele-recv" (without extension). viper.AddConfigPath(".") viper.SetConfigName("telegram") @@ -111,7 +105,7 @@ func initConfig() { // If a config file is found, read it in. if err := viper.ReadInConfig(); err == nil { // fmt.Println("Using config file:", viper.ConfigFileUsed()) - l.Infof("Using config file : %s", viper.ConfigFileUsed()) + logger.Info("Using config file ", zap.String("path", viper.ConfigFileUsed())) device = viper.GetString("serial.device") baudrate = viper.GetInt("serial.baudrate") bytesize = byte(viper.GetInt("serial.bytesize")) @@ -123,3 +117,28 @@ func initConfig() { } } + +func initLog() { + logFile := "./log/telegram-%Y-%m-%d-%H.log" + rotator, err := rotatelogs.New( + logFile, + rotatelogs.WithMaxAge(60*24*time.Hour), + rotatelogs.WithRotationTime(time.Hour)) + if err != nil { + panic(err) + } + + priority := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool { + return lvl >= zapcore.DebugLevel + }) + + encoder := zapcore.NewConsoleEncoder(zap.NewDevelopmentEncoderConfig()) + + core := zapcore.NewTee( + zapcore.NewCore(encoder, zapcore.Lock(os.Stdout), priority), + zapcore.NewCore(encoder, zapcore.AddSync(rotator), priority), + ) + + logger = zap.New(core) + +} diff --git a/cmd/start.go b/cmd/start.go index e091c2a..b41684a 100644 --- a/cmd/start.go +++ b/cmd/start.go @@ -16,10 +16,12 @@ limitations under the License. package cmd import ( + "fmt" "os" "os/signal" "syscall" - "fmt" + + "go.uber.org/zap" "it2000.com.cn/tele-recv/utils" "github.com/spf13/cobra" @@ -68,7 +70,7 @@ func start() { // and then notify the program that it can finish. go func() { sig := <-sigs - l.Info(sig) + logger.Info("got ", zap.Any("signal", sig)) utils.ServerRunning = false utils.StopSocketServer() done <- true @@ -77,17 +79,17 @@ func start() { // The program will wait here until it gets the // expected signal (as indicated by the goroutine // above sending a value on `done`) and then exit. - l.Info("awaiting signal") + logger.Info("awaiting signal") _ = utils.InitDb(dbFile, dbInit) go utils.Listen(socketAddress) for utils.ServerRunning { if !utils.IsPortOpen() { - l.Info("try to open port") + logger.Info("try to open port") err := utils.OpenPort(device, baudrate, bytesize, stopbits) if err != nil { - l.Fatal("error in open serial port ", err) + logger.Fatal("error in open serial port ", zap.Error(err)) } - l.Info("starting read") + logger.Info("starting read") } buffer, count := utils.ReadPort() if count > 0 { @@ -98,6 +100,6 @@ func start() { } } <-done - l.Info("exiting") + logger.Info("exiting") } diff --git a/cmd/test.go b/cmd/test.go index 48ff014..aac5439 100644 --- a/cmd/test.go +++ b/cmd/test.go @@ -33,7 +33,7 @@ Test load sqlite database and init table`, } func test() { - l.Info("Testing environment") + logger.Info("Testing environment") _ = utils.OpenPort(device, baudrate, bytesize, stopbits) err := utils.InitDb(dbFile, dbInit) diff --git a/go.mod b/go.mod index 9118053..cd5564d 100644 --- a/go.mod +++ b/go.mod @@ -4,6 +4,8 @@ go 1.15 require ( github.com/fsnotify/fsnotify v1.4.9 // indirect + github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible + github.com/lestrrat-go/strftime v1.0.3 // indirect github.com/magiconair/properties v1.8.4 // indirect github.com/mattn/go-sqlite3 v1.14.5 github.com/mitchellh/mapstructure v1.4.0 // indirect diff --git a/go.sum b/go.sum index fa68a33..eb16feb 100644 --- a/go.sum +++ b/go.sum @@ -113,6 +113,11 @@ github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORN 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/lestrrat-go/envload v0.0.0-20180220234015-a3eb8ddeffcc/go.mod h1:kopuH9ugFRkIXf3YoqHKyrJ9YfUFsckUU9S7B+XP+is= +github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible h1:Y6sqxHMyB1D2YSzWkLibYKgg+SwmyFU9dF2hn6MdTj4= +github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible/go.mod h1:ZQnN8lSECaebrkQytbHj4xNgtg8CR7RYXnPok8e0EHA= +github.com/lestrrat-go/strftime v1.0.3 h1:qqOPU7y+TM8Y803I8fG9c/DyKG3xH/xkng6keC1015Q= +github.com/lestrrat-go/strftime v1.0.3/go.mod h1:E1nN3pCbtMSu1yjSVeyuRFVm/U0xoR76fd03sz+Qz4g= github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.4 h1:8KGKTcQQGm0Kv7vEbKFErAoAOFyyacLStRtQSeYtvkY= diff --git a/utils/serial.go b/utils/serial.go index 671e6fa..83b671a 100644 --- a/utils/serial.go +++ b/utils/serial.go @@ -15,18 +15,18 @@ var ( stopbits byte port *serial.Port portOpened = false - Log *zap.SugaredLogger + Log *zap.Logger ) const readDuration = 500 * time.Millisecond // OpenPort open serial port func OpenPort(device string, baudrate int, bytesize byte, stopbits byte) error { - Log.Infow("opening serial device ", - "port", device, - "baudrate", baudrate, - "bytesize", bytesize, - "stopbits", stopbits) + Log.Info("opening serial device ", + zap.String("port", device), + zap.Int("baudrate", baudrate), + zap.Int("bytesize", int(bytesize)), + zap.Int("stopbits", int(stopbits))) config := &serial.Config{Name: device, Baud: baudrate, Size: bytesize, @@ -35,10 +35,10 @@ func OpenPort(device string, baudrate int, bytesize byte, stopbits byte) error { var err error port, err = serial.OpenPort(config) if err != nil { - Log.Fatal("error in open serial port ", err) + Log.Fatal("error in open serial port ", zap.Error(err)) return err } - Log.Infof("%s opened", device) + Log.Info("opened ", zap.String("port", device)) portOpened = true return nil } @@ -51,7 +51,7 @@ func ReadPort() ([]byte, int) { } count, err := port.Read(buffer) if err != nil && err != io.EOF { - Log.Error("error in read port ", err) + Log.Error("error in read port ", zap.Error(err)) //TODO: 3 time fail try to } return buffer, count diff --git a/utils/socket.go b/utils/socket.go index 8a15983..7a9e89e 100644 --- a/utils/socket.go +++ b/utils/socket.go @@ -4,6 +4,8 @@ import ( "io" "net" "time" + + "go.uber.org/zap" ) const ServerType = "tcp" @@ -17,20 +19,20 @@ func Listen(address string) { var err error server, err = net.Listen(ServerType, address) if err != nil { - Log.Fatal("error in create server ", err) + Log.Fatal("error in create server ", zap.Error(err)) } defer server.Close() - Log.Infof("listen on %s", address) + Log.Info("listen on ", zap.String("address", address)) for ServerRunning { conn, err := server.Accept() if err != nil { ServerRunning = false - Log.Error("error in create connection ", err) + Log.Error("error in create connection ", zap.Error(err)) } if client == nil { client = conn ClientReady = false - Log.Infof("client %s connected ", client.RemoteAddr()) + Log.Info("client connected on ", zap.Any("address", client.RemoteAddr())) LoadUnprocessed() } else { Log.Info("client already connected, close") @@ -48,7 +50,7 @@ func Listen(address string) { func WriteToClient(data string) error { _, err := client.Write([]byte(data + "\r\n")) if err != nil { - Log.Error("error in write data to client socket ", err) + Log.Error("error in write data to client socket ", zap.Error(err)) closeClient() } return err @@ -58,7 +60,7 @@ func connCheck() bool { _, err := client.Read(make([]byte, 0)) if err != nil && err != io.EOF { // this connection is invalid - Log.Error("conn closed....", err) + Log.Error("conn closed....", zap.Error(err)) client = nil return false } diff --git a/utils/sqlite.go b/utils/sqlite.go index 90d6ddb..8d5be3a 100644 --- a/utils/sqlite.go +++ b/utils/sqlite.go @@ -6,6 +6,7 @@ import ( "time" _ "github.com/mattn/go-sqlite3" + "go.uber.org/zap" ) const ( @@ -41,12 +42,12 @@ var ( func getDb() *sql.DB { //log.Println("init database ", initTable) if initTable && !initialized { - Log.Info("remove database file ", dbFile) + Log.Info("remove database ", zap.String("file", dbFile)) os.Remove(dbFile) } db, err := sql.Open(DbDriver, dbFile) if err != nil { - Log.Fatal("error in open database ", err) + Log.Fatal("error in open database ", zap.Error(err)) } return db } @@ -59,7 +60,7 @@ func InitDb(file string, init bool) error { defer db.Close() _, dbErr = db.Exec(TableCreate) checkDbErr(dbErr, "error in create table") - Log.Infof("database %s initialized", dbFile) + Log.Info("database initialized") initialized = true return nil } @@ -82,9 +83,9 @@ func InsertTelegram(teleString string) { checkDbErr(err, "error in insert telegram ") isWriting = false if insertSQL == InsertOld { - Log.Infof("telegram [%d] processed ", id) + Log.Info("telegram processed ", zap.Int64("id", id)) } else { - Log.Infof("telegram [%d] saved ", id) + Log.Info("telegram saved ", zap.Int64("id", id)) } } @@ -110,7 +111,7 @@ func LoadUnprocessed() { func getTelegram(db *sql.DB) []telegram { var telegrams []telegram num := countTelegram() - Log.Infof("%n telegram unprocessed ", num) + Log.Info("telegram ", zap.Int64("unprocessed", num)) if num < 1 { return telegrams } @@ -137,7 +138,7 @@ func processed(db *sql.DB, t telegram) { result, err := stmt.Exec(t.id) checkDbErr(err, "error in update telegram status") id, _ := result.RowsAffected() - Log.Infof("[%d] telegram update : %t", id, id > 0) + Log.Info("telegram update : %t", zap.Int64("id", id), zap.Bool("result", id > 0)) isWriting = false Log.Info("release lock") tx.Commit() @@ -156,7 +157,7 @@ func countTelegram() int64 { func getWriteLock() { count := 0 - Log.Debugf("write lock : %t", isWriting) + Log.Debug("with ", zap.Bool("lock", isWriting)) for isWriting && count < 10 { Log.Info("waiting for write ") time.Sleep(5 * time.Second) @@ -170,6 +171,6 @@ func getWriteLock() { func checkDbErr(err error, msg string) { if err != nil { - Log.Fatal(msg, err) + Log.Fatal(msg, zap.Error(err)) } } diff --git a/utils/telegram.go b/utils/telegram.go index 17d9ffc..01030d0 100644 --- a/utils/telegram.go +++ b/utils/telegram.go @@ -3,6 +3,8 @@ package utils import ( "regexp" "strings" + + "go.uber.org/zap" ) const ( @@ -27,7 +29,7 @@ func check() { telegram := exp.FindString(string(buffer)) if len(telegram) > 0 { - Log.Infof("telegram : %s", telegram) + Log.Info("telegram ", zap.String("text", telegram)) buffer = nil InsertTelegram(telegram) }