Логер сообщений для 1С

Начал анализ проблемы в https://github.com/silverbulleters/logos-1c/pull/2
Но тесты для нескольких логов проходят, правда, странным образом.

Встроил в конфигурацию 1С, попробовать. Допилил, чтобы настройки были для каждого пользователя и каждого лог-журнала. В целом работает в Консоль выводит, а вот с файлами…беда.

Концепция как я понимаю log4j, что файл один раз “завхватывается” и туда пишется. В 1С сидят сразу несколько пользователей, т.е. несколько сеансов одновременно пытаются записать в один файл

В-общем, нужна идеология по выводу в файл лог-журналов при многопользовательской работе в базе 1С, при желании события всех журналов выводить в один файл (хотя драгие appenderы у каждого журнала могут различаться)

Как допилил?

Да, с файлами при многопользовательской работе сложно.
Возможно, лучше писать в БД :frowning:

По пользователям: при сохраненни/чтение настроек из ОбщихНастроек добавлено указание пользователя ИмяПользователя(), т.е. настройки логов у каждого пользователя свои
По журналам: при сохранении настроек в ключ добавлено ИмяЛога
Функция КлючНастройкиХранилища(ИмяЛога)
Возврат “НастройкиЛогированияЛог” + “_” + ИмяЛога;
КонецФункции
ну соответственно при чтении настроек из конфигурации передаётся тоже имя, а если настроек для журнала нет, читаются настройка журнала rootLogger.

Также накидал небольшую формочку для сохранения настроек по имеющимся в базе лог-журналам.

1 Симпатия

Интересно.
PR на Гитхаб сделаешь?

PR на Гитхаб сделаешь?
никогда pull request не делал, да и надо до ума там довести, а так для себя же делал.

По поводу файлов мысль. А нельзя ли файл открывать в момент добавления сообщения, а не в начале момент ПолучитьЛог или это слишком неэффективно будет?

Вроде бы была допилка, чтобы файл открывался/закрывался в момент записи очередной строки.
Возможно, мы это только для 1скрипт сделали

Т.е. идея такая - открываем файл в первый раз, закрываем, при закрываем строки открываем/закрываем файл.

Но против блокировок все равно поможет только частично, при активной работе будут проблемы.

Можешь итоговый файл конфигурации выложить здесь или выслать мне, если не получится.

Выкладываю DT демку.
Всё просто , при открытии базы всё на Рабочем столе.
Нажимаем кнопки и смотрим лог в консоле, справа настройки для лог-журналов (3 журнала там rootLogger и ещё 2), там можно указать настройки и сохранить. Настройки привязаны к пользователю и журналу, rootLogger начнёт срабатывать только, если у журнала нет своих настроек.

Добавлен appender logName для включения в текст сообщения.
При выводе файл файл открывается в момент вывода сообщения и сразу закрывается

Ссылка на базу

Начинание очень хорошее и правильное. Но у меня один вопрос:
можно ли как-то организовывать вложенное логгирование? То, откуда вы всё это изначально портировали есть такое?

Пример.
Идет лог загрузки неких реализаций.
Хочу видеть в тексте лога примерно так:

а вообще частенько хочется выводить лог и в дерево и/или в табдок.
Я, ко всему стыду, каждый раз примерно пишу одно и тоже. Но всегда почему-то заново (

Я тоже про это думал но на уровне лог-журналов, т.е. логируются события одного журнала но вызывается другая процедура, где логируется уже другой журнал, т.е. один лог-журнал вложен в другой. Но чтобы так сделать наверное нужно хранить указатель на текущий лог-журнал (родителя) в глобальном месте. Тогда можно будет сделать что-то вроде:

<Загрузка Excel файла>[лог журнал: считывание Excel]
<Открытие файла>[лог журнал: считывание Excel]
<Считывание 1-ой строки Excel>[лог журнал: считывание Excel]
     <создание документа Реализация> [лог журнал: создание Реализации]
     <заполнение шапки Реализация> [лог журнал: создание Реализации]
     <запись и проведение Реализации>[лог журнал: создание Реализации]
<Считывание 2-ой строки Excel>[лог журнал: считывание Excel]

мы в рабочей конфе это делали через иерархический справочник Логи. в каждой процедуре первым параметром идет ЛогСсылка. если нужно создать новый уровень, то пишем ЛогСсылка = СоздатьЛог(ЛогСсылка). в функции СоздатьЛог(Родитель) переданная ссылка используется, как родитель для нового лога. потом можно выводить отчет на СКД без программирования. Единственный минус - долго выводится большой объем.

Я у себя обычно передаю параметр “Уровень”, а уже в выводе обрабатывая его, сдвигаюсь либо табами, либо пробелами

Подсказка юному назывателю: Когда я не хочу вставлять в название буквы 1С - я пишу v8

в тему логера, мое (выдержки)

 // Включает логирование указанных областей
Включить(ИдентификаторыОбластейЛогирования = "")

//	Добавляет сообщение в файл лога
ДобавитьСообщение(Сообщение, УровеньСообщения = "Информация", Идентификатор = "UnSpecified")

//	Сохраняет запрос в каталог логов и добавляет сообщение в файл лога
ДобавитьЗапрос(Запрос, Сообщение = "", УровеньСообщения = "Информация", Идентификатор = "UnSpecified") 

 //	Сохраняет значение в каталог логов и добавляет сообщение в файл лога
ДобавитьЗначение(Значение, Сообщение = "", УровеньСообщения = "Информация", Идентификатор = "UnSpecified") 

ну и так далее

а в настройках указывается куда складывать логи
структура такая

%ROOT_LOGS%\%SESSION_ID%\NUMLOG.log

в файле

<metadata> - метаданные сессии
<message> - описание сообщение, ссылки на запросы и т.д.