OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 06 Август, 2020 04:47

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 4 ] 
Автор Сообщение
 Заголовок сообщения: Журнал сообщений (не Log)
СообщениеДобавлено: Воскресенье, 01 Март, 2020 01:09 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4593
Откуда: Россия, Орёл
В ряде задач, как при отладке, так и при эксплуатации, возникает неоходимость журналировать процесс. При этом ощущается необходимость писать именно сообщения. У сообщений могут быть доп. атрибуты, например, время или logLevel; по атрибутам сообщения могут фильтроваться при передаче, искаться в журнале.

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

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

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Журнал сообщений (не Log)
СообщениеДобавлено: Воскресенье, 01 Март, 2020 17:46 
Аватара пользователя

Зарегистрирован: Пятница, 11 Май, 2007 21:57
Сообщения: 1387
Откуда: Украина, Киев
В 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;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Журнал сообщений (не Log)
СообщениеДобавлено: Понедельник, 02 Март, 2020 14:53 
Аватара пользователя

Зарегистрирован: Суббота, 16 Февраль, 2008 02:47
Сообщения: 270
Евгений,

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

Module.Type.Procedure: BlaBlaBla

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

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Журнал сообщений (не Log)
СообщениеДобавлено: Понедельник, 02 Март, 2020 15:59 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9271
Откуда: Россия, Орёл
У меня в последней версии 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)



Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 4 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2020, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB