Skip to content

Commit 7bcb0a2

Browse files
[CSVDB-11] logging into files using zap (#10)
* [CSVDB-10] Bug fixed * [CSVDB-11] logging into files using zap
1 parent a9ca955 commit 7bcb0a2

File tree

5 files changed

+139
-8
lines changed

5 files changed

+139
-8
lines changed

README.md

+1
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ fields: # Список полей в таблице
6363
- [x] \(CSVDB-9) Реализовать конфигурирование посредством yaml-файла
6464
- [x] \(CSVDB-10) Реализовать секцию `from`
6565
- [x] \(CSVDB-11) Реализовать секцию `select`
66+
- [x] \(CSVDB-11) Перенести логирование в файлы `access.log` и `error.log`
6667

6768
## Локальная настройка окружения
6869

cmd/csvdb/csvdb.go

+26-6
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,24 @@ import (
66
"fmt"
77
"os"
88
"strings"
9+
"time"
910

1011
"github.com/stepan2volkov/csvdb/internal/app"
1112
"github.com/stepan2volkov/csvdb/internal/app/table/formatter"
1213
"github.com/stepan2volkov/csvdb/internal/app/table/loader"
14+
"github.com/stepan2volkov/csvdb/internal/logger"
15+
"go.uber.org/zap"
1316
)
1417

1518
func main() {
19+
log := logger.GetLogger()
20+
log.Info("starting csv-db")
1621
a := app.NewApp()
1722
f := formatter.DefaultFormatter{}
23+
1824
scanner := bufio.NewScanner(os.Stdin)
1925

26+
log.Info("csv-db has been ready to accept queries")
2027
for {
2128
fmt.Print("~# ")
2229

@@ -35,36 +42,49 @@ func main() {
3542
in = strings.TrimSpace(strings.TrimPrefix(in, `\load`))
3643
args := strings.Split(in, " ")
3744
if len(args) != 2 {
38-
fmt.Println("\tThe right syntax: \n\t\\load <csv-path> <config-path>")
45+
fmt.Printf("wrong syntax for \\load: '%s'\n", in)
3946
continue
4047
}
4148
t, err := loader.LoadFromCSV(args[0], args[1])
4249
if err != nil {
43-
fmt.Printf("ERROR: %v\n", err)
50+
fmt.Printf("error when loading from csv: %v\n", err)
4451
continue
4552
}
4653
if err = a.LoadTable(t); err != nil {
47-
fmt.Printf("ERROR: %v\n", err)
54+
fmt.Printf("error when loading table: %v\n", err)
55+
log.Error("error when loading table",
56+
zap.Error(err))
4857
}
4958
case in == `\list`:
5059
fmt.Println(strings.Join(a.TableList(), "\n"))
5160
case in == `\help`:
5261
case strings.HasPrefix(in, `\drop`):
5362
newTableName := strings.TrimSpace(strings.TrimPrefix(in, `\drop`))
5463
if newTableName == "" {
55-
fmt.Println("\tThe right syntax: \n\t\\drop <tablename>")
64+
fmt.Printf("wrong syntax for \\drop: '%s'\n", in)
5665
continue
5766
}
5867
if err := a.DropTable(newTableName); err != nil {
59-
fmt.Printf("\t%v\n", err)
68+
fmt.Printf("error when dropping table: '%v'\n", err)
69+
log.Error("error when dropping table",
70+
zap.Error(err))
6071
}
6172
default:
73+
start := time.Now()
6274
res, err := a.Execute(context.Background(), in)
6375
if err != nil {
64-
fmt.Printf("ERROR: %v\n", err)
76+
fmt.Printf("error: %v\n", err)
77+
log.Error("error executing query",
78+
zap.String("query", in),
79+
zap.Error(err))
6580
continue
6681
}
82+
duration := time.Since(start)
6783
fmt.Println(f.Format(res))
84+
log.Info("query has been executed",
85+
zap.String("query", in),
86+
zap.String("table", res.Name),
87+
zap.Duration("duration", duration))
6888
}
6989
}
7090
}

go.mod

+4-1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ go 1.17
55
require (
66
github.com/jedib0t/go-pretty/v6 v6.2.7
77
github.com/stretchr/testify v1.7.0
8+
go.uber.org/zap v1.21.0
89
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b
910
)
1011

@@ -15,6 +16,8 @@ require (
1516
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect
1617
github.com/pmezard/go-difflib v1.0.0 // indirect
1718
github.com/rivo/uniseg v0.2.0 // indirect
18-
golang.org/x/sys v0.0.0-20190412213103-97732733099d // indirect
19+
go.uber.org/atomic v1.9.0 // indirect
20+
go.uber.org/multierr v1.8.0 // indirect
21+
golang.org/x/sys v0.0.0-20210510120138-977fb7262007 // indirect
1922
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f // indirect
2023
)

go.sum

+45-1
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
1+
github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8=
2+
github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
13
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
24
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
35
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
46
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
57
github.com/jedib0t/go-pretty/v6 v6.2.7 h1:4823Lult/tJ0VI1PgW3aSKw59pMWQ6Kzv9b3Bj6MwY0=
68
github.com/jedib0t/go-pretty/v6 v6.2.7/go.mod h1:FMkOpgGD3EZ91cW8g/96RfxoV7bdeJyzXPYgz1L1ln0=
9+
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
710
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
811
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
912
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
@@ -12,20 +15,61 @@ github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4
1215
github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
1316
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs=
1417
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
18+
github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
19+
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
1520
github.com/pkg/profile v1.6.0/go.mod h1:qBsxPvzyUincmltOk6iyRVxHYg4adc0OFOv72ZdLa18=
1621
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
1722
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
1823
github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY=
1924
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
2025
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
26+
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
2127
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
2228
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
29+
github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
30+
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
31+
go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE=
32+
go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
33+
go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI=
34+
go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
35+
go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
36+
go.uber.org/multierr v1.8.0 h1:dg6GjLku4EH+249NNmoIciG9N/jURbDG+pFlTkhzIC8=
37+
go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak=
38+
go.uber.org/zap v1.21.0 h1:WefMeulhovoZ2sYXz7st6K0sLj7bBhpiFaud4r4zST8=
39+
go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw=
40+
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
41+
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
42+
golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
43+
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
44+
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
45+
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
46+
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
47+
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
48+
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
49+
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
2350
golang.org/x/sys v0.0.0-20180816055513-1c9583448a9c/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
24-
golang.org/x/sys v0.0.0-20190412213103-97732733099d h1:+R4KGOnez64A81RvjARKc4UT5/tI9ujCIVX+P5KiHuI=
51+
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
2552
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
53+
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
54+
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
55+
golang.org/x/sys v0.0.0-20210510120138-977fb7262007 h1:gG67DSER+11cZvqIMb8S8bt0vZtiN6xWYARwirrOSfE=
56+
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
57+
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
58+
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
59+
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
60+
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
61+
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
62+
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
63+
golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
64+
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
65+
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
66+
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
2667
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
68+
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
2769
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU=
2870
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
71+
gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10=
72+
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
2973
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
3074
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo=
3175
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

internal/logger/logger.go

+63
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package logger
2+
3+
import (
4+
"fmt"
5+
"os"
6+
7+
"go.uber.org/zap"
8+
"go.uber.org/zap/zapcore"
9+
)
10+
11+
var (
12+
logger *zap.Logger
13+
)
14+
15+
func init() {
16+
highPriority := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool {
17+
return lvl >= zapcore.ErrorLevel
18+
})
19+
lowPriority := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool {
20+
return lvl < zapcore.ErrorLevel
21+
})
22+
accessEncoder := zapcore.NewJSONEncoder(zapcore.EncoderConfig{
23+
MessageKey: "message",
24+
LevelKey: "level",
25+
TimeKey: "timestamp",
26+
EncodeLevel: zapcore.LowercaseLevelEncoder,
27+
EncodeTime: zapcore.ISO8601TimeEncoder,
28+
})
29+
errorEncoder := zapcore.NewJSONEncoder(zapcore.EncoderConfig{
30+
MessageKey: "message",
31+
LevelKey: "level",
32+
TimeKey: "timestamp",
33+
EncodeLevel: zapcore.LowercaseLevelEncoder,
34+
EncodeTime: zapcore.ISO8601TimeEncoder,
35+
})
36+
37+
errorFile, err := os.OpenFile("error.log", os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644)
38+
if err != nil {
39+
msg := fmt.Sprintf("error when createing error.log file: %v", err)
40+
panic(msg)
41+
}
42+
errorSync := zapcore.AddSync(errorFile)
43+
44+
accessFile, err := os.OpenFile("access.log", os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644)
45+
if err != nil {
46+
msg := fmt.Sprintf("error when createing access.log file: %v", err)
47+
panic(msg)
48+
}
49+
accessSync := zapcore.AddSync(accessFile)
50+
51+
core := zapcore.NewTee(
52+
zapcore.NewCore(accessEncoder, accessSync, lowPriority),
53+
zapcore.NewCore(errorEncoder, errorSync, highPriority),
54+
)
55+
56+
ret := zap.New(core)
57+
58+
logger = ret
59+
}
60+
61+
func GetLogger() *zap.Logger {
62+
return logger
63+
}

0 commit comments

Comments
 (0)