diff --git a/.drone.yml b/.drone.yml index a2d43e2..04c82b1 100644 --- a/.drone.yml +++ b/.drone.yml @@ -22,7 +22,7 @@ steps: GO111MODULE: on GOPROXY: https://goproxy.io commands: - - go build -o tele-recv-linux + - GOOS=linux GOARCH=amd64 go build -o tele-recv-linux - GOOS=windows GOARCH=amd64 go build -o tele-recv-win64.exe - tar cvzf tele-recv-linux-0.0.2.tar.gz tele-recv-linux tele-recv-win64.exe telegram.yaml diff --git a/caller b/caller new file mode 100644 index 0000000..e69de29 diff --git a/cmd/root.go b/cmd/root.go index cb2bd08..0a05df1 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -18,12 +18,19 @@ 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" ) +const ModeName = "TELEGRAM_MODE" + var ( cfgFile string device string @@ -47,6 +54,10 @@ Read the telegram from `, // has an action associated with it: // Run: func(cmd *cobra.Command, args []string) { }, } + + Mode = os.Getenv(ModeName) + + logger *zap.Logger ) // Execute adds all child commands to the root command and sets flags appropriately. @@ -69,6 +80,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") + + initLog() + defer logger.Sync() + // l = logger.Sugar() + utils.Log = logger + } // initConfig reads in config file and ENV variables if set. @@ -77,13 +94,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") @@ -93,7 +103,8 @@ func initConfig() { // If a config file is found, read it in. if err := viper.ReadInConfig(); err == nil { - fmt.Println("Using config file:", viper.ConfigFileUsed()) + // fmt.Println("Using config file:", 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")) @@ -103,4 +114,43 @@ func initConfig() { dbInit = viper.GetBool("sqlite.init") socketAddress = viper.GetString("socket.address") } + +} + +func initLog() { + logFile := "./logs/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) + } + + rawFile := "./logs/raw-%Y-%m-%d-%H.txt" + utils.RawLog, err = rotatelogs.New( + rawFile, + rotatelogs.WithMaxAge(60*24*time.Hour), + rotatelogs.WithRotationTime(time.Hour)) + if err != nil { + panic(err) + } + + filePriority := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool { + return lvl >= zapcore.DebugLevel + }) + + stdoutPriority := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool { + return lvl >= zapcore.InfoLevel + }) + + encoder := zapcore.NewConsoleEncoder(zap.NewDevelopmentEncoderConfig()) + + core := zapcore.NewTee( + zapcore.NewCore(encoder, zapcore.Lock(os.Stdout), stdoutPriority), + zapcore.NewCore(encoder, zapcore.AddSync(rotator), filePriority), + ) + + logger = zap.New(core) + } diff --git a/cmd/start.go b/cmd/start.go index 4083d79..1886d1d 100644 --- a/cmd/start.go +++ b/cmd/start.go @@ -17,11 +17,11 @@ package cmd import ( "fmt" - "log" "os" "os/signal" "syscall" + "go.uber.org/zap" "it2000.com.cn/tele-recv/utils" "github.com/spf13/cobra" @@ -70,8 +70,7 @@ func start() { // and then notify the program that it can finish. go func() { sig := <-sigs - fmt.Println() - fmt.Println(sig) + logger.Info("got ", zap.Any("signal", sig)) utils.ServerRunning = false utils.StopSocketServer() done <- true @@ -80,27 +79,29 @@ 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. - fmt.Println("awaiting signal") + logger.Info("awaiting signal") _ = utils.InitDb(dbFile, dbInit) go utils.Listen(socketAddress) for utils.ServerRunning { if !utils.IsPortOpen() { - log.Println("try to open port") + logger.Info("try to open port") err := utils.OpenPort(device, baudrate, bytesize, stopbits) if err != nil { - log.Fatal("error in open serial port ", err) + logger.Fatal("error in open serial port ", zap.Error(err)) } - log.Println("starting read") + logger.Info("starting read") } buffer, count := utils.ReadPort() if count > 0 { - if lograw { - log.Print(string(buffer)) + if lograw && len(buffer) > 0 { + fmt.Print(string(buffer)) + } + if utils.Append(buffer) { + fmt.Println() } - utils.Append(buffer) } } <-done - fmt.Println("exiting") + logger.Info("exiting") } diff --git a/cmd/test.go b/cmd/test.go index 8b0832d..aac5439 100644 --- a/cmd/test.go +++ b/cmd/test.go @@ -16,8 +16,6 @@ limitations under the License. package cmd import ( - "log" - "github.com/spf13/cobra" "it2000.com.cn/tele-recv/utils" ) @@ -35,7 +33,7 @@ Test load sqlite database and init table`, } func test() { - log.Println("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 4f116c0..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 @@ -14,6 +16,8 @@ require ( github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/spf13/viper v1.7.1 github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07 + go.uber.org/multierr v1.6.0 // indirect + go.uber.org/zap v1.16.0 golang.org/x/sys v0.0.0-20201214210602-f9fddec55a1e // indirect golang.org/x/text v0.3.4 // indirect gopkg.in/ini.v1 v1.62.0 // indirect diff --git a/go.sum b/go.sum index 41b0411..eb16feb 100644 --- a/go.sum +++ b/go.sum @@ -11,6 +11,7 @@ cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqCl cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= @@ -112,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= @@ -144,6 +150,7 @@ github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/9 github.com/pelletier/go-toml v1.8.1 h1:1Nf83orprkJyknT6h7zbuEGUEjcyVlCxSUGTENmNCRM= github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +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/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= @@ -209,8 +216,19 @@ go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.6.0 h1:Ezj3JGmsOnG1MoRWQkPBsKLe9DwWD9QeXzTRzzldNVk= +go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/multierr v1.5.0 h1:KCa4XfM8CWFCpxXRGok+Q0SS/0XBhMDbHHGABQLvD2A= +go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= +go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= +go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.16.0 h1:uFRZXykJGK9lLY4HtgSw44DnIcAM+kRBP7x5m+NpAOM= +go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= @@ -230,6 +248,7 @@ golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTk golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de h1:5hukYrvBGR8/eNkX5mdUezrA6JiaEZDtJb9Ei+1LlBs= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= @@ -299,6 +318,9 @@ golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgw golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc h1:NCy3Ohtk6Iny5V/reW2Ktypo4zIpWBdRJ1uFMjBxdg8= golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= @@ -343,5 +365,6 @@ gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3 h1:3JgtbtFHMiCmsznwGVTUWbgGov+pVqnlf1dEJTNAXeM= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= diff --git a/telegram.yaml b/telegram.yaml index 213dd07..60447a7 100644 --- a/telegram.yaml +++ b/telegram.yaml @@ -2,7 +2,8 @@ serial: device: ttyS1 baudrate: 9600 bytesize: 8 - stopbits: 7 + # 1, 2, 15 + stopbits: 1 lograw: true diff --git a/utils/serial.go b/utils/serial.go index cd5575d..83b671a 100644 --- a/utils/serial.go +++ b/utils/serial.go @@ -2,10 +2,10 @@ package utils import ( "io" - "log" "time" "github.com/tarm/serial" + "go.uber.org/zap" ) var ( @@ -15,13 +15,18 @@ var ( stopbits byte port *serial.Port portOpened = false + Log *zap.Logger ) const readDuration = 500 * time.Millisecond // OpenPort open serial port func OpenPort(device string, baudrate int, bytesize byte, stopbits byte) error { - log.Println("opening port device:", 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, @@ -30,23 +35,23 @@ func OpenPort(device string, baudrate int, bytesize byte, stopbits byte) error { var err error port, err = serial.OpenPort(config) if err != nil { - log.Fatalln("error in open serial port ", err) + Log.Fatal("error in open serial port ", zap.Error(err)) return err } - log.Println("opened port ", port) + Log.Info("opened ", zap.String("port", device)) portOpened = true return nil } //ReadPort read byte array from port func ReadPort() ([]byte, int) { - buffer := make([]byte, 256) + buffer := make([]byte, 1) if !ServerRunning { return buffer, 0 } count, err := port.Read(buffer) if err != nil && err != io.EOF { - log.Println("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 f9d6a9a..7a9e89e 100644 --- a/utils/socket.go +++ b/utils/socket.go @@ -2,9 +2,10 @@ package utils import ( "io" - "log" "net" "time" + + "go.uber.org/zap" ) const ServerType = "tcp" @@ -18,23 +19,23 @@ 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.Println("listen on ", address) + Log.Info("listen on ", zap.String("address", address)) for ServerRunning { conn, err := server.Accept() if err != nil { ServerRunning = false - log.Fatalln("error in create connection ", err) + Log.Error("error in create connection ", zap.Error(err)) } if client == nil { client = conn ClientReady = false - log.Println("client connected ", client.RemoteAddr()) + Log.Info("client connected on ", zap.Any("address", client.RemoteAddr())) LoadUnprocessed() } else { - log.Println("client already connected, close") + Log.Info("client already connected, close") client.Close() client = nil conn.Close() @@ -49,7 +50,7 @@ func Listen(address string) { func WriteToClient(data string) error { _, err := client.Write([]byte(data + "\r\n")) if err != nil { - log.Println("error in write data to client socket ", err) + Log.Error("error in write data to client socket ", zap.Error(err)) closeClient() } return err @@ -59,7 +60,7 @@ func connCheck() bool { _, err := client.Read(make([]byte, 0)) if err != nil && err != io.EOF { // this connection is invalid - log.Println("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 743138e..50e97dd 100644 --- a/utils/sqlite.go +++ b/utils/sqlite.go @@ -2,11 +2,11 @@ package utils import ( "database/sql" - "log" "os" "time" _ "github.com/mattn/go-sqlite3" + "go.uber.org/zap" ) const ( @@ -42,12 +42,12 @@ var ( func getDb() *sql.DB { //log.Println("init database ", initTable) if initTable && !initialized { - log.Println("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 } @@ -60,7 +60,7 @@ func InitDb(file string, init bool) error { defer db.Close() _, dbErr = db.Exec(TableCreate) checkDbErr(dbErr, "error in create table") - log.Println("database ", db, " initialized") + Log.Info("database initialized") initialized = true return nil } @@ -83,14 +83,14 @@ func InsertTelegram(teleString string) { checkDbErr(err, "error in insert telegram ") isWriting = false if insertSQL == InsertOld { - log.Println("telegram processed ", id) + Log.Info("telegram processed ", zap.Int64("id", id)) } else { - log.Println("telegram saved ", id) + Log.Info("telegram saved ", zap.Int64("id", id)) } } func LoadUnprocessed() { - log.Println("loading telegram") + Log.Info("loading telegram") db := getDb() defer db.Close() for { @@ -100,22 +100,23 @@ func LoadUnprocessed() { } for _, t := range telegrams { if WriteToClient(t.text) == nil { + time.Sleep(500 * time.Millisecond) processed(db, t) } } } ClientReady = true - log.Println("client is ready for new telegram") + Log.Info("client is ready for new telegram") } func getTelegram(db *sql.DB) []telegram { var telegrams []telegram num := countTelegram() - log.Println("unprocessed : ", num) + Log.Info("telegram ", zap.Int64("unprocessed", num)) if num < 1 { return telegrams } - log.Println("try to load unprocessed telegram ", num) + Log.Info("try to load unprocessed telegram ") rows, err := db.Query(load) checkDbErr(err, "error in query telegram") defer rows.Close() @@ -137,10 +138,10 @@ func processed(db *sql.DB, t telegram) { checkDbErr(err, "error in create update statement") result, err := stmt.Exec(t.id) checkDbErr(err, "error in update telegram status") - id, _ := result.RowsAffected() - log.Println(t.id, " telegram update : ", id > 0) + rows, _ := result.RowsAffected() + Log.Info("telegram update ", zap.Int64("id", t.id), zap.Bool("result", rows > 0)) isWriting = false - log.Println("release lock") + Log.Debug("release lock") tx.Commit() } @@ -157,20 +158,20 @@ func countTelegram() int64 { func getWriteLock() { count := 0 - log.Println("write lock :", isWriting) + Log.Debug("with ", zap.Bool("lock", isWriting)) for isWriting && count < 10 { - log.Println("waiting for write ") + Log.Info("waiting for write ") time.Sleep(5 * time.Second) count++ } if count >= 10 { - log.Fatalln("database locked") + Log.Fatal("database locked") } isWriting = true } func checkDbErr(err error, msg string) { if err != nil { - log.Fatalln(msg, err) + Log.Fatal(msg, zap.Error(err)) } } diff --git a/utils/telegram.go b/utils/telegram.go index 76935ac..3674111 100644 --- a/utils/telegram.go +++ b/utils/telegram.go @@ -1,9 +1,10 @@ package utils import ( - "log" "regexp" "strings" + + rotatelogs "github.com/lestrrat-go/file-rotatelogs" ) const ( @@ -12,26 +13,34 @@ const ( ) var buffer []byte +var RawLog *rotatelogs.RotateLogs -func Append(data []byte) { +func Append(data []byte) bool { buffer = append(buffer, data...) if buffer[len(buffer)-1] == '\r' { buffer = append(buffer, '\n') } - check() + return check() } -func check() { +func check() bool { teleString := string(buffer) if strings.Index(teleString, EndTag) > 0 { exp, _ := regexp.Compile(Expression) telegram := exp.FindString(string(buffer)) if len(telegram) > 0 { - log.Println("telegram : ", telegram) + // Log.Info("telegram ", zap.String("text", telegram)) + telegram = removeEmpty(telegram) + "\n\n" + RawLog.Write([]byte(telegram)) buffer = nil InsertTelegram(telegram) + return true } } + return false +} +func removeEmpty(s string) string { + return regexp.MustCompile(`[\t\r\n]+`).ReplaceAllString(strings.TrimSpace(s), "\n") }