Часто бывает, необходимо отслеживать состояние часто повторяющихся регламентных заданий. Например, синхронизация данных с IP-телефонией, которая может производиться каждую минуту, синхронизация с сайтами, синхронизация данных с различными системами.
Использовать для этих целей логирование “1С:Підприємство” чрезвычайно не эффективно и не удобно.
В таких случаях удобно использовать подход применяемый в Unix-системах: писать логи в обычные текстовые файлы, а потом делать их обработку через эффективно работающие Unix-команды: grep, tail, cat, less и т.п.
Итак, рассмотрим программную реализацию в “1С:Підприємство”:
Название модуля – К2_Лог
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 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 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 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 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 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 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 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 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 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 |
/////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Данная библиотека определяет базовую работу с текстовыми логами // данные функции рекомендуется использовать во всех конфигурациях. // Так же, как следствие, того, что библиотека используется везде - присутствует функция определения операционной системы /////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////// // Общесистемные процедуры и функции ///////////////////////////////////////////// // Определяем платформу операционной системы Функция ОпределитьПлатформу ()Экспорт СисИнф = Новый СистемнаяИнформация; Если СисИнф.ТипПлатформы = ТипПлатформы.Windows_x86 Или СисИнф.ТипПлатформы = ТипПлатформы.Windows_x86_64 Тогда Значение = "Wind"; // Лучше выдавала бы Win - так логичнее ИначеЕсли СисИнф.ТипПлатформы = ТипПлатформы.Linux_x86 Или СисИнф.ТипПлатформы = ТипПлатформы.Linux_x86_64 Тогда Значение = "Lin"; ИначеЕсли СисИнф.ТипПлатформы = ТипПлатформы.MacOS_x86 Или СисИнф.ТипПлатформы = ТипПлатформы.MacOS_x86_64 Тогда Значение = "Mac"; Иначе Значение = Неопределено; КонецЕсли; Возврат Значение; КонецФункции // Функция возвращает является ли данная система Windows или нет Функция IsWin() Экспорт Возврат ОпределитьПлатформу()="Wind"; КонецФункции Функция РазностьВремени(Время1, Время2); Возврат (Время2 - Время1); КонецФункции //////////////////////////////////////////// // Функции логирования //////////////////////////////////////////// // Сохраняет информацию в лог Процедура Лог(ИмяФайла, ЛогСтрока, ДатаВремя, ЭтоНачало=Истина) Экспорт // Определение даты и времени Сейчас=ДатаВремя; Разница=0; Если ЭтоНачало Тогда ДатаВремя=ТекущаяДата(); Сейчас=ДатаВремя; Иначе ДатаВремя2=ТекущаяДата(); Разница=РазностьВремени(ДатаВремя,ДатаВремя2); Сейчас=ДатаВремя2; КонецЕсли; // Если полный путь не указан, то пишем в c:\log Если Найти(ИмяФайла, "\") = 0 тогда ИмяФайла = "C:\Log\"+ ИмяФайла; КонецЕсли; // Если не указано расширение - указываем Если Найти(ИмяФайла, ".") = 0 тогда ИмяФайла = ИмяФайла+".txt"; КонецЕсли; // Форматирую разницу в секнды, минуты, часы Если Разница<60 Тогда Разница = Строка(Разница)+" сек"; ИначеЕсли Разница<3600 Тогда Разница = Строка(Окр(Разница/60,2))+" мин"; Иначе Разница = Строка(Окр(Разница/3600,2))+" часов"; КонецЕсли; ЛогСтрока=""+Сейчас+"|"+ПараметрыСеанса.ТекущийПользователь+"|"+ЛогСтрока+"|"+Разница; Попытка Если IsWin() Тогда fso=Новый COMОбъект("Scripting.FileSystemObject"); Если Не fso.FileExists(ИмяФайла) Тогда file=fso.CreateTextFile(ИмяФайла, -1, 0); //создать файл, перезаписывая существующий. file.WriteLine(ЛогСтрока); file.Close(); Иначе file=fso.OpenTextFile(ИмяФайла, 8, 0); //дополнить файл file.WriteLine(ЛогСтрока); file.Close(); КонецЕсли; Иначе ЗапуститьПриложение("echo "+ЛогСтрока+">>"+ИмяФайла); КонецЕсли; Исключение Попытка ЗапуститьПриложение("echo _LogErr>>C:\Log\_err.txt"); Исключение КонецПопытки; КонецПопытки; КонецПроцедуры // Формирует лог сообщений Процедура ЛогСообщений(Модуль, ЛогСтрока, ДатаВремя, ЭтоНачало=Истина) Экспорт Лог(Модуль, ЛогСтрока, ДатаВремя,ЭтоНачало); //Лог("_Сообщения", Модуль+" - "+ЛогСтрока, ДатаВремя,ЭтоНачало); КонецПроцедуры // Формирует лог обработок Процедура ЛогОбработок(НазваниеОбработки, ЛогСтрока, ДатаВремя, ЭтоНачало=Истина) Экспорт Лог("Обр_"+НазваниеОбработки, ЛогСтрока, ДатаВремя, ЭтоНачало); //Лог("_Обработки", НазваниеОбработки+" - "+ЛогСтрока, ДатаВремя, ЭтоНачало); КонецПроцедуры // Формирует лог обмена Процедура ЛогОбмен(НазваниеОбработки, ЛогСтрока, ДатаВремя, ЭтоНачало=Истина) Экспорт Лог("Обмен_"+НазваниеОбработки, ЛогСтрока, ДатаВремя, ЭтоНачало); //Лог("_Обмен", НазваниеОбработки+" - "+ЛогСтрока, ДатаВремя, ЭтоНачало); КонецПроцедуры // Формирует лог регламентных заданий Процедура ЛогРегламентныхЗаданий(НазваниеРегламентногоЗадания,ЛогСтрока, ДатаВремя, ЭтоНачало=Истина) Лог("РЗ_"+НазваниеРегламентногоЗадания,ЛогСтрока, ДатаВремя, ЭтоНачало); //Лог("_РегламентныеЗадания",НазваниеРегламентногоЗадания+" - "+ЛогСтрока, ДатаВремя, ЭтоНачало); КонецПроцедуры // Выдает сообщение на экран и записывает в файл Процедура Сообщ(Модуль, ТестСообщения) Экспорт ДатаВремя=ТекущаяДата(); ЛогСообщений(Модуль, ТестСообщения, ДатаВремя); //Сообщить(ТестСообщения); КонецПроцедуры // Начало произвольного сообщения со счетчиком Процедура СообщНач(Модуль, ТестСообщения, ДатаВремя) Экспорт ЛогСообщений(Модуль, ТестСообщения, ДатаВремя, Истина); //Сообщить(ТестСообщения); КонецПроцедуры // Конец произвольного сообщения со счетчиком Процедура СообщКон(Модуль, ТестСообщения, ДатаВремя) Экспорт ЛогСообщений(Модуль, ТестСообщения, ДатаВремя, Ложь); //Сообщить(ТестСообщения); КонецПроцедуры // Фиксация начала выполнения обработки Процедура ЛогОбрНач(НазваниеОбработки, ЛогСтрока, ДатаВремя) Экспорт ЛогОбработок(НазваниеОбработки, ЛогСтрока+" Нач", ДатаВремя, Истина); КонецПроцедуры // Фиксация конца выполнения обработки Процедура ЛогОбрКон(НазваниеОбработки, ЛогСтрока, ДатаВремя) Экспорт ЛогОбработок(НазваниеОбработки, ЛогСтрока+" Кон", ДатаВремя, Ложь); КонецПроцедуры // Фиксация сообщения в обработке (без вывода сообщения на экран) Процедура ЛогОбрСообщ(НазваниеОбработки, ЛогСтрока, ДатаВремя) Экспорт ЛогОбработок(НазваниеОбработки, ЛогСтрока, ДатаВремя, Ложь); КонецПроцедуры // Фиксация начала регламентной задачи Процедура ЛогРЗНач(НазваниеРегламентногоЗадания,ЛогСтрока, ДатаВремя) Экспорт ЛогРегламентныхЗаданий(НазваниеРегламентногоЗадания,ЛогСтрока+" Нач", ДатаВремя, Истина); КонецПроцедуры // Фиксация окончания регламентной задачи Процедура ЛогРЗКон(НазваниеРегламентногоЗадания,ЛогСтрока, ДатаВремя) Экспорт ЛогРегламентныхЗаданий(НазваниеРегламентногоЗадания,ЛогСтрока+" Кон", ДатаВремя, Ложь); КонецПроцедуры // Фиксация сообщений в регламентных заданиях Процедура ЛогРЗСообщ(НазваниеРегламентногоЗадания,ЛогСтрока, ДатаВремя) Экспорт ЛогРегламентныхЗаданий(НазваниеРегламентногоЗадания,ЛогСтрока, ДатаВремя, Ложь); КонецПроцедуры // Фиксация начала регламентной задачи Процедура ЛогОбменНач(НазваниеОбмена,ЛогСтрока, ДатаВремя) Экспорт ЛогОбмен(НазваниеОбмена,ЛогСтрока+" Нач", ДатаВремя, Истина); КонецПроцедуры // Фиксация окончания регламентной задачи Процедура ЛогОбменКон(НазваниеОбмена,ЛогСтрока, ДатаВремя) Экспорт ЛогОбмен(НазваниеОбмена,ЛогСтрока+" Кон", ДатаВремя, Ложь); КонецПроцедуры // Фиксация сообщений в регламентных заданиях Процедура ЛогОбменСообщ(НазваниеОбмена,ЛогСтрока, ДатаВремя) Экспорт ЛогОбмен(НазваниеОбмена,ЛогСтрока, ДатаВремя, Ложь); КонецПроцедуры // Сохраняет сообщение в лог Процедура СообщЛог(Модуль, ТестСообщения) Экспорт ДатаВремя=ТекущаяДата(); Лог(Модуль, ТестСообщения, ДатаВремя); КонецПроцедуры // Процедура фиксации ошибок в логе ошибок Процедура Ошибка(ТестСообщения) Экспорт ДатаВремя=ТекущаяДата(); Лог("_err", ТестСообщения, ДатаВремя, Ложь); КонецПроцедуры // Процедура фиксации ошибок с указанием текущей даты Процедура ОшибкаД(ТестСообщения, ДатаВремя) Экспорт Лог("_err", ТестСообщения, ДатаВремя, Ложь); КонецПроцедуры Процедура ОшибкаС(ТестСообщения) Экспорт ДатаВремя=ТекущаяДата(); Лог("_err", ТестСообщения, ДатаВремя, Ложь); Сообщить(ТестСообщения); КонецПроцедуры // Фиксирует ошибку в логе и выдает сообщение о ошибке. // Так же, вызывает исключение о ошибке. Процедура ОшибкаСообщить(ТестСообщения, Отказ = Ложь) Экспорт ДатаВремя=ТекущаяДата(); Лог("_err", ТестСообщения, ДатаВремя, Ложь); ОбщегоНазначения.СообщитьОбОшибке(ТестСообщения, Отказ); //Сообщить(ТестСообщения); КонецПроцедуры Процедура ПодклЛог(ТестСообщения) Экспорт ДатаВремя=ТекущаяДата(); Лог("_conn", ТестСообщения, ДатаВремя, Ложь); КонецПроцедуры Процедура Отладка(Модуль,ТестСообщения) Экспорт ДатаВремя=ТекущаяДата(); Лог(Модуль, ТестСообщения, ДатаВремя, Ложь); КонецПроцедуры Процедура ОтладкаС(Модуль,ТестСообщения) Экспорт ДатаВремя=ТекущаяДата(); Лог(Модуль, ТестСообщения, ДатаВремя, Ложь); Сообщить(ТестСообщения); КонецПроцедуры // Формирует лог веб-процессов Процедура ЛогWeb(НазваниеWeb,ЛогСтрока, ДатаВремя, ЭтоНачало=Истина) Лог("Web_"+НазваниеWeb,ЛогСтрока, ДатаВремя, ЭтоНачало); //Лог("_РегламентныеЗадания",НазваниеРегламентногоЗадания+" - "+ЛогСтрока, ДатаВремя, ЭтоНачало); КонецПроцедуры // Фиксация начала веб-процесса Процедура ЛогWebНач(НазваниеWeb,ЛогСтрока, ДатаВремя) Экспорт ЛогWeb(НазваниеWeb,ЛогСтрока+" Нач", ДатаВремя, Истина); КонецПроцедуры // Фиксация окончания веб-процесса Процедура ЛогWebКон(НазваниеWeb,ЛогСтрока, ДатаВремя) Экспорт ЛогWeb(НазваниеWeb,ЛогСтрока+" Кон", ДатаВремя, Ложь); КонецПроцедуры |
Примеры применения команды:
Фиксация времени выполнения регламентных задач:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Процедура ЗагрузкаКаталогаОмеги() Экспорт Перем ТаблицаРС; // Rudjuk 08.09.2015 Перем ДатаВремя; К2_Лог.ЛогРЗНач("ЗагрузкаКаталогаОмеги","ЗагрузкаКаталогаОмеги", ДатаВремя); ...... // Rudjuk 08.09.2015 К2_Лог.ЛогРЗКон("ЗагрузкаКаталогаОмеги","ЗагрузкаКаталогаОмеги", ДатаВремя); КонецПроцедуры |
В данном примере мы фиксируем время выполнения регламентного задания и записываем данное время в лог. Причем, записываем и начало регламентного задания и окончания. Таким образом, если регламентное задание не завершилось – мы видим, что 2-я строка не записалась.
Фиксация ошибок
В регламентном задании, сообщения не выдаются на экран. Но, их можно писать в лог. Таким образом, если возникают ошибки, имеет смысл их фиксировать в логе.
1 2 3 4 5 |
Попытка Перемещение.Записать(); //РежимЗаписиДокумента.Проведение Исключение К2_Лог.Ошибка("АвтоматическоеФормированиеПеремещенийПоСвозуНеликвидов.Перемещение.Записать()." + ОписаниеОшибки()); КонецПопытки; |
Анализ логов с помощью команд Linux
Операционная система Windows поддерживает очень ограниченный набор команд по работе с тектовыми файлами. Однако, в Linux есть ряд команд, которые позволяют обработать много гигабайтные файлы за считанные секунды.
Мы можем сделать поддержку данных команд. Они, конечно, не гораздо менее эффективно работают, чем в Linux, но позволяют сделать обработку текстовых файлов легким занятием.
Для того, чтоб команды Linux поддерживались в Windows, необходимо сделать ряд вещей:
Необходимо распаковать в системный каталог, доступный в путях пакет UnxUpdates: http://unxutils.sourceforge.net/
После этого в командной строке, будут восприниматься команды Linux.
Вывод на экран последних поступающих строк в логе:
1 |
tail -f НазваниеЛога |
Данная команда полезна для мониторинга поступающих строк в лог-файл.
Поиск нужной строки в логе:
1 |
cat НазваниеЛога | grep ЧтоИщем |
Команда cat – выводит на экран текстовый файл. Команда grep – фильтрует вывод по заданному условию. Таким образом, соединение 2-х данных команд позваляет отфильтровать данные в текстовом файле по заданному выражению.
Вывод на экран строк по заданному слову
1 |
tail -f НазваниеЛогФайла | grep ЧтоИщем |
Данная команда выводит поступающие строки, в которых заданы указанные слова.
Автор: Рудюк С . А. https://corp2.net
Leave a Reply