OberonCore
https://forum.oberoncore.ru/

Журнал сообщений (не Log)
https://forum.oberoncore.ru/viewtopic.php?f=23&t=6572
Страница 1 из 1

Автор:  Евгений Темиргалеев [ Воскресенье, 01 Март, 2020 01:09 ]
Заголовок сообщения:  Журнал сообщений (не Log)

В ряде задач, как при отладке, так и при эксплуатации, возникает неоходимость журналировать процесс. При этом ощущается необходимость писать именно сообщения. У сообщений могут быть доп. атрибуты, например, время или logLevel; по атрибутам сообщения могут фильтроваться при передаче, искаться в журнале.

Классический Log -- это сплошной текст, не рассчитан на такое применение -- нет явной операции отправки сформированого сообщения.
Можно эмулировать, но это все равно не то. Есть, например, реализация DatedLog, которая каждую новую строку начинает с даты и времени, т.е. каждая строка -- это как бы отдельное сообщение. Говорю как бы, потому что это не всегда так, бывают сообщения в несколько строк.

Кто-то с данной задачей сталкивался, возникала подобная потребность, есть какие-то решения?

Простейший интерфейс журнала рассматривался в ветке единую точку вывода в кроссплатформенной сборке. В журнале всего две операции:
PROCEDURE String (IN x: ARRAY OF CHAR) -- дописать в буфер цепочку
PROCEDURE Ln -- отправить сообщение в журнал

Для формирования сообщений можно работать через мапперы с интерфейсом вроде Log.

Автор:  Ярослав Романченко [ Воскресенье, 01 Март, 2020 17:46 ]
Заголовок сообщения:  Re: Журнал сообщений (не Log)

В A2 давно такой есть в модуле Events. Интерфейс состоит всего из одного вызова:
Код:
(** Generate an new event record and add it to the event queue. If showOnKernenLog is TRUE, a simplified representation
   of the event (originator + ": " + message) is displayed on the kernel log.
   This operation is non-blocking if showOnKernelLog is FALSE, blocking otherwise *)
PROCEDURE AddEvent*(CONST originator : Name; type, class, subclass, code : SIGNED8; CONST message : Message; showOnKernelLog : BOOLEAN);
BEGIN
   Add(NewEvent(originator, type, class, subclass, code, message), showOnKernelLog)
END AddEvent;

Автор:  adimetrius [ Понедельник, 02 Март, 2020 14:53 ]
Заголовок сообщения:  Re: Журнал сообщений (не Log)

Евгений,

я бы хотел сделать лог, который будет (по "галочке") показывать, кто в него пишет:

Module.Type.Procedure: BlaBlaBla

Это можно с метаданными сделать, не меняя интерфейсов.
Да и вообще, не меняя интерфейсов, можно с метаданными сделать "выуживание" доп. параметров из вызывающей (клиентской) процедуры: если, скам, объявлена локальная переменная logLevel: INTEGER, то MyLog.Hook.String ее использует как атрибут сообщения.

В самом логе доп. данные можно хранить внутри невидимых view, чтобы иметь к ним структурированный доступ (не парсить текст в логе) и, например, фильтровать. Эти views (зрители) будут сродни складкам: то показываем, то нет.

Хотя, у вас немного иная, кмк, задача: вам нужно явно создавать в логе записи о событиях, а я хотел бы научить лог самостоятельно собирать некоторую инфу.

Автор:  Илья Ермаков [ Понедельник, 02 Март, 2020 15:59 ]
Заголовок сообщения:  Re: Журнал сообщений (не Log)

У меня в последней версии SCADA:

Код:
MODULE KrlJournaling;
   IMPORT Lf := KrlLife, Var := KrlVariants;

   TYPE
      Writer* = POINTER TO ABSTRACT RECORD (Lf.Object) END;

   PROCEDURE (w: Writer) Write* (rec: Var.Record), NEW, ABSTRACT;
   PROCEDURE (w: Writer) Transect*, NEW, ABSTRACT;
   PROCEDURE (w: Writer) Flush* (hard: BOOLEAN), NEW, ABSTRACT;

END KrlJournaling.


Write - сформировать запись из произвольного сочетания полей в журнале.
Transect - разделяет циклы журналирования (показывая реализации, где, например, можно разделить старый и новый файл журнала).
Flush - понятно.

Где:

Код:
MODULE KrlVariants;

      Record = ARRAY OF Value;

      ValueData = ARRAY 16 OF BYTE;

      Value = RECORD
         field-: KrlTokens.FieldT; (* токен, что за поле *)
         data-: ValueData; (* значение поля *)
         (IN v: Value) Bool (): BOOLEAN, NEW;
         (IN v: Value) Byte (): BYTE, NEW;
         (IN v: Value) Int (): INTEGER, NEW;
...
         (VAR v: Value) PutBool (field: KrlTokens.BoolT; x: BOOLEAN), NEW;
         (VAR v: Value) PutByte (field: KrlTokens.ByteT; x: BYTE), NEW;
         (VAR v: Value) PutInt (field: KrlTokens.IntT; x: INTEGER), NEW;
         (VAR v: Value) PutRec (field: KrlTokens.RecT; lim: INTEGER; IN s: ARRAY OF Value), NEW;
      END;


Пример записи о событии включения узла в журнал:

Код:
      VAR rec: ARRAY 16 OF Var.Value;
   BEGIN
      rec[0].PutTok(Var.recType, switchOnEv); (* поле с токеном recType хранит другой токен - токен типа записи журнала *)
      rec[1].PutLInt(ErcJrn.timestampSec, KrlDates.UnixT()); (* время *)
      rec[2].PutTok(ErcJrn.nodeSign, node); (* токен узла, к которому относится событие *)
      wr.Write(rec)


Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/