├── .gitignore ├── .gitattributes ├── src └── cf │ ├── DataProcessors │ ├── ВыводЛогаВКонсольЛог │ │ └── Ext │ │ │ └── ObjectModule.bsl │ ├── ВыводЛогаВЖРЛог │ │ └── Ext │ │ │ └── ObjectModule.bsl │ ├── ВыводЛогаВФайлЛог │ │ └── Ext │ │ │ └── ObjectModule.bsl │ ├── ВыводЛогаВФайлЛог.xml │ ├── ВыводЛогаВКонсольЛог.xml │ ├── МенеджерЛогированияЛог.xml │ ├── НастройкиЛогированияЛог.xml │ ├── ВыводЛогаВЖРЛог.xml │ ├── МенеджерЛогированияЛог │ │ └── Ext │ │ │ └── ObjectModule.bsl │ ├── ИсполнительЛог.xml │ ├── ИсполнительЛог │ │ └── Ext │ │ │ └── ObjectModule.bsl │ └── НастройкиЛогированияЛог │ │ └── Ext │ │ └── ObjectModule.bsl │ ├── Languages │ └── Русский.xml │ ├── Subsystems │ ├── OscriptLibrary.xml │ └── OscriptLibrary │ │ └── Subsystems │ │ └── Logos.xml │ └── Configuration.xml ├── readme.md └── LICENSE /.gitignore: -------------------------------------------------------------------------------- 1 | build/ 2 | out/ 3 | 4 | Smoke\.mxl 5 | 6 | allure-report/ 7 | 8 | \.scannerwork/ 9 | 10 | src/cf/ConfigDumpInfo\.xml 11 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | *.yml text eol=lf 2 | *.bsl text eol=lf 3 | *.xml text eol=lf 4 | *.sh text eol=lf 5 | *.bpmn text eol=lf 6 | *.feature text eol=lf 7 | -------------------------------------------------------------------------------- /src/cf/DataProcessors/ВыводЛогаВКонсольЛог/Ext/ObjectModule.bsl: -------------------------------------------------------------------------------- 1 | ////////////////////////////////////////////////////////////////////////// 2 | // 3 | // LOGOS: вывод в консоль 4 | // 5 | ////////////////////////////////////////////////////////////////////////// 6 | 7 | Процедура Вывести(Знач Сообщение) Экспорт 8 | 9 | Сообщить(Сообщение); 10 | 11 | КонецПроцедуры 12 | 13 | Процедура Закрыть() Экспорт 14 | 15 | КонецПроцедуры 16 | 17 | // Устанавливает свойство аппендера, заданное в конфигурационном файле 18 | // 19 | Процедура УстановитьСвойство(Знач ИмяСвойства, Знач Значение) Экспорт 20 | 21 | КонецПроцедуры // УстановитьСвойство() 22 | -------------------------------------------------------------------------------- /src/cf/DataProcessors/ВыводЛогаВЖРЛог/Ext/ObjectModule.bsl: -------------------------------------------------------------------------------- 1 | ////////////////////////////////////////////////////////////////////////// 2 | // 3 | // LOGOS: вывод в консоль 4 | // 5 | ////////////////////////////////////////////////////////////////////////// 6 | 7 | Процедура Вывести(Знач Сообщение) Экспорт 8 | 9 | ЗаписьЖурналаРегистрации(ИмяСобытия, УровеньЖурналаРегистрации[Уровень], , , Сообщение); 10 | 11 | КонецПроцедуры 12 | 13 | Процедура Закрыть() Экспорт 14 | 15 | КонецПроцедуры 16 | 17 | // Устанавливает свойство аппендера, заданное в конфигурационном файле 18 | // 19 | // Разрешенные свойства: ИмяСобытия, Уровень 20 | // 21 | Процедура УстановитьСвойство(Знач ИмяСвойства, Знач Значение) Экспорт 22 | Если ИмяСвойства = "ИмяСобытия" Тогда 23 | ИмяСобытия = Значение; 24 | ИначеЕсли ИмяСвойства = "Уровень" Тогда 25 | Уровень = Значение; 26 | КонецЕсли; 27 | КонецПроцедуры // УстановитьСвойство() 28 | 29 | ИмяСобытия = "Логирование"; 30 | Уровень = "Предупреждение"; -------------------------------------------------------------------------------- /src/cf/DataProcessors/ВыводЛогаВФайлЛог/Ext/ObjectModule.bsl: -------------------------------------------------------------------------------- 1 | ////////////////////////////////////////////////////////////////////////// 2 | // 3 | // LOGOS: вывод в файл 4 | // 5 | ////////////////////////////////////////////////////////////////////////// 6 | 7 | Перем мФайлЛога; 8 | 9 | Процедура ОткрытьФайл(Знач Путь, Знач Кодировка = "utf-8", Знач Добавлять = Истина) Экспорт 10 | мФайлЛога = Новый ЗаписьТекста(Путь, Кодировка,,Добавлять); 11 | КонецПроцедуры 12 | 13 | Процедура Вывести(Знач Сообщение) Экспорт 14 | ПроверитьИнициализацию(); 15 | мФайлЛога.ЗаписатьСтроку(Сообщение); 16 | КонецПроцедуры 17 | 18 | Процедура Закрыть() Экспорт 19 | ПроверитьИнициализацию(); 20 | мФайлЛога.Закрыть(); 21 | мФайлЛога = Неопределено; 22 | КонецПроцедуры 23 | 24 | // Устанавливает свойство аппендера, заданное в конфигурационном файле 25 | // 26 | Процедура УстановитьСвойство(Знач ИмяСвойства, Знач Значение) Экспорт 27 | Если ИмяСвойства = "file" Тогда 28 | ОткрытьФайл(Значение); 29 | КонецЕсли; 30 | КонецПроцедуры // УстановитьСвойство() 31 | 32 | Функция ПроверитьИнициализацию() 33 | Если мФайлЛога = Неопределено Тогда 34 | ВызватьИсключение "Не открыт файл лога"; 35 | КонецЕсли; 36 | КонецФункции 37 | -------------------------------------------------------------------------------- /src/cf/Languages/Русский.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Русский 6 | 7 | 8 | ru 9 | Русский 10 | 11 | 12 | 13 | ru 14 | 15 | 16 | -------------------------------------------------------------------------------- /src/cf/Subsystems/OscriptLibrary.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | OscriptLibrary 6 | 7 | 8 | ru 9 | oscript-library 10 | 11 | 12 | 13 | true 14 | false 15 | 16 | 17 | 18 | 19 | 20 | Logos 21 | 22 | 23 | -------------------------------------------------------------------------------- /src/cf/Subsystems/OscriptLibrary/Subsystems/Logos.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Logos 6 | 7 | 8 | ru 9 | Logos 10 | 11 | 12 | 13 | true 14 | true 15 | 16 | 17 | 18 | DataProcessor.МенеджерЛогированияЛог 19 | DataProcessor.ИсполнительЛог 20 | DataProcessor.ВыводЛогаВКонсольЛог 21 | DataProcessor.ВыводЛогаВФайлЛог 22 | DataProcessor.ВыводЛогаВЖРЛог 23 | DataProcessor.НастройкиЛогированияЛог 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /src/cf/DataProcessors/ВыводЛогаВФайлЛог.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | c2872ace-042f-4497-a18e-7f1730a6494c 7 | 4296a417-0ad5-4f23-8483-85473a8c4425 8 | 9 | 10 | 67f6230e-5717-4f26-9b0a-ba314d56539a 11 | 3362bc20-2b01-48e5-9ea5-14e519bc7d0d 12 | 13 | 14 | 15 | ВыводЛогаВФайлЛог 16 | 17 | 18 | ru 19 | Вывод лога в файл лог 20 | 21 | 22 | 23 | true 24 | 25 | 26 | false 27 | 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /src/cf/DataProcessors/ВыводЛогаВКонсольЛог.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | c4b23fa8-cc44-4b5c-8675-d82383a0f66b 7 | 3c8ca01c-e319-488b-97c0-bfc398aead86 8 | 9 | 10 | 46a82994-a67e-4e7c-a99b-9a59f0146125 11 | ea06259f-bc04-4d09-a44b-5801b0d1c42d 12 | 13 | 14 | 15 | ВыводЛогаВКонсольЛог 16 | 17 | 18 | ru 19 | Вывод лога в консоль лог 20 | 21 | 22 | 23 | true 24 | 25 | 26 | false 27 | 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /src/cf/DataProcessors/МенеджерЛогированияЛог.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | e49d221c-4b9a-4657-b979-748eae4418b9 7 | 78b31eb6-5a02-4d41-b0e6-f743c7d29556 8 | 9 | 10 | 14290480-811b-4675-b1db-00c0ccdfb30c 11 | d07547e0-618e-404d-b1b7-b2daa9e6c70c 12 | 13 | 14 | 15 | МенеджерЛогированияЛог 16 | 17 | 18 | ru 19 | Менеджер логирования лог 20 | 21 | 22 | 23 | true 24 | 25 | 26 | false 27 | 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /src/cf/DataProcessors/НастройкиЛогированияЛог.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7d7f21f8-044b-422d-b7d6-0a7e5e26091a 7 | c8885b0a-0769-49ca-a90d-d9e075bf116e 8 | 9 | 10 | b6bd34d9-7700-4695-a784-c672e11e2e2a 11 | 7f2d0551-e270-4021-b232-497bd4f3a49e 12 | 13 | 14 | 15 | НастройкиЛогированияЛог 16 | 17 | 18 | ru 19 | Настройки логирования лог 20 | 21 | 22 | 23 | true 24 | 25 | 26 | false 27 | 28 | 29 | 30 | 31 | 32 | 33 | УровниЛога 34 | 35 | 36 | ru 37 | Уровни лога 38 | 39 | 40 | 41 | 42 | false 43 | 44 | 45 | 46 | false 47 | 48 | false 49 | false 50 | 51 | 52 | DontCheck 53 | Items 54 | 55 | 56 | Auto 57 | Auto 58 | 59 | 60 | Auto 61 | 62 | 63 | 64 | 65 | -------------------------------------------------------------------------------- /src/cf/DataProcessors/ВыводЛогаВЖРЛог.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | d7331f18-3ea3-4765-980f-34a531663553 7 | 20d2c7d1-7327-48ee-a1b2-9bcac049cd30 8 | 9 | 10 | 74713192-c9fe-4276-bdea-31d06dfece6c 11 | 66c2d1ac-ea51-4593-b148-5d889c91d8ee 12 | 13 | 14 | 15 | ВыводЛогаВЖРЛог 16 | 17 | 18 | ru 19 | Вывод лога ВЖРЛог 20 | 21 | 22 | 23 | true 24 | 25 | 26 | false 27 | 28 | 29 | 30 | 31 | 32 | 33 | ИмяСобытия 34 | 35 | 36 | ru 37 | Имя события 38 | 39 | 40 | 41 | 42 | xs:string 43 | 44 | 0 45 | Variable 46 | 47 | 48 | false 49 | 50 | 51 | 52 | false 53 | 54 | false 55 | false 56 | 57 | 58 | DontCheck 59 | Items 60 | 61 | 62 | Auto 63 | Auto 64 | 65 | 66 | Auto 67 | 68 | 69 | 70 | 71 | Уровень 72 | 73 | 74 | ru 75 | Уровень 76 | 77 | 78 | 79 | 80 | xs:string 81 | 82 | 0 83 | Variable 84 | 85 | 86 | false 87 | 88 | 89 | 90 | false 91 | 92 | false 93 | false 94 | 95 | 96 | DontCheck 97 | Items 98 | 99 | 100 | Auto 101 | Auto 102 | 103 | 104 | Auto 105 | 106 | 107 | 108 | 109 | -------------------------------------------------------------------------------- /src/cf/DataProcessors/МенеджерЛогированияЛог/Ext/ObjectModule.bsl: -------------------------------------------------------------------------------- 1 | ////////////////////////////////////////////////////////////////////////// 2 | // 3 | // LOGOS: реализация логирования в стиле log4j для OneScript 4 | // 5 | ////////////////////////////////////////////////////////////////////////// 6 | 7 | Перем мСозданныеЛоги; 8 | Перем мИдентификаторыЛогов; 9 | Перем мНастройкиЛогирования; 10 | 11 | ////////////////////////////////////////////////////////////////////////// 12 | // ПРОГРАММНЫЙ ИНТЕРФЕЙС 13 | 14 | Функция ПолучитьЛог(Знач ИмяЛога) Экспорт 15 | 16 | Если ИмяЛога = ИмяКорневогоЛога() Тогда 17 | ВызватьИсключение СтрШаблон("Имя %1 зарезервировано в подсистеме логирования и не должно использоваться явно.", ИмяЛога); 18 | КонецЕсли; 19 | 20 | Если мНастройкиЛогирования = Неопределено Тогда 21 | ОбновитьНастройки(); 22 | КонецЕсли; 23 | 24 | ОписаниеЛога = мСозданныеЛоги[ИмяЛога]; 25 | Если ОписаниеЛога = Неопределено Тогда 26 | ОписаниеЛога = НовыйДескрипторЛога(); 27 | ОписаниеЛога.Объект = Обработки.ИсполнительЛог.Создать(); //Новый Лог(); 28 | мСозданныеЛоги[ИмяЛога] = ОписаниеЛога; 29 | мИдентификаторыЛогов[ОписаниеЛога.Объект.ПолучитьИдентификатор()] = ИмяЛога; 30 | НастроитьЛог(ИмяЛога, ОписаниеЛога.Объект); 31 | КонецЕсли; 32 | 33 | ОписаниеЛога.СчетчикСсылок = ОписаниеЛога.СчетчикСсылок + 1; 34 | 35 | Возврат ОписаниеЛога.Объект; 36 | 37 | КонецФункции 38 | 39 | Процедура ЗакрытьЛог(Знач ОбъектЛога) Экспорт 40 | 41 | Идентификатор = ОбъектЛога.ПолучитьИдентификатор(); 42 | ИмяЛога = мИдентификаторыЛогов[Идентификатор]; 43 | Если ИмяЛога = Неопределено Тогда 44 | ОбъектЛога.Закрыть(); // Лог не создавался менеджером 45 | Возврат; 46 | КонецЕсли; 47 | 48 | ОписаниеЛога = мСозданныеЛоги[ИмяЛога]; 49 | Если ОписаниеЛога <> Неопределено Тогда 50 | ОписаниеЛога.СчетчикСсылок = ОписаниеЛога.СчетчикСсылок - 1; 51 | Если ОписаниеЛога.СчетчикСсылок <= 0 Тогда 52 | ОписаниеЛога.Объект.Закрыть(); 53 | мСозданныеЛоги.Удалить(ИмяЛога); 54 | мИдентификаторыЛогов.Удалить(Идентификатор); 55 | КонецЕсли; 56 | КонецЕсли; 57 | 58 | КонецПроцедуры 59 | 60 | Процедура ОбновитьНастройки() Экспорт 61 | 62 | мНастройкиЛогирования = Обработки.НастройкиЛогированияЛог.Создать(); //Новый НастройкиЛогирования(); 63 | мНастройкиЛогирования.ПрочитатьИзКонфигурации(); 64 | //КонфигИзСреды = ПолучитьПеременнуюСреды("LOGOS_CONFIG"); 65 | //Если ЗначениеЗаполнено(КонфигИзСреды) Тогда 66 | // КонфигИзСреды = СтрЗаменить(КонфигИзСреды, ";", Символы.ПС); 67 | // мНастройкиЛогирования.ПрочитатьИзСтроки(КонфигИзСреды); 68 | //Иначе 69 | // КаталогКонфига = СтартовыйСценарий().Каталог; 70 | // ФайлКонфига = Новый Файл(ОбъединитьПути(КаталогКонфига, "logos.cfg")); 71 | // Если ФайлКонфига.Существует() Тогда 72 | // мНастройкиЛогирования.Прочитать(ФайлКонфига.ПолноеИмя); 73 | // КонецЕсли; 74 | //КонецЕсли; 75 | 76 | КонецПроцедуры 77 | 78 | ////////////////////////////////////////////////////////////////////////// 79 | // ПРОЦЕДУРЫ МОДУЛЯ 80 | 81 | Процедура НастроитьЛог(Знач ИмяЛога, Знач ОбъектЛога) 82 | 83 | КорневаяНастройка = мНастройкиЛогирования.Получить(ИмяКорневогоЛога()); 84 | ПрименитьНастройку(ОбъектЛога, КорневаяНастройка); 85 | 86 | Настройка = мНастройкиЛогирования.Получить(ИмяЛога); 87 | ПрименитьНастройку(ОбъектЛога, Настройка); 88 | 89 | КонецПроцедуры 90 | 91 | Процедура ПрименитьНастройку(Знач ОбъектЛога, Знач Настройка) 92 | 93 | Если Настройка = Неопределено Тогда 94 | Возврат; 95 | КонецЕсли; 96 | 97 | Если Настройка.Уровень <> Неопределено Тогда 98 | ОбъектЛога.УстановитьУровень(Настройка.Уровень); 99 | КонецЕсли; 100 | 101 | Для Каждого СпособВывода Из Настройка.СпособыВывода Цикл 102 | Описание = СпособВывода.Значение; 103 | ОбъектСпособаВывода = Обработки[Описание.Класс + "Лог"].Создать(); //Новый(Описание.Класс); 104 | Для Каждого КлючИЗначение Из Описание.Свойства Цикл 105 | ОбъектСпособаВывода.УстановитьСвойство(КлючИЗначение.Ключ, КлючИЗначение.Значение); 106 | КонецЦикла; 107 | ОбъектЛога.ДобавитьСпособВывода(ОбъектСпособаВывода); 108 | КонецЦикла; 109 | 110 | КонецПроцедуры 111 | 112 | Функция НовыйДескрипторЛога() 113 | 114 | Описание = Новый Структура; 115 | Описание.Вставить("Объект", Неопределено); 116 | Описание.Вставить("СчетчикСсылок", 0); 117 | 118 | Возврат Описание; 119 | 120 | КонецФункции 121 | 122 | Процедура Инициализация() 123 | 124 | мСозданныеЛоги = Новый Соответствие; 125 | мИдентификаторыЛогов = Новый Соответствие; 126 | 127 | КонецПроцедуры 128 | 129 | Функция ИмяКорневогоЛога() 130 | Возврат "rootLogger"; 131 | КонецФункции 132 | 133 | /////////////////////////////////////////////////////////////////////////// 134 | 135 | Инициализация(); -------------------------------------------------------------------------------- /src/cf/Configuration.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 9cd510cd-abfc-11d4-9434-004095e12fc7 7 | 79ce989d-13a7-47f4-9ff5-c87467580fb8 8 | 9 | 10 | 9fcd25a0-4822-11d4-9414-008048da11f9 11 | b702bd2e-974a-4313-af2e-d427f8854f60 12 | 13 | 14 | e3687481-0a87-462c-a166-9f34594f9bba 15 | 98fa74a8-c82e-46aa-9ac8-d09f7c53427d 16 | 17 | 18 | 9de14907-ec23-4a07-96f0-85521cb6b53b 19 | 6abd3a24-86d4-464b-9968-80eedf040e3d 20 | 21 | 22 | 51f2d5d8-ea4d-4064-8892-82951750031e 23 | 48903705-7b2e-4038-b31d-620cb6903c20 24 | 25 | 26 | e68182ea-4237-4383-967f-90c1e3370bc7 27 | 3a0ddeeb-1847-4618-8aca-8ba2e3529ae4 28 | 29 | 30 | 31 | logos 32 | 33 | 34 | ru 35 | Logos 36 | 37 | 38 | 39 | 40 | Version8_3_10 41 | ManagedApplication 42 | 43 | PersonalComputer 44 | 45 | Russian 46 | 47 | 48 | 1.0.0 49 | 50 | false 51 | false 52 | false 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | Multimedia 68 | false 69 | 70 | 71 | Location 72 | false 73 | 74 | 75 | Contacts 76 | false 77 | 78 | 79 | Calendars 80 | false 81 | 82 | 83 | Telephony 84 | false 85 | 86 | 87 | PushNotification 88 | false 89 | 90 | 91 | LocalNotification 92 | false 93 | 94 | 95 | Print 96 | false 97 | 98 | 99 | InAppPurchases 100 | false 101 | 102 | 103 | Ads 104 | false 105 | 106 | 107 | Normal 108 | 109 | 110 | Language.Русский 111 | 112 | 113 | 114 | 115 | 116 | Managed 117 | NotAutoFree 118 | DontUse 119 | DontUse 120 | Taxi 121 | Version8_3_10 122 | 123 | 124 | 125 | Русский 126 | OscriptLibrary 127 | МенеджерЛогированияЛог 128 | ИсполнительЛог 129 | НастройкиЛогированияЛог 130 | ВыводЛогаВКонсольЛог 131 | ВыводЛогаВФайлЛог 132 | ВыводЛогаВЖРЛог 133 | 134 | 135 | -------------------------------------------------------------------------------- /src/cf/DataProcessors/ИсполнительЛог.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 58628374-d4a5-418f-a184-a8287b14afdd 7 | 354034ce-adf1-4630-bf54-a33e1c628f42 8 | 9 | 10 | eeaabe09-d49b-4282-99df-89fae44287de 11 | 343ac2b5-1648-4c1b-aff3-3e397e3487fd 12 | 13 | 14 | 15 | ИсполнительЛог 16 | 17 | 18 | ru 19 | Исполнитель лог 20 | 21 | 22 | 23 | true 24 | 25 | 26 | false 27 | 28 | 29 | 30 | 31 | 32 | 33 | мТекущийУровень 34 | 35 | 36 | ru 37 | М текущий уровень 38 | 39 | 40 | 41 | 42 | false 43 | 44 | 45 | 46 | false 47 | 48 | false 49 | false 50 | 51 | 52 | DontCheck 53 | Items 54 | 55 | 56 | Auto 57 | Auto 58 | 59 | 60 | Auto 61 | 62 | 63 | 64 | 65 | мСпособыВывода 66 | 67 | 68 | ru 69 | М способы вывода 70 | 71 | 72 | 73 | 74 | false 75 | 76 | 77 | 78 | false 79 | 80 | false 81 | false 82 | 83 | 84 | DontCheck 85 | Items 86 | 87 | 88 | Auto 89 | Auto 90 | 91 | 92 | Auto 93 | 94 | 95 | 96 | 97 | мСпособВыводаЗаданВручную 98 | 99 | 100 | ru 101 | М способ вывода задан вручную 102 | 103 | 104 | 105 | 106 | false 107 | 108 | 109 | 110 | false 111 | 112 | false 113 | false 114 | 115 | 116 | DontCheck 117 | Items 118 | 119 | 120 | Auto 121 | Auto 122 | 123 | 124 | Auto 125 | 126 | 127 | 128 | 129 | мИдентификатор 130 | 131 | 132 | ru 133 | М идентификатор 134 | 135 | 136 | 137 | 138 | xs:string 139 | 140 | 0 141 | Variable 142 | 143 | 144 | false 145 | 146 | 147 | 148 | false 149 | 150 | false 151 | false 152 | 153 | 154 | DontCheck 155 | Items 156 | 157 | 158 | Auto 159 | Auto 160 | 161 | 162 | Auto 163 | 164 | 165 | 166 | 167 | мРаскладкаСообщения 168 | 169 | 170 | ru 171 | М раскладка сообщения 172 | 173 | 174 | 175 | 176 | false 177 | 178 | 179 | 180 | false 181 | 182 | false 183 | false 184 | 185 | 186 | DontCheck 187 | Items 188 | 189 | 190 | Auto 191 | Auto 192 | 193 | 194 | Auto 195 | 196 | 197 | 198 | 199 | УровниЛога 200 | 201 | 202 | ru 203 | Уровни лога 204 | 205 | 206 | 207 | 208 | false 209 | 210 | 211 | 212 | false 213 | 214 | false 215 | false 216 | 217 | 218 | DontCheck 219 | Items 220 | 221 | 222 | Auto 223 | Auto 224 | 225 | 226 | Auto 227 | 228 | 229 | 230 | 231 | -------------------------------------------------------------------------------- /src/cf/DataProcessors/ИсполнительЛог/Ext/ObjectModule.bsl: -------------------------------------------------------------------------------- 1 | ////////////////////////////////////////////////////////////////////////// 2 | // 3 | // LOGOS: реализация логирования в стиле log4j для OneScript 4 | // 5 | ////////////////////////////////////////////////////////////////////////// 6 | 7 | #Область УровниЛога 8 | 9 | Перем мУровниПриоритета; 10 | Перем мНаименованиеУровней; 11 | 12 | Перем Отладка Экспорт; 13 | Перем Информация Экспорт; 14 | Перем Предупреждение Экспорт; 15 | Перем Ошибка Экспорт; 16 | Перем КритичнаяОшибка Экспорт; 17 | Перем Отключить Экспорт; 18 | 19 | #КонецОбласти 20 | 21 | #Область Логирование 22 | 23 | //Перем мТекущийУровень; 24 | //Перем мСпособыВывода; 25 | //Перем мСпособВыводаЗаданВручную; 26 | 27 | //Перем мИдентификатор; 28 | //Перем мРаскладкаСообщения; 29 | 30 | 31 | Функция Уровень() Экспорт 32 | Возврат мТекущийУровень; 33 | КонецФункции 34 | 35 | Процедура УстановитьУровень(Знач Уровень) Экспорт 36 | Если Уровень < 0 или Уровень > УровниЛога.Отключить Тогда 37 | ВызватьИсключение "Неверное значение аргумента 'Уровень'"; 38 | КонецЕсли; 39 | 40 | мТекущийУровень = Уровень; 41 | 42 | КонецПроцедуры 43 | 44 | Процедура УстановитьРаскладку(Знач Раскладка) Экспорт 45 | мРаскладкаСообщения = Раскладка; 46 | КонецПроцедуры 47 | 48 | Процедура Закрыть() Экспорт 49 | Для Каждого СпособВывода Из мСпособыВывода Цикл 50 | СпособВывода.Закрыть(); 51 | КонецЦикла; 52 | мСпособыВывода.Очистить(); 53 | КонецПроцедуры 54 | 55 | Процедура ДобавитьСпособВывода(Знач СпособВывода) Экспорт 56 | 57 | Если Не мСпособВыводаЗаданВручную Тогда 58 | Закрыть(); 59 | мСпособВыводаЗаданВручную = Истина; 60 | КонецЕсли; 61 | 62 | мСпособыВывода.Добавить(СпособВывода); 63 | 64 | КонецПроцедуры 65 | 66 | Процедура УдалитьСпособВывода(Знач СпособВывода) Экспорт 67 | 68 | Для Сч = 0 По мСпособыВывода.Количество()-1 Цикл 69 | Если мСпособыВывода[Сч] = СпособВывода Тогда 70 | СпособВывода.Закрыть(); 71 | мСпособыВывода.Удалить(Сч); 72 | Прервать; 73 | КонецЕсли; 74 | КонецЦикла; 75 | 76 | КонецПроцедуры 77 | 78 | Функция ПолучитьИдентификатор() Экспорт 79 | Возврат мИдентификатор; 80 | КонецФункции 81 | 82 | Процедура Отладка(Знач Сообщение, 83 | Знач Параметр1 = Неопределено, Знач Параметр2 = Неопределено, Знач Параметр3 = Неопределено, 84 | Знач Параметр4 = Неопределено, Знач Параметр5 = Неопределено, Знач Параметр6 = Неопределено, 85 | Знач Параметр7 = Неопределено, Знач Параметр8 = Неопределено, Знач Параметр9 = Неопределено) Экспорт 86 | 87 | Вывести(Сообщение, УровниЛога.Отладка, Параметр1, 88 | Параметр2, Параметр3, Параметр4, Параметр5, Параметр6, Параметр7, Параметр8, Параметр9); 89 | КонецПроцедуры 90 | 91 | Процедура Информация(Знач Сообщение, 92 | Знач Параметр1 = Неопределено, Знач Параметр2 = Неопределено, Знач Параметр3 = Неопределено, 93 | Знач Параметр4 = Неопределено, Знач Параметр5 = Неопределено, Знач Параметр6 = Неопределено, 94 | Знач Параметр7 = Неопределено, Знач Параметр8 = Неопределено, Знач Параметр9 = Неопределено) Экспорт 95 | 96 | Вывести(Сообщение, УровниЛога.Информация, Параметр1, 97 | Параметр2, Параметр3, Параметр4, Параметр5, Параметр6, Параметр7, Параметр8, Параметр9); 98 | 99 | КонецПроцедуры 100 | 101 | Процедура _Предупреждение(Знач Сообщение, 102 | Знач Параметр1 = Неопределено, Знач Параметр2 = Неопределено, Знач Параметр3 = Неопределено, 103 | Знач Параметр4 = Неопределено, Знач Параметр5 = Неопределено, Знач Параметр6 = Неопределено, 104 | Знач Параметр7 = Неопределено, Знач Параметр8 = Неопределено, Знач Параметр9 = Неопределено) Экспорт 105 | 106 | Вывести(Сообщение, УровниЛога.Предупреждение, Параметр1, 107 | Параметр2, Параметр3, Параметр4, Параметр5, Параметр6, Параметр7, Параметр8, Параметр9); 108 | 109 | КонецПроцедуры 110 | 111 | Процедура Ошибка(Знач Сообщение, 112 | Знач Параметр1 = Неопределено, Знач Параметр2 = Неопределено, Знач Параметр3 = Неопределено, 113 | Знач Параметр4 = Неопределено, Знач Параметр5 = Неопределено, Знач Параметр6 = Неопределено, 114 | Знач Параметр7 = Неопределено, Знач Параметр8 = Неопределено, Знач Параметр9 = Неопределено) Экспорт 115 | 116 | Вывести(Сообщение, УровниЛога.Ошибка, Параметр1, 117 | Параметр2, Параметр3, Параметр4, Параметр5, Параметр6, Параметр7, Параметр8, Параметр9); 118 | 119 | КонецПроцедуры 120 | 121 | Процедура КритичнаяОшибка(Знач Сообщение, 122 | Знач Параметр1 = Неопределено, Знач Параметр2 = Неопределено, Знач Параметр3 = Неопределено, 123 | Знач Параметр4 = Неопределено, Знач Параметр5 = Неопределено, Знач Параметр6 = Неопределено, 124 | Знач Параметр7 = Неопределено, Знач Параметр8 = Неопределено, Знач Параметр9 = Неопределено) Экспорт 125 | 126 | Вывести(Сообщение, УровниЛога.КритичнаяОшибка, Параметр1, 127 | Параметр2, Параметр3, Параметр4, Параметр5, Параметр6, Параметр7, Параметр8, Параметр9); 128 | 129 | КонецПроцедуры 130 | 131 | Процедура Вывести(Знач Сообщение, Знач УровеньСообщения, 132 | Знач Параметр1 = Неопределено, Знач Параметр2 = Неопределено, Знач Параметр3 = Неопределено, 133 | Знач Параметр4 = Неопределено, Знач Параметр5 = Неопределено, Знач Параметр6 = Неопределено, 134 | Знач Параметр7 = Неопределено, Знач Параметр8 = Неопределено, Знач Параметр9 = Неопределено) Экспорт 135 | 136 | // TODO когда решится баг https://github.com/EvilBeaver/oscript-library/pull/110 137 | Если Параметр1 <> Неопределено Тогда 138 | Сообщение = СтрШаблон(Сообщение, Параметр1, 139 | Параметр2, Параметр3, Параметр4, Параметр5, Параметр6, Параметр7, Параметр8, Параметр9); 140 | КонецЕсли; 141 | 142 | Если УровеньСообщения >= Уровень() Тогда 143 | Для Каждого СпособВывода Из мСпособыВывода Цикл 144 | СпособВывода.Вывести(мРаскладкаСообщения.Форматировать(УровеньСообщения, Сообщение)); 145 | КонецЦикла; 146 | КонецЕсли 147 | 148 | КонецПроцедуры 149 | 150 | Процедура Инициализация() 151 | 152 | ЗаполнитьУровниЛога(); 153 | 154 | ИнициализироватьУровни(); 155 | ИнициализироватьНаименованияУровней(); 156 | 157 | УстановитьУровень(УровниЛога.Информация); 158 | ИнициализироватьСпособыВывода(); 159 | мИдентификатор = Новый УникальныйИдентификатор; 160 | 161 | КонецПроцедуры 162 | 163 | Процедура ЗаполнитьУровниЛога() 164 | Если Не ЗначениеЗаполнено(УровниЛога) Тогда 165 | УровниЛога = Новый Структура; 166 | УровниЛога.Вставить("Отладка" , 0); 167 | УровниЛога.Вставить("Информация" , 1); 168 | УровниЛога.Вставить("Предупреждение" , 2); 169 | УровниЛога.Вставить("Ошибка" , 3); 170 | УровниЛога.Вставить("КритичнаяОшибка", 4); 171 | УровниЛога.Вставить("Отключить" , 5); 172 | 173 | УровниЛога = Новый ФиксированнаяСтруктура(УровниЛога); 174 | КонецЕсли; 175 | КонецПроцедуры 176 | 177 | Процедура ИнициализироватьСпособыВывода() 178 | 179 | мРаскладкаСообщения = ЭтотОбъект; //Новый ОсновнаяРаскладкаСообщения; 180 | 181 | мСпособВыводаЗаданВручную = Ложь; 182 | мСпособыВывода = Новый Массив; 183 | 184 | ВыводПоУмолчанию = Обработки.ВыводЛогаВКонсольЛог.Создать(); //Новый ВыводЛогаВКонсоль(); 185 | мСпособыВывода.Добавить(ВыводПоУмолчанию); 186 | 187 | ВыводПоУмолчанию = Обработки.ВыводЛогаВЖРЛог.Создать(); 188 | мСпособыВывода.Добавить(ВыводПоУмолчанию); 189 | 190 | КонецПроцедуры 191 | 192 | #КонецОбласти 193 | 194 | #Область УровниЛога 195 | 196 | ////////////////////////////////////////////////////////////////////////////////// 197 | 198 | Функция НаименованиеУровня(Знач Уровень) Экспорт 199 | Возврат мНаименованиеУровней[Уровень]; 200 | КонецФункции 201 | 202 | 203 | ////////////////////////////////////////////////////////////////////////////////// 204 | // СЛУЖЕБНЫЕ ПРОЦЕДУРЫ 205 | // 206 | 207 | //Процедура Инициализация() 208 | // 209 | // ИнициализироватьУровни(); 210 | // ИнициализироватьНаименованияУровней(); 211 | // 212 | //КонецПроцедуры 213 | 214 | Процедура ИнициализироватьУровни() 215 | 216 | мУровниПриоритета = Новый Структура; 217 | мУровниПриоритета.Вставить("Отладка" , 0); 218 | мУровниПриоритета.Вставить("Информация" , 1); 219 | мУровниПриоритета.Вставить("Предупреждение" , 2); 220 | мУровниПриоритета.Вставить("Ошибка" , 3); 221 | мУровниПриоритета.Вставить("КритичнаяОшибка", 4); 222 | мУровниПриоритета.Вставить("Отключить" , 5); 223 | 224 | мТекущийУровень = мУровниПриоритета.Информация; 225 | 226 | Для Каждого КлючИЗначение Из мУровниПриоритета Цикл 227 | //ЭтотОбъект[КлючИЗначение.Ключ] = КлючИЗначение.Значение; 228 | Выполнить(СтрШаблон("%1 = %2;", КлючИЗначение.Ключ, КлючИЗначение.Значение)); 229 | КонецЦикла; 230 | 231 | КонецПроцедуры 232 | 233 | Процедура ИнициализироватьНаименованияУровней() 234 | 235 | мНаименованиеУровней = Новый Соответствие; 236 | мНаименованиеУровней.Вставить(мУровниПриоритета.Отладка , "ОТЛАДКА"); 237 | мНаименованиеУровней.Вставить(мУровниПриоритета.Информация , "ИНФОРМАЦИЯ"); 238 | мНаименованиеУровней.Вставить(мУровниПриоритета.Предупреждение , "ПРЕДУПРЕЖДЕНИЕ"); 239 | мНаименованиеУровней.Вставить(мУровниПриоритета.Ошибка , "ОШИБКА"); 240 | мНаименованиеУровней.Вставить(мУровниПриоритета.КритичнаяОшибка, "КРИТИЧНАЯОШИБКА"); 241 | мНаименованиеУровней.Вставить(мУровниПриоритета.Отключить , "ОТКЛЮЧИТЬ"); 242 | 243 | КонецПроцедуры 244 | 245 | //Инициализация(); 246 | 247 | #КонецОбласти 248 | 249 | #Область ОсновнаяРаскладкаСообщения 250 | 251 | Функция Форматировать(Знач Уровень, Знач Сообщение) Экспорт 252 | 253 | Возврат СтрШаблон("%1 - %2", НаименованиеУровня(Уровень), Сообщение); 254 | //Возврат СтрШаблон("%1 - %2", УровниЛога.НаименованиеУровня(Уровень), Сообщение); 255 | 256 | КонецФункции 257 | 258 | #КонецОбласти 259 | 260 | Инициализация(); 261 | -------------------------------------------------------------------------------- /src/cf/DataProcessors/НастройкиЛогированияЛог/Ext/ObjectModule.bsl: -------------------------------------------------------------------------------- 1 | 2 | Перем мПрочитанныеНастройкиЛоггеров; 3 | Перем мПрочитанныеСпособыВывода; 4 | Перем мНастройкиЛогирования; 5 | Перем ОбратнаяКартаУровней; 6 | 7 | Процедура ПрочитатьИзКонфигурации() Экспорт 8 | 9 | СтрокаНастройкиЛогирования = ХранилищеОбщихНастроек.Загрузить(КлючНастройкиХранилища()); 10 | Если СтрокаНастройкиЛогирования = Неопределено Тогда 11 | Попытка 12 | УстановитьПривилегированныйРежим(Истина); 13 | СтрокаНастройкиЛогирования = ХранилищеОбщихНастроек.Загрузить(КлючНастройкиХранилища(), , , ИмяОбщегоВиртуальногоПользователя()); 14 | Исключение 15 | КонецПопытки; 16 | КонецЕсли; 17 | 18 | Если СтрокаНастройкиЛогирования <> Неопределено Тогда 19 | 20 | //ПрочитатьИзСтроки(СтрокаНастройкиЛогирования); 21 | ПрочитатьКонфигурацию(СтрокаНастройкиЛогирования); 22 | 23 | КонецЕсли; 24 | 25 | КонецПроцедуры 26 | 27 | Процедура ЗаписатьВКонфигурацию(Знач ИмяЛога, Знач Уровень, Знач ДопПараметры = "", Знач ОбщиеНастройки = Ложь) Экспорт 28 | Если Не ЗначениеЗаполнено(ДопПараметры) Тогда 29 | ДопПараметры = ОбратнаяКартаУровней[Уровень]; 30 | КонецЕсли; 31 | Строка = СтрШаблон("logger.%1=%2", ИмяЛога, ДопПараметры); 32 | 33 | ТекстовыйДокумент = Новый ТекстовыйДокумент; 34 | ТекстовыйДокумент.УстановитьТекст(Строка); 35 | 36 | Если ОбщиеНастройки Тогда 37 | //УстановитьПривилегированныйРежим(Истина); 38 | ХранилищеОбщихНастроек.Сохранить(КлючНастройкиХранилища(), , ТекстовыйДокумент, , ИмяОбщегоВиртуальногоПользователя()); 39 | Иначе 40 | ХранилищеОбщихНастроек.Сохранить(КлючНастройкиХранилища(), , ТекстовыйДокумент); 41 | КонецЕсли; 42 | КонецПроцедуры 43 | 44 | // Читает настройки из конфигурационного файла 45 | // 46 | Процедура Прочитать(Знач ИмяФайла) Экспорт 47 | 48 | Документ = Новый ТекстовыйДокумент; 49 | Документ.Прочитать(ИмяФайла); 50 | ПрочитатьКонфигурацию(Документ); 51 | 52 | КонецПроцедуры // Прочитать(Знач ИмяФайла) 53 | 54 | Процедура ПрочитатьИзСтроки(Знач Строка) Экспорт 55 | Документ = Новый ТекстовыйДокумент; 56 | Документ.УстановитьТекст(Строка); 57 | ПрочитатьКонфигурацию(Документ); 58 | КонецПроцедуры 59 | 60 | Процедура ПрочитатьКонфигурацию(Знач Документ) 61 | мПрочитанныеСпособыВывода = Новый Соответствие; 62 | мПрочитанныеНастройкиЛоггеров = Новый Соответствие; 63 | 64 | Для Сч = 1 По Документ.КоличествоСтрок() Цикл 65 | СтрокаНастроек = Документ.ПолучитьСтроку(Сч); 66 | 67 | ОбработатьСтрокуНастроек(СтрокаНастроек); 68 | 69 | КонецЦикла; 70 | 71 | СоздатьОбъектыНастроек(); 72 | 73 | КонецПроцедуры 74 | 75 | // Получает опции по которым будет настроен логгер 76 | // 77 | Функция Получить(Знач ИмяЛоггера) Экспорт 78 | 79 | Если мНастройкиЛогирования = Неопределено Тогда 80 | Возврат Неопределено; 81 | Иначе 82 | Возврат мНастройкиЛогирования[ИмяЛоггера]; 83 | КонецЕсли; 84 | 85 | КонецФункции 86 | 87 | Процедура ОбработатьСтрокуНастроек(Знач СтрокаНастроек) 88 | 89 | Если Лев(СтрокаНастроек,1) = "#" Или ПустаяСтрока(СтрокаНастроек) Тогда 90 | // комментарий 91 | Возврат; 92 | КонецЕсли; 93 | 94 | Поз = Найти(СтрокаНастроек, "="); 95 | Если Поз = 0 Тогда 96 | ВызватьИсключение "Неверный формат строки настроек: " + СтрокаНастроек; 97 | КонецЕсли; 98 | 99 | Ключ = Лев(СтрокаНастроек, Поз-1); 100 | Значение = Сред(СтрокаНастроек, Поз+1); 101 | 102 | КлассНастроек = ОчереднойФрагмент(Ключ); 103 | 104 | Если ПустаяСтрока(Ключ) Тогда 105 | ВызватьИсключение "Неверная строка настроек, нет опций у класса: " + КлассНастроек; 106 | КонецЕсли; 107 | 108 | ОбработатьКлассНастроек(КлассНастроек, Ключ, Значение); 109 | 110 | КонецПроцедуры 111 | 112 | Процедура СоздатьОбъектыНастроек() 113 | 114 | мНастройкиЛогирования = Новый Соответствие; 115 | КартаУровней = СоздатьКартуУровней(); 116 | //КартаУровней = Новый Соответствие; 117 | //КартаУровней.Вставить("DEBUG", УровниЛога.Отладка); 118 | //КартаУровней.Вставить("INFO", УровниЛога.Информация); 119 | //КартаУровней.Вставить("WARN", УровниЛога.Предупреждение); 120 | //КартаУровней.Вставить("ERROR", УровниЛога.Ошибка); 121 | //КартаУровней.Вставить("CRITICALERROR", УровниЛога.КритичнаяОшибка); 122 | //КартаУровней.Вставить("DISABLE", УровниЛога.Отключить); 123 | 124 | Для каждого ОбъявленныйЛоггер Из мПрочитанныеНастройкиЛоггеров Цикл 125 | 126 | Настройка = Новый Структура; 127 | Настройка.Вставить("Уровень", КартаУровней[ОбъявленныйЛоггер.Значение.Уровень]); 128 | Настройка.Вставить("СпособыВывода", Новый Соответствие); 129 | 130 | Для Каждого ПривязанныйСпособВывода Из ОбъявленныйЛоггер.Значение.Аппендеры Цикл 131 | Аппендер = мПрочитанныеСпособыВывода[ПривязанныйСпособВывода]; 132 | Если Аппендер = Неопределено Тогда 133 | ВызватьИсключение СтрШаблон("К логу {%1} привязан способ вывода {%2}, но этот способ нигде не описан", 134 | ОбъявленныйЛоггер.Ключ, 135 | ПривязанныйСпособВывода); 136 | КонецЕсли; 137 | 138 | Настройка.СпособыВывода.Вставить(ПривязанныйСпособВывода, Аппендер); 139 | 140 | КонецЦикла; 141 | 142 | мНастройкиЛогирования.Вставить(ОбъявленныйЛоггер.Ключ, Настройка); 143 | 144 | КонецЦикла; 145 | 146 | КонецПроцедуры 147 | 148 | Функция ОчереднойФрагмент(Ключ, Разделитель=".") 149 | Поз = Найти(Ключ, Разделитель); 150 | Если Поз > 0 Тогда 151 | Ответ = Лев(Ключ, Поз-1); 152 | Ключ = Сред(Ключ, Поз+1); 153 | Иначе 154 | Ответ = Ключ; 155 | Ключ = ""; 156 | КонецЕсли; 157 | 158 | Возврат Ответ; 159 | КонецФункции // ОчереднойФрагмент(Ключ) 160 | 161 | Процедура ОбработатьКлассНастроек(Знач КлассНастроек, Знач Ключ, Знач Значение) 162 | 163 | Если КлассНастроек = "logger" Тогда 164 | ОбработатьНастройкуЛоггера(Ключ, Значение); 165 | ИначеЕсли КлассНастроек = "appender" Тогда 166 | ОбработатьНастройкуСпособаВывода(Ключ, Значение); 167 | Иначе 168 | ВызватьИсключение "Неизвестный класс настроек: " + КлассНастроек; 169 | КонецЕсли 170 | 171 | КонецПроцедуры 172 | 173 | Процедура ОбработатьНастройкуЛоггера(Знач Ключ, Знач Значение) 174 | 175 | ПрочитаннаяНастройка = Новый Структура; 176 | ПрочитаннаяНастройка.Вставить("Уровень"); 177 | ПрочитаннаяНастройка.Вставить("Аппендеры"); 178 | мПрочитанныеНастройкиЛоггеров.Вставить(Ключ, ПрочитаннаяНастройка); 179 | 180 | ПрочитаннаяНастройка.Уровень = СокрЛП(ОчереднойФрагмент(Значение, ",")); 181 | Если Не ИзвестныйУровеньЛога(ПрочитаннаяНастройка.Уровень) Тогда 182 | ВызватьИсключение "Неизвестный уровень лога: " + ПрочитаннаяНастройка.Уровень; 183 | КонецЕсли; 184 | 185 | ПрочитаннаяНастройка.Аппендеры = Новый Массив; 186 | Пока Не ПустаяСтрока(Значение) Цикл 187 | Аппендер = СокрЛП(ОчереднойФрагмент(Значение, ",")); 188 | Если Не ПустаяСтрока(Аппендер) Тогда 189 | ПрочитаннаяНастройка.Аппендеры.Добавить(Аппендер); 190 | КонецЕсли; 191 | КонецЦикла; 192 | 193 | КонецПроцедуры 194 | 195 | Процедура ОбработатьНастройкуСпособаВывода(Знач Ключ, Знач Значение) 196 | 197 | ИмяАппендера = ОчереднойФрагмент(Ключ); 198 | Если ПустаяСтрока(Ключ) Тогда 199 | // это объявление аппендера, обязательный элемент 200 | ОписаниеАппендера = Новый Структура; 201 | ОписаниеАппендера.Вставить("Класс", Значение); 202 | ОписаниеАппендера.Вставить("Свойства", Новый Соответствие); 203 | мПрочитанныеСпособыВывода[ИмяАппендера] = ОписаниеАппендера; 204 | Иначе 205 | // это свойство аппендера, сам аппендер обязан быть описан ранее 206 | НастройкаАппендера = мПрочитанныеСпособыВывода[ИмяАппендера]; 207 | Если НастройкаАппендера = Неопределено Тогда 208 | ВызватьИсключение СтрШаблон("Неверная структура файла. Класс способа вывода {%1} должен быть описан ранее строки {%2}", 209 | ИмяАппендера, 210 | ИмяАппендера + "." + Ключ); 211 | КонецЕсли; 212 | НастройкаАппендера.Свойства.Вставить(Ключ, Значение); 213 | КонецЕсли; 214 | 215 | КонецПроцедуры 216 | 217 | Функция ИзвестныйУровеньЛога(Знач ИмяУровня) 218 | 219 | ДопустимыеУровни = "DEFAULT,DEBUG,INFO,WARN,ERROR,CRITICALERROR,DISABLE,"; 220 | Возврат Найти(ДопустимыеУровни, ИмяУровня+",") > 0; 221 | 222 | КонецФункции 223 | 224 | Функция КлючНастройкиХранилища() 225 | Возврат "НастройкиЛогированияЛог"; 226 | КонецФункции 227 | 228 | Функция ИмяОбщегоВиртуальногоПользователя() 229 | Возврат "НастройкиЛогированияЛог"; 230 | КонецФункции 231 | 232 | Функция СоздатьКартуУровней() 233 | КартаУровней = Новый Соответствие; 234 | КартаУровней.Вставить("DEBUG", УровниЛога.Отладка); 235 | КартаУровней.Вставить("INFO", УровниЛога.Информация); 236 | КартаУровней.Вставить("WARN", УровниЛога.Предупреждение); 237 | КартаУровней.Вставить("ERROR", УровниЛога.Ошибка); 238 | КартаУровней.Вставить("CRITICALERROR", УровниЛога.КритичнаяОшибка); 239 | КартаУровней.Вставить("DISABLE", УровниЛога.Отключить); 240 | Возврат КартаУровней; 241 | КонецФункции 242 | 243 | Функция СоздатьОбратнуюКартуУровней() 244 | 245 | Если Не ЗначениеЗаполнено(ОбратнаяКартаУровней) Тогда 246 | Карта = Новый Соответствие; 247 | КартаУровней = СоздатьКартуУровней(); 248 | Для Каждого КлючЗначение Из КартаУровней Цикл 249 | Карта.Вставить(КлючЗначение.Значение, КлючЗначение.Ключ); 250 | КонецЦикла; 251 | 252 | ОбратнаяКартаУровней = Новый ФиксированноеСоответствие(Карта); 253 | КонецЕсли; 254 | 255 | Возврат ОбратнаяКартаУровней; 256 | КонецФункции 257 | 258 | 259 | Процедура ЗаполнитьУровниЛога() 260 | Если Не ЗначениеЗаполнено(УровниЛога) Тогда 261 | УровниЛога = Новый Структура; 262 | УровниЛога.Вставить("Отладка" , 0); 263 | УровниЛога.Вставить("Информация" , 1); 264 | УровниЛога.Вставить("Предупреждение" , 2); 265 | УровниЛога.Вставить("Ошибка" , 3); 266 | УровниЛога.Вставить("КритичнаяОшибка", 4); 267 | УровниЛога.Вставить("Отключить" , 5); 268 | 269 | УровниЛога = Новый ФиксированнаяСтруктура(УровниЛога); 270 | КонецЕсли; 271 | КонецПроцедуры 272 | 273 | ЗаполнитьУровниЛога(); 274 | СоздатьОбратнуюКартуУровней(); -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # Логирование в стиле log4j 2 | 3 | Библиотека предназначена для удобного вывода сообщений в привязке к их "уровням важности" 4 | 5 | Функционал logos не повторяет полностью log4j, а, скорее, берет из него какие-то аспекты поведения. 6 | 7 | Библиотека портирована на платформу 1С из пакета https://github.com/oscript-library/logos 8 | 9 | # Использование 10 | 11 | ## Именованные журналы сообщений (Логи) 12 | 13 | Каждый лог имеет собственное имя, по которому он может быть идентифицирован. Имена логов глобально видимы и любой из них может быть получен по имени лога. 14 | 15 | Для того, чтобы начать логирование, требуется вызвать метод `ПолучитьЛог` модуля `Логирование` 16 | 17 | Лог = Логирование.ПолучитьЛог("oscript.app.messages"); 18 | 19 | ### Соглашение об именовании 20 | 21 | Принята следующая схема именования логов: 22 | 23 | область.класс_приложения.имя_лога 24 | 25 | * Область - это произвольное имя, определяющее некую совокупность возможных логов. Часто, в качестве области используется имя поставщика приложения, либо имя набора библиотек. Для всех пакетов, входящих в oscript-library используется имя области "oscript". Приложения, создаваемые, например, в рамках гипотетического проекта "Аврора" могут использовать область "aurora". 26 | * Класс_приложения - это разделитель на тип модуля - библиотека, или приложение. Например, библиотечный пакет "cmdline" использует класс `lib`, а консольное приложение "gitsync" - класс 'app' 27 | * Имя_лога - это, собственно, идентификатор журнала. 28 | 29 | ### Примечание 30 | 31 | В отличие от log4j логи в logos не являются иерархическими, но в перспективе могут стать таковыми. 32 | 33 | ## Уровни логирования 34 | 35 | Существует 5 уровней важности сообщений: 36 | 37 | * Отладка 38 | * Информация 39 | * Предупреждение 40 | * Ошибка 41 | * Критичная ошибка 42 | 43 | Для каждого из уровней logos предоставляет отдельный метод, который выводит сообщение с данным уровнем важности. В процессе эксплуатации приложения для каждого из логов можно устанавливать уровень выводимых сообщений. Например, если установлен уровень "Предупреждение", то выводиться будут только предупреждения или более важные сообщения (Ошибка, КритичнаяОшибка) 44 | 45 | Лог.УстановитьУровень(УровниЛога.Отладка) // выводить все, в т.ч. отладочные сообщения 46 | 47 | По умолчанию установлен уровень "Информация". 48 | 49 | ### Пример использования 50 | 51 | Лог = Логирование.ПолучитьЛог("oscript.test.levels"); 52 | Лог.УстановитьУровень(УровниЛога.Ошибка); 53 | 54 | Лог.Отладка("Переменная А = 7"); 55 | Лог.Информация("Переменная А = 7"); 56 | Лог.Ошибка("Неверно указан путь к файлу!"); 57 | 58 | ПеремА = "А"; 59 | Лог.Отладка("Переменная %1 = %2", ПеремА, 7); 60 | Лог.Информация("Переменная %1 = %2", ПеремА, 7); 61 | Лог.Ошибка("Неверно указан путь к файлу %1!", ПеремА); 62 | 63 | ## Способы вывода (appenders) 64 | 65 | Приложение выводит сообщения в лог, а сам лог может выводиться в произвольное место. За конкретную реализацию вывода отвечает *Способ вывода*. В Log4j это называется appender. 66 | 67 | В составе logos поставляется 2 способа вывода - в консоль и в файл. 68 | Причем, способы вывода - это список, т.е. лог может писаться в несколько мест одновременно. 69 | 70 | ФайлЖурнала = Новый ВыводЛогаВФайл 71 | ФайлЖурнала.ОткрытьФайл("/var/log/oscript.test.log"); 72 | Лог.ДобавитьСпособВывода(ФайлЖурнала); 73 | Лог.Информация("Это строка лога"); 74 | Лог.Закрыть(); // при включении логирования в файл рекомендуется закрывать лог. 75 | 76 | ### Особенности добавления Способов вывода 77 | 78 | При создании лога в него автоматически будет добавлен способ вывода *ВыводЛогаВКонсоль*. Однако, если вручную в лог будет добавлен другой способ вывода, то "автоспособ" будет удален. Иными словами, пример кода выше будет писать только в файл, т.к. консольный вывод при ручном добавлении способа вывода будет отключен. 79 | 80 | ## Форматирование сообщений 81 | 82 | За форматирование выводимых сообщений отвечает *Раскладка*. Раскладка по умолчанию форматирует сообщения следующим образом: 83 | 84 | УРОВЕНЬСООБЩЕНИЯ - ТекстСообщения 85 | 86 | Раскладка - это класс, реализующий метод *Форматировать(Знач Уровень, Знач Сообщение)*. Установить собственную раскладку можно методом "УстановитьРаскладку". 87 | 88 | Функция Форматировать(Знач Уровень, Знач Сообщение) Экспорт 89 | 90 | Возврат СтрШаблон("%1: %2 - %3", ТекущаяДата(), УровниЛога.НаименованиеУровня(Уровень), Сообщение); 91 | 92 | КонецФункции 93 | 94 | Лог.УстановитьРаскладку(ЭтотОбъект); 95 | 96 | В приведенной раскладке в сообщение помимо уровня и текста будет добавлено текущая дата. 97 | 98 | # Конфигурирование логов 99 | 100 | Предусмотрено изменение параметров логирования через специальный файл конфигурации, либо через переменную окружения. 101 | Независимо от способа задания настроек, формат настроек остается одинаковым. 102 | 103 | Файл конфигурации должен лежать рядом со стартовым скриптом (см. метод *СтартовыйСценарий()*) и называться *logos.cfg*. Кроме того, настройки можно задать через переменную окружения LOGOS_CONFIG. Из-за неудобства ввода перевода строк в переменных окружения - в данном случае настройки надо разделять не переводом строк, а точкой-с-запятой. Формат настроек идентичен, независимо от способа задания конфига - в файле или в переменной. 104 | 105 | Следует учитывать, что переменная окружения имеет приоритет над файлом, и если задана она, то настройки берутся из нее, файл игнорируется. 106 | 107 | ### Пример задания настроек через командную строку: 108 | ```cmd 109 | set LOGOS_CONFIG=logger.oscript.lib.commands=DEBUG;logger.oscript.lib.cmdline=DEBUG 110 | ``` 111 | 112 | ## Формат настроек логирования 113 | 114 | Каждая настройка задается в виде пары ```ключ=значение```. Причем, ключ является составным. Компоненты ключа разделены точками. 115 | Первым компонентом ключа идет *класс настройки*. Предусмотрены 2 класса - *logger* и *appender*. Первый отвечает за настройку конкретного журнала. Второй - за настройку способов вывода, используемых журналами. 116 | 117 | ### Настройка журнала (класс logger) 118 | 119 | logger.имя_журнала=Уровень[,СпособыВывода] 120 | 121 | * имя_журнала - это имя лога, как он описан в вызове метода ```Логирование.ПолучитьЛог();```, например, **oscript.lib.v8runner**. 122 | * СпособыВывода - это список произвольных имен способов вывода, которые привязаны к журналу. Конкретная настройка каждого из заявленных способов вывода выполняется в классе настроек *appender*. 123 | 124 | Например, журнал **oscript.lib.v8runner** может быть настроен следующим образом: 125 | 126 | logger.oscript.lib.v8runner=DEBUG, v8rdebug, console 127 | 128 | ### Корневой журнал (логгер) 129 | 130 | В классе настроек logger возможно указать специализированное имя ``rootLogger``. Настройки корневого логгера влияют на все прочие журналы. Это удобно, если вы хотите просто включить отладку по всем журналам или все журналы направить в файл. 131 | 132 | Например: 133 | 134 | logger.rootLogger=DEBUG 135 | 136 | ### Настройка способа вывода (класс appender) 137 | 138 | logger.oscript.lib.v8runner=DEBUG, v8rdebug, console 139 | appender.v8rdebug=ВыводЛогаВФайл 140 | appender.v8rdebug.file=/var/log/v8runner-debug.log 141 | 142 | appender.console=ВыводЛогаВКонсоль 143 | 144 | В приведенном примере для лога oscript.lib.v8runner установлен уровень Отладка и заявлено 2 способа вывода. Они названы v8rdebug и console (названия произвольные). 145 | 146 | Далее, в конфигурации указаны настройки заявленных способов вывода (аппендеров). Обязательным параметром является класс (тип языка), реализующий способ вывода. В данном примере указаны типы **ВыводЛогаВФайл** и **ВыводЛогаВКонсоль**. 147 | 148 | // формат указания класса реализации 149 | appender.имя_способа_вывода=Класс 150 | 151 | Для каждого класса могут потребоваться какие-то свои параметры. Например, класс ВыводЛогаВФайл требует задания свойства file. Свойства способа вывода задаются через точку от имени способа вывода: 152 | 153 | // формат указания свойства 154 | appender.имя_способа_вывода.свойство=значение 155 | 156 | # Примеры 157 | 158 | ## Настройка лога в шаге фичи 159 | ```bsl 160 | &НаСервере 161 | Процедура ПроверитьАвторизацию_Сервер(Путь, Логин, Пароль) Экспорт 162 | 163 | НастройкиЛогирования = Обработки.НастройкиЛогированияЛог.Создать(); 164 | НастройкиЛогирования.ЗаписатьВКонфигурацию("Модуль1САПИ", НастройкиЛогирования.УровниЛога.Отладка); 165 | 166 | //Обычный вызов боевого кода, у которого где-то внутри используется Лог.Отладка, Информация и прочее - см.ниже 167 | 168 | КонецПроцедуры 169 | ``` 170 | 171 | или дополнительный вывод сообщений в ЖР 172 | ```bsl 173 | Процедура ВключитьОтладкуЛогаХранилища() 174 | 175 | ПараметрыВыводаВЛог = СтрШаблон("DEBUG, v8reg, console 176 | |appender.v8reg=ВыводЛогаВЖР 177 | |appender.v8reg.ИмяСобытия=%1 178 | |appender.v8reg.Уровень=Предупреждение 179 | | 180 | |appender.console=ВыводЛогаВКонсоль", "Событие1.Подвид1"); 181 | 182 | НастройкиЛогирования = Обработки.НастройкиЛогированияЛог.Создать(); 183 | НастройкиЛогирования.ЗаписатьВКонфигурацию("Модуль1САПИ", НастройкиЛогирования.УровниЛога.Отладка, ПараметрыВыводаВЛог); 184 | 185 | КонецПроцедуры 186 | ``` 187 | 188 | ## Создание лога в боевом коде 189 | ```bsl 190 | МенеджерЛогирования = Обработки.МенеджерЛогированияЛог.Создать(); 191 | Лог = МенеджерЛогирования.ПолучитьЛог("Модуль1САПИ"); 192 | ``` 193 | 194 | ## Обычный вызов внутри боевого кода 195 | 196 | ```bsl 197 | Лог.Информация("Создаю пользователя ЛогинАвторизации <%1>", ЛогинАдминистратора); 198 | Лог.Отладка("СоздатьПользователя - ЛогинАвторизации <%1>", ЛогинАдминистратора); 199 | ``` 200 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | --------------------------------------------------------------------------------