| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175 |
- // package log_buf -- потокобезопасный буфер лога
- package log_buf
- import (
- "fmt"
- "sync"
- "gitp78su.ipnodns.ru/svi/kern/v2/kc/helpers"
- "gitp78su.ipnodns.ru/svi/kern/v2/kc/log_buf/log_msg"
- "gitp78su.ipnodns.ru/svi/kern/v2/kc/safe_bool"
- . "gitp78su.ipnodns.ru/svi/kern/v2/krn/ktypes"
- )
- // logBuf -- потокобезопасный буфер лога
- type logBuf struct {
- sync.RWMutex
- isTerm ISafeBool // Признак вывода в стандартный поток
- lst []ILogMsg
- lstErr []ILogMsg
- }
- // NewLogBuf -- возвращает новый потокобезопасный буфер лога
- func NewLogBuf(isTerm bool) ILogBuf {
- sf := &logBuf{
- isTerm: safe_bool.NewSafeBool(),
- lst: []ILogMsg{},
- lstErr: []ILogMsg{},
- }
- if isTerm {
- sf.IsTerm().Set()
- }
- return sf
- }
- // IsTerm -- возвращает признак логирования
- func (sf *logBuf) IsTerm() ISafeBool {
- return sf.isTerm
- }
- // GetErr -- возвращает сообщение ошибки по номеру
- func (sf *logBuf) GetErr(num int) ILogMsg {
- sf.RLock()
- defer sf.RUnlock()
- if len(sf.lstErr) == 0 {
- return log_msg.NewLogMsg(log_msg.DEBUG, "not error msg")
- }
- if num >= len(sf.lstErr) {
- return sf.lstErr[len(sf.lstErr)-1]
- }
- if num <= 0 {
- return sf.lstErr[0]
- }
- return sf.lstErr[num]
- }
- // Get -- возвращает сообщение по номеру
- func (sf *logBuf) Get(num int) ILogMsg {
- sf.RLock()
- defer sf.RUnlock()
- if len(sf.lst) == 0 {
- return log_msg.NewLogMsg(log_msg.DEBUG, "*no msg*")
- }
- if num >= len(sf.lst) {
- return log_msg.NewLogMsg(log_msg.DEBUG, "*no msg*")
- }
- if num <= 0 {
- return log_msg.NewLogMsg(log_msg.DEBUG, "*no msg*")
- }
- return sf.lst[num]
- }
- 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...)
- _msg := log_msg.NewLogMsg(log_msg.DEBUG, strMsg)
- sf.lst = append(sf.lst, _msg)
- sf.checkLen()
- sf.printTerm(_msg)
- }
- // 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...)
- _msg := log_msg.NewLogMsg(log_msg.INFO, strMsg)
- sf.lst = append(sf.lst, _msg)
- sf.checkLen()
- sf.printTerm(_msg)
- }
- // 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...)
- _msg := log_msg.NewLogMsg(log_msg.WARN, strMsg)
- sf.lst = append(sf.lst, _msg)
- sf.checkLen()
- sf.printTerm(_msg)
- }
- // 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...)
- _msg := log_msg.NewLogMsg(log_msg.ERROR, strMsg)
- sf.lst = append(sf.lst, _msg)
- sf.lstErr = append(sf.lstErr, _msg)
- sf.checkLen()
- sf.checkLenErr()
- sf.printTerm(_msg)
- }
- // Size -- возвращает размер буфера
- func (sf *logBuf) Size() int {
- sf.RLock()
- defer sf.RUnlock()
- return len(sf.lst)
- }
- // Проверяет длину общую лога
- func (sf *logBuf) checkLen() {
- for len(sf.lst) > 100 {
- sf.lst = sf.lst[1:]
- }
- }
- // Проверяет длину лога ошибок
- func (sf *logBuf) checkLenErr() {
- for len(sf.lstErr) > 100 {
- sf.lstErr = sf.lstErr[1:]
- }
- }
- // Печатает сообщение в терминал, если разрешено
- func (sf *logBuf) printTerm(msg ILogMsg) {
- if !sf.isTerm.Get() {
- return
- }
- level := msg.Level()
- if helpers.IsStageProd {
- switch level {
- case "ERRO", "WARN":
- fmt.Printf("%v %v\n", level, msg.String())
- default:
- return
- }
- }
- fmt.Printf("%v\n", msg.String())
- }
|