|
@@ -3,6 +3,7 @@ package log_buf
|
|
|
|
|
|
|
|
import (
|
|
import (
|
|
|
"fmt"
|
|
"fmt"
|
|
|
|
|
+ "sync"
|
|
|
|
|
|
|
|
"gitp78su.ipnodns.ru/svi/kern/kc/log_buf/log_msg"
|
|
"gitp78su.ipnodns.ru/svi/kern/kc/log_buf/log_msg"
|
|
|
. "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
|
|
. "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
|
|
@@ -10,148 +11,24 @@ import (
|
|
|
|
|
|
|
|
// logBuf -- потокобезопасный буфер лога
|
|
// logBuf -- потокобезопасный буфер лога
|
|
|
type logBuf struct {
|
|
type logBuf struct {
|
|
|
- chGetIn chan int
|
|
|
|
|
- chGetOut chan ILogMsg
|
|
|
|
|
-
|
|
|
|
|
- chDebugIn chan tMsg
|
|
|
|
|
- chDebugOut chan int
|
|
|
|
|
-
|
|
|
|
|
- chInfoIn chan tMsg
|
|
|
|
|
- chInfoOut chan int
|
|
|
|
|
-
|
|
|
|
|
- chWarnIn chan tMsg
|
|
|
|
|
- chWarnOut chan int
|
|
|
|
|
-
|
|
|
|
|
- chErrorIn chan tMsg
|
|
|
|
|
-
|
|
|
|
|
- lst []ILogMsg
|
|
|
|
|
-
|
|
|
|
|
- chGetErrIn chan int
|
|
|
|
|
- chGetErrOut chan ILogMsg
|
|
|
|
|
- lstErr []ILogMsg
|
|
|
|
|
-
|
|
|
|
|
- chSizeIn chan int
|
|
|
|
|
- chSizeOut chan int
|
|
|
|
|
|
|
+ sync.RWMutex
|
|
|
|
|
+ lst []ILogMsg
|
|
|
|
|
+ lstErr []ILogMsg
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// NewLogBuf -- возвращает новый потокобезопасный буфер лога
|
|
// NewLogBuf -- возвращает новый потокобезопасный буфер лога
|
|
|
func NewLogBuf() ILogBuf {
|
|
func NewLogBuf() ILogBuf {
|
|
|
sf := &logBuf{
|
|
sf := &logBuf{
|
|
|
- chGetIn: make(chan int, 2),
|
|
|
|
|
- chGetOut: make(chan ILogMsg, 2),
|
|
|
|
|
-
|
|
|
|
|
- chDebugIn: make(chan tMsg, 2),
|
|
|
|
|
- chDebugOut: make(chan int, 2),
|
|
|
|
|
-
|
|
|
|
|
- chInfoIn: make(chan tMsg, 2),
|
|
|
|
|
- chInfoOut: make(chan int, 2),
|
|
|
|
|
-
|
|
|
|
|
- chWarnIn: make(chan tMsg, 2),
|
|
|
|
|
- chWarnOut: make(chan int, 2),
|
|
|
|
|
-
|
|
|
|
|
- chErrorIn: make(chan tMsg, 2),
|
|
|
|
|
-
|
|
|
|
|
- lst: []ILogMsg{},
|
|
|
|
|
-
|
|
|
|
|
- chGetErrIn: make(chan int, 2),
|
|
|
|
|
- chGetErrOut: make(chan ILogMsg, 2),
|
|
|
|
|
- lstErr: []ILogMsg{},
|
|
|
|
|
-
|
|
|
|
|
- chSizeIn: make(chan int, 2),
|
|
|
|
|
- chSizeOut: make(chan int, 2),
|
|
|
|
|
|
|
+ lst: []ILogMsg{},
|
|
|
|
|
+ lstErr: []ILogMsg{},
|
|
|
}
|
|
}
|
|
|
- go sf.run()
|
|
|
|
|
return sf
|
|
return sf
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// GetErr -- возвращает сообщение ошибки по номеру
|
|
// GetErr -- возвращает сообщение ошибки по номеру
|
|
|
func (sf *logBuf) GetErr(num int) ILogMsg {
|
|
func (sf *logBuf) GetErr(num int) ILogMsg {
|
|
|
- sf.chGetErrIn <- num
|
|
|
|
|
- return <-sf.chGetErrOut
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-// Get -- возвращает сообщение по номеру
|
|
|
|
|
-func (sf *logBuf) Get(num int) ILogMsg {
|
|
|
|
|
- sf.chGetIn <- num
|
|
|
|
|
- return <-sf.chGetOut
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-type tMsg struct {
|
|
|
|
|
- text string
|
|
|
|
|
- args []any
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-// Debug -- сообщение отладки
|
|
|
|
|
-func (sf *logBuf) Debug(fMsg string, args ...any) {
|
|
|
|
|
- msg := tMsg{
|
|
|
|
|
- text: fMsg,
|
|
|
|
|
- args: args,
|
|
|
|
|
- }
|
|
|
|
|
- sf.chDebugIn <- msg
|
|
|
|
|
- <-sf.chDebugOut
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-// Info -- информационные сообщения
|
|
|
|
|
-func (sf *logBuf) Info(fMsg string, args ...any) {
|
|
|
|
|
- msg := tMsg{
|
|
|
|
|
- text: fMsg,
|
|
|
|
|
- args: args,
|
|
|
|
|
- }
|
|
|
|
|
- sf.chInfoIn <- msg
|
|
|
|
|
- <-sf.chInfoOut
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-// Warn -- предупреждающие сообщения
|
|
|
|
|
-func (sf *logBuf) Warn(fMsg string, args ...any) {
|
|
|
|
|
- msg := tMsg{
|
|
|
|
|
- text: fMsg,
|
|
|
|
|
- args: args,
|
|
|
|
|
- }
|
|
|
|
|
- sf.chWarnIn <- msg
|
|
|
|
|
- <-sf.chWarnOut
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-// Err -- сообщения об ошибках
|
|
|
|
|
-func (sf *logBuf) Err(fMsg string, args ...any) {
|
|
|
|
|
- msg := tMsg{
|
|
|
|
|
- text: fMsg,
|
|
|
|
|
- args: args,
|
|
|
|
|
- }
|
|
|
|
|
- sf.chErrorIn <- msg
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-// Size -- возвращает размер буфера
|
|
|
|
|
-func (sf *logBuf) Size() int {
|
|
|
|
|
- sf.chSizeIn <- 1
|
|
|
|
|
- return <-sf.chSizeOut
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-func (sf *logBuf) run() {
|
|
|
|
|
- for {
|
|
|
|
|
- select {
|
|
|
|
|
- case num := <-sf.chGetErrIn:
|
|
|
|
|
- sf.chGetErrOut <- sf.getErr(num)
|
|
|
|
|
- case num := <-sf.chGetIn:
|
|
|
|
|
- sf.chGetOut <- sf.get(num)
|
|
|
|
|
- case msg := <-sf.chDebugIn:
|
|
|
|
|
- sf.debug(msg)
|
|
|
|
|
- sf.chDebugOut <- 1
|
|
|
|
|
- case msg := <-sf.chInfoIn:
|
|
|
|
|
- sf.info(msg)
|
|
|
|
|
- sf.chInfoOut <- 1
|
|
|
|
|
- case msg := <-sf.chWarnIn:
|
|
|
|
|
- sf.warn(msg)
|
|
|
|
|
- sf.chWarnOut <- 1
|
|
|
|
|
- case msg := <-sf.chErrorIn:
|
|
|
|
|
- sf.err(msg)
|
|
|
|
|
- case <-sf.chSizeIn:
|
|
|
|
|
- sf.chSizeOut <- len(sf.lst)
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-// Возвращает сообщение ошибки по номеру
|
|
|
|
|
-func (sf *logBuf) getErr(num int) ILogMsg {
|
|
|
|
|
|
|
+ sf.RLock()
|
|
|
|
|
+ defer sf.RUnlock()
|
|
|
if len(sf.lstErr) == 0 {
|
|
if len(sf.lstErr) == 0 {
|
|
|
return log_msg.NewLogMsg(log_msg.DEBUG, "not error msg")
|
|
return log_msg.NewLogMsg(log_msg.DEBUG, "not error msg")
|
|
|
}
|
|
}
|
|
@@ -164,8 +41,10 @@ func (sf *logBuf) getErr(num int) ILogMsg {
|
|
|
return sf.lstErr[num]
|
|
return sf.lstErr[num]
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-// возвращает сообщение по номеру
|
|
|
|
|
-func (sf *logBuf) get(num int) ILogMsg {
|
|
|
|
|
|
|
+// Get -- возвращает сообщение по номеру
|
|
|
|
|
+func (sf *logBuf) Get(num int) ILogMsg {
|
|
|
|
|
+ sf.RLock()
|
|
|
|
|
+ defer sf.RUnlock()
|
|
|
if len(sf.lst) == 0 {
|
|
if len(sf.lst) == 0 {
|
|
|
return log_msg.NewLogMsg(log_msg.DEBUG, "*no msg*")
|
|
return log_msg.NewLogMsg(log_msg.DEBUG, "*no msg*")
|
|
|
}
|
|
}
|
|
@@ -178,32 +57,61 @@ func (sf *logBuf) get(num int) ILogMsg {
|
|
|
return sf.lst[num]
|
|
return sf.lst[num]
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-// сообщение отладки
|
|
|
|
|
-func (sf *logBuf) debug(msg tMsg) {
|
|
|
|
|
|
|
+type tMsg struct {
|
|
|
|
|
+ text string
|
|
|
|
|
+ args []any
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+// Debug -- сообщение отладки
|
|
|
|
|
+func (sf *logBuf) Debug(fMsg string, args ...any) {
|
|
|
|
|
+ sf.Lock()
|
|
|
|
|
+ defer sf.Unlock()
|
|
|
|
|
+ msg := tMsg{
|
|
|
|
|
+ text: fMsg,
|
|
|
|
|
+ args: args,
|
|
|
|
|
+ }
|
|
|
strMsg := fmt.Sprintf(msg.text, msg.args...)
|
|
strMsg := fmt.Sprintf(msg.text, msg.args...)
|
|
|
_msg := log_msg.NewLogMsg(log_msg.DEBUG, strMsg)
|
|
_msg := log_msg.NewLogMsg(log_msg.DEBUG, strMsg)
|
|
|
sf.lst = append(sf.lst, _msg)
|
|
sf.lst = append(sf.lst, _msg)
|
|
|
sf.checkLen()
|
|
sf.checkLen()
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-// информационные сообщения
|
|
|
|
|
-func (sf *logBuf) info(msg tMsg) {
|
|
|
|
|
|
|
+// Info -- информационные сообщения
|
|
|
|
|
+func (sf *logBuf) Info(fMsg string, args ...any) {
|
|
|
|
|
+ sf.Lock()
|
|
|
|
|
+ defer sf.Unlock()
|
|
|
|
|
+ msg := tMsg{
|
|
|
|
|
+ text: fMsg,
|
|
|
|
|
+ args: args,
|
|
|
|
|
+ }
|
|
|
strMsg := fmt.Sprintf(msg.text, msg.args...)
|
|
strMsg := fmt.Sprintf(msg.text, msg.args...)
|
|
|
_msg := log_msg.NewLogMsg(log_msg.INFO, strMsg)
|
|
_msg := log_msg.NewLogMsg(log_msg.INFO, strMsg)
|
|
|
sf.lst = append(sf.lst, _msg)
|
|
sf.lst = append(sf.lst, _msg)
|
|
|
sf.checkLen()
|
|
sf.checkLen()
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-// предупреждающие сообщения
|
|
|
|
|
-func (sf *logBuf) warn(msg tMsg) {
|
|
|
|
|
|
|
+// Warn -- предупреждающие сообщения
|
|
|
|
|
+func (sf *logBuf) Warn(fMsg string, args ...any) {
|
|
|
|
|
+ sf.Lock()
|
|
|
|
|
+ defer sf.Unlock()
|
|
|
|
|
+ msg := tMsg{
|
|
|
|
|
+ text: fMsg,
|
|
|
|
|
+ args: args,
|
|
|
|
|
+ }
|
|
|
strMsg := fmt.Sprintf(msg.text, msg.args...)
|
|
strMsg := fmt.Sprintf(msg.text, msg.args...)
|
|
|
_msg := log_msg.NewLogMsg(log_msg.WARN, strMsg)
|
|
_msg := log_msg.NewLogMsg(log_msg.WARN, strMsg)
|
|
|
sf.lst = append(sf.lst, _msg)
|
|
sf.lst = append(sf.lst, _msg)
|
|
|
sf.checkLen()
|
|
sf.checkLen()
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-// сообщения об ошибках
|
|
|
|
|
-func (sf *logBuf) err(msg tMsg) {
|
|
|
|
|
|
|
+// Err -- сообщения об ошибках
|
|
|
|
|
+func (sf *logBuf) Err(fMsg string, args ...any) {
|
|
|
|
|
+ sf.Lock()
|
|
|
|
|
+ defer sf.Unlock()
|
|
|
|
|
+ msg := tMsg{
|
|
|
|
|
+ text: fMsg,
|
|
|
|
|
+ args: args,
|
|
|
|
|
+ }
|
|
|
strMsg := fmt.Sprintf(msg.text, msg.args...)
|
|
strMsg := fmt.Sprintf(msg.text, msg.args...)
|
|
|
_msg := log_msg.NewLogMsg(log_msg.ERROR, strMsg)
|
|
_msg := log_msg.NewLogMsg(log_msg.ERROR, strMsg)
|
|
|
sf.lst = append(sf.lst, _msg)
|
|
sf.lst = append(sf.lst, _msg)
|
|
@@ -212,6 +120,13 @@ func (sf *logBuf) err(msg tMsg) {
|
|
|
sf.checkLenErr()
|
|
sf.checkLenErr()
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+// Size -- возвращает размер буфера
|
|
|
|
|
+func (sf *logBuf) Size() int {
|
|
|
|
|
+ sf.RLock()
|
|
|
|
|
+ defer sf.RUnlock()
|
|
|
|
|
+ return len(sf.lst)
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
// Проверяет длину общую лога
|
|
// Проверяет длину общую лога
|
|
|
func (sf *logBuf) checkLen() {
|
|
func (sf *logBuf) checkLen() {
|
|
|
for len(sf.lst) > 100 {
|
|
for len(sf.lst) > 100 {
|