Оптимизация журналирования событий
This commit is contained in:
@@ -23,8 +23,12 @@ type PipeReader struct {
|
||||
lastAlertTime map[byte]time.Time
|
||||
|
||||
// Настройки
|
||||
alertCooldownSec time.Duration
|
||||
alertCooldownSec time.Duration
|
||||
humanLogIntervalSec time.Duration
|
||||
|
||||
// Флаги состояния
|
||||
pipeState string // "unknown", "found", "not_found"
|
||||
lastLoggedState string // для отслеживания изменений
|
||||
}
|
||||
|
||||
func NewPipeReader(
|
||||
@@ -36,14 +40,26 @@ func NewPipeReader(
|
||||
config *logger.Config,
|
||||
) *PipeReader {
|
||||
return &PipeReader{
|
||||
buf: buf,
|
||||
dataLogger: dataLogger,
|
||||
humanLogger: humanLogger,
|
||||
monitor: monitor,
|
||||
eventLog: eventLog,
|
||||
lastAlertTime: make(map[byte]time.Time),
|
||||
alertCooldownSec: config.AlertCooldownSec,
|
||||
buf: buf,
|
||||
dataLogger: dataLogger,
|
||||
humanLogger: humanLogger,
|
||||
monitor: monitor,
|
||||
eventLog: eventLog,
|
||||
lastAlertTime: make(map[byte]time.Time),
|
||||
alertCooldownSec: config.AlertCooldownSec,
|
||||
humanLogIntervalSec: config.HumanLogIntervalSec,
|
||||
pipeState: "unknown",
|
||||
lastLoggedState: "unknown",
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
func (pr *PipeReader) logStateChange(newState string, eventName string) {
|
||||
if newState != pr.lastLoggedState {
|
||||
if pr.eventLog != nil {
|
||||
pr.eventLog.Event(eventName)
|
||||
}
|
||||
pr.lastLoggedState = newState
|
||||
}
|
||||
}
|
||||
|
||||
@@ -59,8 +75,10 @@ func (pr *PipeReader) Start(ctx context.Context, pipePath string) {
|
||||
}
|
||||
|
||||
if _, err := os.Stat(pipePath); os.IsNotExist(err) {
|
||||
if pr.eventLog != nil {
|
||||
pr.eventLog.Event("PIPE_НЕ_НАЙДЕН")
|
||||
// Логируем ТОЛЬКО при смене состояния
|
||||
if pr.pipeState != "not_found" {
|
||||
pr.pipeState = "not_found"
|
||||
pr.logStateChange("not_found", "PIPE_НЕ_НАЙДЕН")
|
||||
}
|
||||
time.Sleep(2 * time.Second)
|
||||
continue
|
||||
@@ -68,27 +86,38 @@ func (pr *PipeReader) Start(ctx context.Context, pipePath string) {
|
||||
|
||||
f, err := os.OpenFile(pipePath, os.O_RDONLY, 0)
|
||||
if err != nil {
|
||||
if pr.eventLog != nil {
|
||||
pr.eventLog.Event("ОШИБКА_ОТКРЫТИЯ_PIPE")
|
||||
if pr.pipeState != "error" {
|
||||
pr.pipeState = "error"
|
||||
pr.logStateChange("error", "ОШИБКА_ОТКРЫТИЯ_PIPE")
|
||||
}
|
||||
time.Sleep(time.Second)
|
||||
continue
|
||||
}
|
||||
|
||||
if pr.eventLog != nil {
|
||||
pr.eventLog.Event("PIPE_ПОДКЛЮЧЕН")
|
||||
// Pipe успешно открыт
|
||||
if pr.pipeState != "found" {
|
||||
pr.pipeState = "found"
|
||||
pr.logStateChange("found", "PIPE_ПОДКЛЮЧЕН")
|
||||
}
|
||||
|
||||
for {
|
||||
n, err := f.Read(buffer)
|
||||
if err != nil {
|
||||
f.Close()
|
||||
if pr.eventLog != nil {
|
||||
pr.eventLog.Event("PIPE_ОТКЛЮЧЕН")
|
||||
// Отключаемся только если были подключены
|
||||
if pr.pipeState == "found" {
|
||||
pr.pipeState = "disconnected"
|
||||
pr.logStateChange("disconnected", "PIPE_ОТКЛЮЧЕН")
|
||||
}
|
||||
break
|
||||
}
|
||||
|
||||
// Если были в состоянии ошибки/отключения, восстанавливаемся
|
||||
if pr.pipeState != "found" {
|
||||
pr.pipeState = "found"
|
||||
pr.logStateChange("found", "PIPE_ПОДКЛЮЧЕН")
|
||||
}
|
||||
|
||||
for i := 0; i < n; i++ {
|
||||
rawByte := buffer[i]
|
||||
now := time.Now()
|
||||
|
||||
Reference in New Issue
Block a user