1
1
package main
2
2
3
3
import (
4
+ "context"
4
5
"flag"
5
6
"fmt"
6
7
"log"
7
8
"os"
9
+ "os/signal"
8
10
"runtime/debug"
9
11
10
- "rsc.io/quote"
12
+ "go.uber.org/zap"
13
+ "go.uber.org/zap/zapcore"
11
14
)
12
15
13
16
const projectName = "Go Project Template" // REPLACE WITH YOUR PROJECT NAME HERE
14
17
15
- var printVersion bool
18
+ var (
19
+ debugLogs bool
20
+ logPath string
21
+ printVersion bool
22
+ )
16
23
17
24
func usage () {
18
25
fmt .Fprintf (os .Stderr , `
19
26
<Project description>
20
27
21
28
<binary name> [flags]
22
-
29
+
23
30
<Project details/usage>
24
31
25
32
%s accepts the following flags:
@@ -34,6 +41,8 @@ For more information, see https://github.com/<user>/<repo>.
34
41
35
42
func init () {
36
43
flag .Usage = usage
44
+ flag .BoolVar (& debugLogs , "debug" , false , "enable debug logging" )
45
+ flag .StringVar (& logPath , "l" , "stdout" , "path to log to" )
37
46
flag .BoolVar (& printVersion , "version" , false , "print version and build information and exit" )
38
47
}
39
48
@@ -55,8 +64,44 @@ func mainRetCode() int {
55
64
return 0
56
65
}
57
66
58
- // REPLACE WITH YOUR CODE HERE
59
- fmt .Println (quote .Glass ())
67
+ // build logger
68
+ logCfg := zap .NewProductionConfig ()
69
+ logCfg .OutputPaths = []string {logPath }
70
+ if debugLogs {
71
+ logCfg .Level .SetLevel (zap .DebugLevel )
72
+ }
73
+ logCfg .EncoderConfig .TimeKey = "time"
74
+ logCfg .EncoderConfig .EncodeTime = zapcore .RFC3339NanoTimeEncoder
75
+ logCfg .DisableCaller = true
76
+
77
+ logger , err := logCfg .Build ()
78
+ if err != nil {
79
+ log .Printf ("error creating logger: %v" , err )
80
+ return 1
81
+ }
82
+
83
+ // may also want to add syscall.SIGTERM on unix based OSes
84
+ ctx , cancel := signal .NotifyContext (context .Background (), os .Interrupt )
85
+ defer cancel ()
86
+
87
+ // log current version/commit
88
+ versionFields := []zap.Field {
89
+ zap .String ("version" , version ),
90
+ }
91
+ for _ , buildSetting := range info .Settings {
92
+ if buildSetting .Key == "vcs.revision" {
93
+ versionFields = append (versionFields , zap .String ("commit" , buildSetting .Value ))
94
+ break
95
+ }
96
+ }
97
+ logger .Info ("starting " + projectName , versionFields ... )
98
+
99
+ // START MAIN LOGIC HERE
100
+
101
+ <- ctx .Done ()
102
+ logger .Info ("shutting down" )
103
+
104
+ // STOP MAIN LOGIC HERE
60
105
61
106
return 0
62
107
}
0 commit comments