Вы случайно не используете daemonize
(или какой-либо другой инструмент для создания фона), чтобы запустить процесс kdb и перенаправить stderr? Если это так, то я полагаю, что именно это вызывает временную отметку при ведении журнала (vanilla KDB регистрирует только ошибку, а не временную отметку, как упомянуто Каллумом). Например,
/start background process
./daemonize -e ~/myerr.log -o ~/myout.log -p ~/mypid.log $QHOME/l64/q -p 5555
/send this process a bad message to create error
q)h:hopen`::5555
q)neg[h]"1+`a"
/check log
>tail -f myerr.log
'2019.11.07T04:47:51.610 type
Конечно, это не решит вашу фактическую ошибку, просто, возможно, объясняет путаницу вокруг отметки времени.
К вашим фактическим ошибкам - как уже упоминалось в других ответах, они, вероятно, вызваны плохо сформированными вставками данных, поступающими в ваш процесс: length
означает, что количество полей не равно количеству столбцов, mismatch
Это означает, что соединение может быть неудачным из-за разных типов данных или столбцов.
Чтобы зафиксировать ошибки, у вас есть несколько вариантов:
- Предполагая, что входящие данные достигли функции
upd
(upsert / insert) в вашем процессе, измените эту upd
функция, чтобы сделать защищенный Eval для захвата сбоев. Что-то вроде
upd:{.[insert;(x;y);{`.err.x set x;`.err.y set y;'z}[x;y]]};
Это будет хранить глобальные переменные .err.x и .err.y. Делайте , а не , делайте это на заводском тикер-заводе - воспроизводите данные в тестовой среде.
Вы можете пойти на общий подход и захватить все входящие записи .z.pg / .z.ps
.z.pg:{@[value;x;{`.err.pg set x;'y}[x]]};
.z.ps:{@[value;x;{`.err.ps set x;'y}[x]]};
Снова сделать не сделать это в производствесистема, она должна использоваться только для тестирования / отладки