Skip to content

Commit 0c7f590

Browse files
committed
feat:logger
1 parent 027a0b7 commit 0c7f590

File tree

5 files changed

+150
-37
lines changed

5 files changed

+150
-37
lines changed

cmd/run/service.go

Lines changed: 29 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,21 @@ import (
55
"fmt"
66
"grm/common"
77
"grm/global"
8+
"grm/glog"
89
"grm/router"
910
"grm/web"
1011
"io"
11-
"log"
1212
"net"
1313
"net/http"
1414
"os"
1515
"os/signal"
1616
"time"
1717

18+
"github.com/pkg/errors"
19+
1820
"github.com/gin-gonic/gin"
1921
"github.com/kardianos/service"
22+
"go.uber.org/zap"
2023
)
2124

2225
type Services struct {
@@ -28,21 +31,6 @@ type Services struct {
2831
// 获取 service 对象
2932
func GetSrv() service.Service {
3033

31-
path, err := common.RootPath()
32-
if err != nil {
33-
fmt.Println(err)
34-
os.Exit(0)
35-
}
36-
37-
File, err := common.OpenFile(path + "/log/service.log")
38-
if err != nil {
39-
fmt.Println(err)
40-
os.Exit(0)
41-
}
42-
defer File.Close()
43-
44-
log.SetOutput(File)
45-
4634
s := &Services{
4735
Cfg: &service.Config{
4836
Name: "grm",
@@ -52,11 +40,15 @@ func GetSrv() service.Service {
5240
}}
5341
serv, err := service.New(s, s.Cfg)
5442
if err != nil {
55-
log.Printf("Set logger error:%s\n", err.Error())
43+
errMsg := fmt.Sprintf("%+v", errors.WithStack(err))
44+
glog.Logger.Error(errMsg, zap.Error(err))
45+
os.Exit(0)
5646
}
5747
s.Log, err = serv.SystemLogger(nil)
5848
if err != nil {
59-
log.Printf("Set logger error:%s\n", err.Error())
49+
errMsg := fmt.Sprintf("%+v", errors.WithStack(err))
50+
glog.Logger.Error(errMsg, zap.Error(err))
51+
os.Exit(0)
6052
}
6153

6254
return serv
@@ -78,7 +70,6 @@ func (srv *Services) Stop(s service.Service) error {
7870
if srv.Log != nil {
7971
srv.Log.Info("Start stop http server")
8072
}
81-
log.Println("Server exiting")
8273
return srv.Srv.Shutdown(context.Background())
8374
}
8475

@@ -88,19 +79,21 @@ func (srv *Services) StarServer() {
8879
gin.DisableConsoleColor()
8980
gin.SetMode(gin.ReleaseMode)
9081

91-
path, err := common.RootPath()
92-
if err != nil {
93-
fmt.Println(err)
94-
os.Exit(0)
95-
}
82+
// path, err := common.RootPath()
83+
// if err != nil {
84+
// errMsg := fmt.Sprintf("%+v", errors.WithStack(err))
85+
// glog.Logger.Error(errMsg, zap.Error(err))
86+
// os.Exit(0)
87+
// }
9688

9789
// 创建记录日志的文件
98-
f, err := common.OpenFile(path + "/log/grm_error.log")
99-
if err != nil {
100-
fmt.Println(err)
101-
os.Exit(0)
102-
}
103-
gin.DefaultErrorWriter = io.MultiWriter(f)
90+
// f, err := common.OpenFile(path + "/log/grm_error.log")
91+
// if err != nil {
92+
// errMsg := fmt.Sprintf("%+v", errors.WithStack(err))
93+
// glog.Logger.Error(errMsg, zap.Error(err))
94+
// os.Exit(0)
95+
// }
96+
// gin.DefaultErrorWriter = io.MultiWriter(f)
10497
gin.DefaultWriter = io.Discard
10598

10699
router := router.Init()
@@ -114,7 +107,8 @@ func (srv *Services) StarServer() {
114107

115108
go func() {
116109
if err := srv.Srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
117-
log.Fatalf("listen: %s\n", err)
110+
errMsg := fmt.Sprintf("%+v", errors.WithStack(err))
111+
glog.Logger.Error(errMsg, zap.Error(err))
118112
}
119113
}()
120114

@@ -127,15 +121,16 @@ func (srv *Services) StarServer() {
127121

128122
<-quit
129123

130-
log.Println("Shutdown Server ...")
124+
glog.Logger.Info("Shutdown Server ...")
131125

132126
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
133127

134128
defer cancel()
135129

136130
if err := srv.Srv.Shutdown(ctx); err != nil {
137-
log.Fatal("Server Shutdown:", err)
131+
errMsg := fmt.Sprintf("%+v", errors.WithStack(err))
132+
glog.Logger.Error(errMsg, zap.Error(err))
138133
}
139134

140-
log.Println("Server exiting")
135+
glog.Logger.Info("Server exiting")
141136
}

glog/log.go

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package glog
2+
3+
import (
4+
"grm/common"
5+
6+
"go.uber.org/zap"
7+
"go.uber.org/zap/zapcore"
8+
"gopkg.in/natefinch/lumberjack.v2"
9+
)
10+
11+
var Logger *zap.Logger
12+
13+
func init() {
14+
Logger = NewLogger("service.log")
15+
}
16+
17+
func NewLogger(path string) *zap.Logger {
18+
19+
rootPath, _ := common.RootPath()
20+
21+
hook := lumberjack.Logger{
22+
Filename: rootPath + "/log/" + path, // 日志文件路径
23+
MaxSize: 128, // 每个日志文件保存的最大尺寸 单位:M
24+
MaxBackups: 30, // 日志文件最多保存多少个备份
25+
MaxAge: 7, // 文件最多保存多少天
26+
Compress: true, // 是否压缩
27+
}
28+
29+
encoderConfig := zapcore.EncoderConfig{
30+
TimeKey: "time",
31+
LevelKey: "level",
32+
NameKey: "logger",
33+
CallerKey: "linenum",
34+
MessageKey: "msg",
35+
StacktraceKey: "stacktrace",
36+
LineEnding: zapcore.DefaultLineEnding,
37+
EncodeLevel: zapcore.LowercaseLevelEncoder, // 小写编码器
38+
EncodeTime: zapcore.ISO8601TimeEncoder, // ISO8601 UTC 时间格式
39+
EncodeDuration: zapcore.SecondsDurationEncoder, //
40+
EncodeCaller: zapcore.FullCallerEncoder, // 全路径编码器
41+
EncodeName: zapcore.FullNameEncoder,
42+
}
43+
44+
// 设置日志级别
45+
atomicLevel := zap.NewAtomicLevel()
46+
atomicLevel.SetLevel(zap.InfoLevel)
47+
48+
core := zapcore.NewCore(
49+
zapcore.NewJSONEncoder(encoderConfig), // 编码器配置
50+
zapcore.NewMultiWriteSyncer(zapcore.AddSync(&hook)), // 打印到控制台和文件
51+
atomicLevel, // 日志级别
52+
)
53+
54+
// 构造日志
55+
return zap.New(core)
56+
57+
}

middleware/log.go

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package middleware
2+
3+
import (
4+
"net"
5+
"net/http"
6+
"net/http/httputil"
7+
"os"
8+
"runtime/debug"
9+
"strings"
10+
11+
"github.com/gin-gonic/gin"
12+
"go.uber.org/zap"
13+
)
14+
15+
func GinRecovery(logger *zap.Logger, stack bool) gin.HandlerFunc {
16+
return func(c *gin.Context) {
17+
defer func() {
18+
if err := recover(); err != nil {
19+
// Check for a broken connection, as it is not really a
20+
// condition that warrants a panic stack trace.
21+
var brokenPipe bool
22+
if ne, ok := err.(*net.OpError); ok {
23+
if se, ok := ne.Err.(*os.SyscallError); ok {
24+
if strings.Contains(strings.ToLower(se.Error()), "broken pipe") || strings.Contains(strings.ToLower(se.Error()), "connection reset by peer") {
25+
brokenPipe = true
26+
}
27+
}
28+
}
29+
30+
httpRequest, _ := httputil.DumpRequest(c.Request, false)
31+
if brokenPipe {
32+
logger.Error(c.Request.URL.Path,
33+
zap.Any("error", err),
34+
zap.String("request", string(httpRequest)),
35+
)
36+
// If the connection is dead, we can't write a status to it.
37+
c.Error(err.(error)) // nolint: errcheck
38+
c.Abort()
39+
return
40+
}
41+
42+
if stack {
43+
logger.Error("[Recovery from panic]",
44+
zap.Any("error", err),
45+
zap.String("request", string(httpRequest)),
46+
zap.String("stack", string(debug.Stack())),
47+
)
48+
} else {
49+
logger.Error("[Recovery from panic]",
50+
zap.Any("error", err),
51+
zap.String("request", string(httpRequest)),
52+
)
53+
}
54+
c.AbortWithStatus(http.StatusInternalServerError)
55+
}
56+
}()
57+
c.Next()
58+
}
59+
}

router/default.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ package router
77

88
import (
99
"grm/controllers"
10+
"grm/glog"
1011
"grm/middleware"
1112
"net/http"
1213

@@ -17,11 +18,11 @@ import (
1718
)
1819

1920
func Init() *gin.Engine {
20-
router := gin.Default()
21+
router := gin.New()
2122

2223
store := cookie.NewStore([]byte("goredismanagerphper"))
2324
router.Use(middleware.StaticCache(), gzip.Gzip(gzip.DefaultCompression), sessions.Sessions("goredismanager", store))
24-
router.Use(gin.Logger(), gin.Recovery())
25+
router.Use(gin.Logger(), middleware.GinRecovery(glog.NewLogger("gin_error.log"), true))
2526
router.NoRoute(func(ctx *gin.Context) {
2627
ctx.Redirect(http.StatusMovedPermanently, "/static/#")
2728
})

service/service.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"context"
1010
"grm/common"
1111
"grm/global"
12+
"grm/glog"
1213
"net"
1314
"time"
1415

@@ -40,7 +41,7 @@ func NewRedisClient(conf global.RedisService) (*redis.Client, error) {
4041
client := redis.NewClient(optConf)
4142

4243
client.AddHook(common.RedisLog{
43-
Logger: common.NewLogger(conf.RedisService),
44+
Logger: glog.NewLogger(conf.RedisService + "/redis.log"),
4445
})
4546

4647
_, err := client.Ping(ctx).Result()

0 commit comments

Comments
 (0)