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/ |