mirror of
https://github.com/nabbar/golib.git
synced 2025-10-05 07:46:56 +08:00
Package Logger :
- fix buffer wrtting / cleanning - add recovery to catch fatal error Package Server : - add recovery to catch fatal error Package Status : - add IsHealthy function with cache value to prevent checking monitor on all call Bump dependencies
This commit is contained in:
@@ -40,6 +40,14 @@ import (
|
||||
|
||||
const sizeBuffer = 32 * 1024
|
||||
|
||||
func (o *hkf) newBuffer(size int) *bytes.Buffer {
|
||||
if size > 0 {
|
||||
return bytes.NewBuffer(make([]byte, 0, size))
|
||||
}
|
||||
|
||||
return bytes.NewBuffer(make([]byte, 0, sizeBuffer))
|
||||
}
|
||||
|
||||
func (o *hkf) writeBuffer(buf *bytes.Buffer) error {
|
||||
var (
|
||||
e error
|
||||
@@ -48,6 +56,7 @@ func (o *hkf) writeBuffer(buf *bytes.Buffer) error {
|
||||
m = o.getFileMode()
|
||||
n = o.getPathMode()
|
||||
f = o.getFlags()
|
||||
b = o.newBuffer(0)
|
||||
)
|
||||
|
||||
if o.getCreatePath() {
|
||||
@@ -57,6 +66,9 @@ func (o *hkf) writeBuffer(buf *bytes.Buffer) error {
|
||||
}
|
||||
|
||||
defer func() {
|
||||
if rec := recover(); rec != nil {
|
||||
_, _ = fmt.Fprintf(os.Stderr, "recovering panic thread.\n%v\n", rec)
|
||||
}
|
||||
if h != nil {
|
||||
_ = h.Close()
|
||||
}
|
||||
@@ -68,32 +80,37 @@ func (o *hkf) writeBuffer(buf *bytes.Buffer) error {
|
||||
return e
|
||||
} else if _, e = h.Write(buf.Bytes()); e != nil {
|
||||
return e
|
||||
} else if e = h.Close(); e != nil {
|
||||
h = nil
|
||||
buf.Reset()
|
||||
return e
|
||||
} else {
|
||||
h = nil
|
||||
}
|
||||
|
||||
buf.Reset()
|
||||
return nil
|
||||
*buf = *b
|
||||
e = h.Close()
|
||||
h = nil
|
||||
|
||||
return e
|
||||
}
|
||||
|
||||
func (o *hkf) freeBuffer(buf *bytes.Buffer, size int) *bytes.Buffer {
|
||||
var a = bytes.NewBuffer(buf.Bytes()[size:])
|
||||
a.Grow(size)
|
||||
defer func() {
|
||||
if rec := recover(); rec != nil {
|
||||
_, _ = fmt.Fprintf(os.Stderr, "recovering panic thread.\n%v\n", rec)
|
||||
}
|
||||
}()
|
||||
var a = o.newBuffer(buf.Cap())
|
||||
a.WriteString(buf.String()[size:])
|
||||
return a
|
||||
}
|
||||
|
||||
func (o *hkf) Run(ctx context.Context) {
|
||||
var (
|
||||
b = bytes.NewBuffer(make([]byte, sizeBuffer))
|
||||
b = o.newBuffer(0)
|
||||
t = time.NewTicker(time.Second)
|
||||
e error
|
||||
)
|
||||
|
||||
defer func() {
|
||||
if rec := recover(); rec != nil {
|
||||
_, _ = fmt.Fprintf(os.Stderr, "recovering panic thread.\n%v\n", rec)
|
||||
}
|
||||
//flush buffer before exit function
|
||||
if b.Len() > 0 {
|
||||
if e = o.writeBuffer(b); e != nil {
|
||||
@@ -123,9 +140,11 @@ func (o *hkf) Run(ctx context.Context) {
|
||||
|
||||
case p := <-o.Data():
|
||||
// prevent buffer overflow
|
||||
if b.Len()+len(p) >= sizeBuffer {
|
||||
b = o.freeBuffer(b, len(p))
|
||||
b.Write(p)
|
||||
if b.Len()+len(p) >= b.Cap() {
|
||||
if a := o.freeBuffer(b, len(p)); a != nil {
|
||||
b = a
|
||||
b.Write(p)
|
||||
}
|
||||
} else {
|
||||
_, _ = b.Write(p)
|
||||
}
|
||||
|
Reference in New Issue
Block a user