28.01.2020, 12:50 | #1 |
Участник
|
DAX2009: как реализовать сохранение лог сообщений
Привет.
Подскажите существует ли в аксапте какой либо класс для сохранения логов? Или реализовывать сохранение сообщений надо вручную? Имеется пакетник в котором хотелось бы сохранять результат выполнения цикла, т.е. для каждой итерации надо что бы добавлялось сообщение в файл. Какой нибудь пример имеется? |
|
28.01.2020, 12:56 | #2 |
Участник
|
В файл стандартного не встречал, но так как это задача в общем-то элементарная (открыл файл, добавил строку, закрыл файл) - то не сложно сделать самостоятельно.
|
|
28.01.2020, 13:11 | #3 |
Участник
|
Методы для работы с файлами не подскажете? Какие они в ax?
|
|
28.01.2020, 13:13 | #4 |
Участник
|
например, класс TextIo
ну или .NET всякое, если в 2012-2009 дело происходит https://docs.microsoft.com/en-us/dyn...e-textio-class https://lmgtfy.com/?q=ax+2009+write+text+file https://stackoverflow.com/questions/...ft-dynamics-ax |
|
28.01.2020, 17:43 | #5 |
Участник
|
Имейте ввиду, что в пакетном задании весь код исполняется на сервере, к тому же в циле.
Соответственно путь к файлу должен быть доступен от АОС сервера, лучше всего сетевой путь. Если укажете C/:temp при запуске на клиенте в диалоге, то выгрузит он не на ваш терминальный сервер, а в такую же папку но на сервере AOS. Есть также стандартная возможность увидеть сообщения из пакетной обработки - в журнале пакетных заданий, есть логи. Сохраняются все, но отобразится только первая 1000 (согласно настроек юзера). Но есть и минусы такого подхода - если генерить большие сообщения, то в связи с тем что info пакуется в таблицу batch (или batchJob), вставка/обновление записей может происходить долго. |
|
29.01.2020, 14:26 | #6 |
Участник
|
Спасибо. Я вот сейчас думаю если пакетник будет выполняться на выделенном aos то по хорошему он должен сохранять лог по стандартному маршруту в папку аксапты. Вы не подскажете какой стандартный путь принят в AX когда она сама сохраняет свои логи. В соответствующей папке программы в programs files в папке аксапты? Или как?
|
|
29.01.2020, 20:23 | #7 |
Участник
|
Кто является потребителем данной информации?
Для каких целей это необходимо? Это отладка или статистика? Возможно, лучше реализовать специальную таблицу и вставлять записи в неё? Последний раз редактировалось Товарищ ♂uatr; 29.01.2020 в 20:41. |
|
30.01.2020, 06:01 | #8 |
Участник
|
Если будете через таблицу реализовывать, учитывайте, что:
1) в файл запись быстрее 2) если транзакция крякнет, то таблица лога тоже не сохранится (если только специально не делать вставку в параллельной транзакции) |
|
|
За это сообщение автора поблагодарили: vmoskalenko (4). |
30.01.2020, 09:28 | #9 |
Administrator
|
Цитата:
Логирование в транзакции противоречит самой идеи логирования, если это логирование предназначено для анализа самой транзакции. Поэтому логирование обычно делают в параллельной транзакции.
__________________
Возможно сделать все. Вопрос времени |
|
|
За это сообщение автора поблагодарили: mazzy (2), vmoskalenko (4). |
30.01.2020, 10:03 | #10 |
Участник
|
Меня не покидает ощущение, что стандартного info() для решения описанной задачи должно хватить. Куда уж стандартнее. Просмотр через журнал пакетных заданий по кнопке "Журнал". Вывод в infolog из транзакции можно вынести, если так ценно не терять выводимые данные. Пробовали? Не подходит? Только текстовый файл? Только хардкор?
|
|
01.02.2020, 08:01 | #11 |
Участник
|
В продолжении темы.
Согласен info тоже удобен. Но в нем очень неудобно осуществлять навигацию, если записей очень много получается. Трудно даже ползунок сдвинуть. Подскажите еще. Вопрос 1 Пакетник ведет лог в файл, все хорошо. Но при работе есть случаи когда происходит вывод сообщений в инфолог из глубины различных методов. Соответственно на финише получается такая картина, лог выводится в файл и выводится инфолог в котором масса сообщения тоже. Невозможно понять в рамках какой строки лога выводились конкретное сообщения в инфоологе. Мне было бы удобнее к каждой строке лога текстового файла добавлять текстовое значение из инфолога которое были выведены. Только вопрос: Как сообщение извлечь из инфолога в текстовую переменную? И главное что бы это сообщение из инфолога было без эффекта накопления.. Вопрос 2 Я использую класс для вывода сообщений System.IO.StreamWriter (код из примера): X++: static void Job_StreamWriter(Args _args) { System.IO.StreamWriter sw; InteropPermission perm = new InteropPermission(InteropKind::ClrInterop); ; perm.assert(); sw = new System.IO.StreamWriter(@"C:\test.txt"); sw.WriteLine("Line 1"); sw.WriteLine("Line 2"); sw.Flush(); sw.Close(); sw.Dispose(); CodeAccessPermission::revertAssert(); } X++: sw = new System.IO.StreamWriter(@"%USERPROFILE%\test.log"); Похоже она не понимает переменные окружения. Нужно для того что если пакетник выполняется вручную на сервере соответственно сохранить возможно лог только в папку текущего пользователя запустившего пакетник. Вопрос 3 Возможно ли как то узнать какая ошибка генерируется в случае когда выводится ошибка "Объект "CLRObject" не может быть создан". Это нужно для того что бы обрабатывать различные ошибки. Как в вопросе выше. Если нет доступа к пути то нужно выводить такое сообщение. Создавал вот такую конструкцию: X++: try { sw = new System.IO.StreamWriter(@"%USERPROFILE%\test.log"); if (!sw) { throw error('ошибка'); } } //catch(Exception::CLRError) catch(Exception::Error) { info("свой текст ошибки"); } Последний раз редактировалось oleggy; 01.02.2020 в 08:29. |
|
01.02.2020, 16:26 | #12 |
Участник
|
Цитата:
Только вопрос: Как сообщение извлечь из инфолога в текстовую переменную?
http://www.ksaelen.be/wordpresses/dy...m-the-infolog/ Цитата:
Вопрос 3
Возможно ли как то узнать какая ошибка генерируется в случае когда выводится ошибка "Объект "CLRObject" не может быть создан". https://docs.microsoft.com/en-us/dyn...om-clr-objects |
|
03.02.2020, 11:10 | #13 |
----------------
|
Более читаемый текст ошибки CLRError
X++: try { // какой-то код с CLR } catch(Exception::CLRError) { error(AifUtil::getClrErrorMessage()); } |
|