github.com/kaydxh/golang@v0.0.131/pkg/logs/log.go (about) 1 /* 2 *Copyright (c) 2022, kaydxh 3 * 4 *Permission is hereby granted, free of charge, to any person obtaining a copy 5 *of this software and associated documentation files (the "Software"), to deal 6 *in the Software without restriction, including without limitation the rights 7 *to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 8 *copies of the Software, and to permit persons to whom the Software is 9 *furnished to do so, subject to the following conditions: 10 * 11 *The above copyright notice and this permission notice shall be included in all 12 *copies or substantial portions of the Software. 13 * 14 *THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 *IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 *FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 17 *AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18 *LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 19 *OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 20 *SOFTWARE. 21 */ 22 package logs 23 24 import ( 25 "context" 26 "fmt" 27 "os" 28 "time" 29 30 context_ "github.com/kaydxh/golang/go/context" 31 rotate_ "github.com/kaydxh/golang/pkg/file-rotate" 32 "github.com/sirupsen/logrus" 33 ) 34 35 type Rotate struct { 36 maxAge time.Duration 37 maxCount int64 38 rotateSize int64 39 rotateInterval time.Duration 40 prefixName string 41 suffixName string 42 } 43 44 func WithRotate(log *logrus.Logger, filedir string, redirect Log_Redirct, options ...RotateOption) error { 45 if log == nil { 46 return fmt.Errorf("log is nil") 47 } 48 49 var rotate Rotate 50 rotate.ApplyOptions(options...) 51 52 rotateFiler, _ := rotate_.NewRotateFiler( 53 filedir, 54 rotate_.WithMaxAge(rotate.maxAge), 55 rotate_.WithMaxCount(rotate.maxCount), 56 rotate_.WithRotateInterval(rotate.rotateInterval), 57 rotate_.WithRotateSize(rotate.rotateSize), 58 rotate_.WithPrefixName(rotate.prefixName), 59 rotate_.WithSuffixName(rotate.suffixName), 60 ) 61 log.AddHook(HookHandler(func(entry *logrus.Entry) error { 62 var ( 63 msg []byte 64 err error 65 ) 66 67 if log.Formatter == nil { 68 msg, err = entry.Bytes() 69 } else { 70 msg, err = log.Formatter.Format(entry) 71 } 72 if err != nil { 73 return err 74 } 75 //if opt.MuteDirectlyOutput && entry.Level <= logrus.WarnLevel { 76 /* 77 if entry.Level <= logrus.WarnLevel { 78 if out != nil { 79 _, _ = out.Write(msg) 80 } 81 } 82 */ 83 //https://eli.thegreenplace.net/2020/faking-stdin-and-stdout-in-go/ 84 //https://github.com/eliben/code-for-blog/blob/master/2020/go-fake-stdio/snippets/redirect-cgo-stdout.go 85 file, _, err := rotateFiler.Write([]byte(msg)) 86 if err == nil { 87 if redirect == Log_file { 88 os.Stdout = file 89 os.Stderr = file 90 } 91 } 92 93 return err 94 })) 95 96 return nil 97 } 98 99 func GetLogger(ctx context.Context) *logrus.Entry { 100 logger := logrus.WithField("request_id", context_.ExtractRequestIDFromContext(ctx)) 101 return logger 102 } 103 104 func GetLoggerOrFallback(ctx context.Context, defaultValue string) *logrus.Entry { 105 requestId := context_.ExtractRequestIDFromContext(ctx) 106 if requestId == "" { 107 requestId = defaultValue 108 } 109 logger := logrus.WithField("request_id", requestId) 110 return logger 111 }