Переглянути джерело

SVI Добавление заготовки для логирования в шину; 100.0%

SVI 9 місяців тому
батько
коміт
59339729cf

+ 1 - 1
kc/local_ctx/local_ctx.go

@@ -32,7 +32,7 @@ func NewLocalCtx(ctx context.Context) ILocalCtx {
 		fnCancel: fnCancel,
 		dictVal:  map[string]ICtxValue{},
 		lstSort:  lst_sort.NewLstSort(),
-		log:      log_buf.NewLogBuf(),
+		log:      log_buf.NewLogBuf(false),
 	}
 	return sf
 }

+ 24 - 1
kc/log_buf/log_buf.go

@@ -6,25 +6,36 @@ import (
 	"sync"
 
 	"gitp78su.ipnodns.ru/svi/kern/kc/log_buf/log_msg"
+	"gitp78su.ipnodns.ru/svi/kern/kc/safe_bool"
 	. "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
 )
 
 // logBuf -- потокобезопасный буфер лога
 type logBuf struct {
 	sync.RWMutex
+	isTerm ISafeBool // Признак вывода в стандартный поток
 	lst    []ILogMsg
 	lstErr []ILogMsg
 }
 
 // NewLogBuf -- возвращает новый потокобезопасный буфер лога
-func NewLogBuf() ILogBuf {
+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()
@@ -74,6 +85,9 @@ func (sf *logBuf) Debug(fMsg string, args ...any) {
 	_msg := log_msg.NewLogMsg(log_msg.DEBUG, strMsg)
 	sf.lst = append(sf.lst, _msg)
 	sf.checkLen()
+	if sf.isTerm.Get() {
+		fmt.Println(_msg.String())
+	}
 }
 
 // Info -- информационные сообщения
@@ -88,6 +102,9 @@ func (sf *logBuf) Info(fMsg string, args ...any) {
 	_msg := log_msg.NewLogMsg(log_msg.INFO, strMsg)
 	sf.lst = append(sf.lst, _msg)
 	sf.checkLen()
+	if sf.isTerm.Get() {
+		fmt.Println(_msg.String())
+	}
 }
 
 // Warn -- предупреждающие сообщения
@@ -102,6 +119,9 @@ func (sf *logBuf) Warn(fMsg string, args ...any) {
 	_msg := log_msg.NewLogMsg(log_msg.WARN, strMsg)
 	sf.lst = append(sf.lst, _msg)
 	sf.checkLen()
+	if sf.isTerm.Get() {
+		fmt.Println(_msg.String())
+	}
 }
 
 // Err -- сообщения об ошибках
@@ -118,6 +138,9 @@ func (sf *logBuf) Err(fMsg string, args ...any) {
 	sf.lstErr = append(sf.lstErr, _msg)
 	sf.checkLen()
 	sf.checkLenErr()
+	if sf.isTerm.Get() {
+		fmt.Println(_msg.String())
+	}
 }
 
 // Size -- возвращает размер буфера

+ 1 - 1
kc/log_buf/log_buf_test.go

@@ -21,7 +21,7 @@ func TestLogBuf(t *testing.T) {
 // Создаёт новый буферный лог
 func (sf *tester) new() {
 	sf.t.Log("new")
-	sf.log = NewLogBuf()
+	sf.log = NewLogBuf(true)
 	if sf.log == nil {
 		sf.t.Fatalf("new(): log==nil")
 	}

+ 24 - 0
kc/log_buf/log_bus/log_bus.go

@@ -0,0 +1,24 @@
+// package log_bus -- хранитель топиков для логирования
+package log_bus
+
+import (
+	"sync"
+
+	"gitp78su.ipnodns.ru/svi/kern/krn/kalias"
+	"gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
+)
+
+type LogDictTopic struct {
+	sync.RWMutex
+	dict   map[kalias.ATopic]bool
+	client ktypes.IBusClient
+}
+
+// NewLogDictTopic -- возвращает новый словарь топиков для логирования
+func NewLogDictTopic(clientBus ktypes.IBusClient) *LogDictTopic {
+	sf := &LogDictTopic{
+		dict:   map[kalias.ATopic]bool{},
+		client: clientBus,
+	}
+	return sf
+}

+ 28 - 0
kc/log_buf/log_bus/log_bus_test.go

@@ -0,0 +1,28 @@
+package log_bus
+
+import (
+	"testing"
+)
+
+type tester struct {
+	t *testing.T
+}
+
+func TestLogDictTopic(t *testing.T) {
+	sf := &tester{
+		t: t,
+	}
+	sf.new()
+}
+
+// Создаёт новый словарь топиков для логирования
+func (sf *tester) new() {
+	sf.t.Log("new")
+	log := NewLogDictTopic(nil)
+	if log == nil {
+		sf.t.Fatalf("new(): log!=nil")
+	}
+	if log.client != nil {
+		sf.t.Fatalf("mew(): log.client!=nil")
+	}
+}

+ 37 - 0
kc/log_buf/log_bus/log_topic/log_topic.go

@@ -0,0 +1,37 @@
+// package log_topic -- элемент лога шины топика
+package log_topic
+
+import (
+	"fmt"
+
+	. "gitp78su.ipnodns.ru/svi/kern/kc/helpers"
+	. "gitp78su.ipnodns.ru/svi/kern/krn/kalias"
+	. "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
+)
+
+// LogTopic -- элемент лога шины
+type LogTopic struct {
+	topic  ATopic     // Топик, куда публиковать лог
+	client IBusClient // С помощью чего публиковать лог
+}
+
+// NewLogTopic -- возвращает новый элемент лога
+func NewLogTopic(topic ATopic, client IBusClient) *LogTopic {
+	Hassert(topic != "", "NewLogTopic(): topic is empty")
+	Hassert(client != nil, "NewLogTopic(): IBusClient==nil")
+	sf := &LogTopic{
+		topic:  topic,
+		client: client,
+	}
+	return sf
+}
+
+// Pub -- публикует сообщение в топик
+func (sf *LogTopic) Pub(binMsg []byte) Result[bool] {
+	res := sf.client.Publish(sf.topic, binMsg)
+	if res.IsErr() {
+		err := fmt.Errorf("LogTopic.Pub(): in pub with client, err=\n\t%v", res.Error())
+		return NewErr[bool](err)
+	}
+	return res
+}

+ 54 - 0
kc/log_buf/log_bus/log_topic/log_topic_test.go

@@ -0,0 +1,54 @@
+package log_topic
+
+import (
+	"testing"
+
+	"gitp78su.ipnodns.ru/svi/kern/krn/kbus/kbus_local/client_bus_local"
+	"gitp78su.ipnodns.ru/svi/kern/krn/kctx"
+)
+
+type tester struct {
+	t *testing.T
+}
+
+func TestLogTopic(t *testing.T) {
+	sf := &tester{
+		t: t,
+	}
+	sf.new()
+}
+
+// Создаёт новый торик для логирования
+func (sf *tester) new() {
+	sf.t.Log("new")
+	sf.newBad1()
+	sf.newGood1()
+}
+
+// Правильное создание топика
+func (sf *tester) newGood1() {
+	sf.t.Log("newGood1")
+	busClient := client_bus_local.NewClientBusLocal()
+	client := NewLogTopic("test_topic", busClient)
+	res := client.Pub([]byte("test_msg"))
+	if res.IsErr() {
+		sf.t.Fatalf("newGood1(): err=%v", res.Error())
+	}
+	ctx := kctx.GetKernelCtx()
+	ctx.Cancel()
+	ctx.Wg().Wait()
+	res = client.Pub([]byte("test_msg"))
+	if !res.IsErr() {
+		sf.t.Fatalf("newGood1(): err==nil")
+	}
+}
+
+// Нет топика лога
+func (sf *tester) newBad1() {
+	defer func() {
+		if _panic := recover(); _panic == nil {
+			sf.t.Fatalf("newBad1(): panic==nil")
+		}
+	}()
+	_ = NewLogTopic("", nil)
+}

+ 2 - 2
kern.go

@@ -139,8 +139,8 @@ func GetModuleWui() IKernelModule {
 }
 
 // NewLogBuf -- возвращает новый буферизованный лог
-func NewLogBuf() ILogBuf {
-	log := log_buf.NewLogBuf()
+func NewLogBuf(isTerm bool) ILogBuf {
+	log := log_buf.NewLogBuf(isTerm)
 	return log
 }
 

+ 1 - 1
kern_test.go

@@ -112,7 +112,7 @@ func (sf *tester) new() {
 		sf.t.Fatalf("new(): modWui==nil")
 	}
 
-	logBuf := NewLogBuf()
+	logBuf := NewLogBuf(true)
 	if logBuf == nil {
 		sf.t.Fatalf("new(): ILogBuf==nil")
 	}

+ 1 - 1
krn/kctx/kernel_keeper/kernel_keeper.go

@@ -42,7 +42,7 @@ func GetKernelKeeper(ctx context.Context, fnCancel func(), wg IKernelWg) *kernel
 		ctx:      ctx,
 		fnCancel: fnCancel,
 		wg:       wg,
-		log:      log_buf.NewLogBuf(),
+		log:      log_buf.NewLogBuf(true),
 		chSys_:   make(chan os.Signal, 2),
 	}
 	sf.log.Debug("GetKernelKeeper(): first run")

+ 1 - 1
krn/kctx/kwg/kwg.go

@@ -42,7 +42,7 @@ func GetKernelWg(ctx context.Context) IKernelWg {
 		ctx:        ctx,
 		dictStream: map[AStreamName]bool{},
 		isWork:     safe_bool.NewSafeBool(),
-		log:        log_buf.NewLogBuf(),
+		log:        log_buf.NewLogBuf(true),
 	}
 	sf.log.Debug("GetKernelWg(): run")
 	go sf.close()

+ 10 - 0
krn/ktypes/ilog_buf.go

@@ -16,12 +16,20 @@ type ILogMsg interface {
 	String() string
 }
 
+// ILogBus -- публикует в топики логи
+type ILogBus interface {
+	// DebugAdd -- добавляет топик для отладочного сообщения
+	DebugAdd(topic ATopic, bus IBusClient)
+}
+
 // ILogBuf -- буферизованный лог для диагностики
 //
 //	Буфер для Error -- отдельный
 type ILogBuf interface {
 	// Debug -- сообщение отладки
 	Debug(fMsg string, args ...any)
+	// LogBus -- возвращает объект публикации в шину
+	// LogBus()ILogBus
 	// Info -- информационные сообщения
 	Info(fMsg string, args ...any)
 	// Warn -- предупреждающие сообщения
@@ -34,4 +42,6 @@ type ILogBuf interface {
 	GetErr(num int) ILogMsg
 	// Size -- возвращает размер лога
 	Size() int
+	// IsTerm -- возвращает признак логирования в терминал
+	IsTerm() ISafeBool
 }