├── .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 |
--------------------------------------------------------------------------------