Example #1
0
        private bool ThisNewLineLog(string line)
        {
            // у новой строки фиксированный формат
            //1) Дата и время в формате "yyyyMMddHHmmss", легко превращается в дату функцией Дата();
            //2) Статус транзакции – может принимать четыре значения "N" – "Отсутствует", "U" – "Зафиксирована", "R" – "Не завершена" и "C" – "Отменена";
            // {20190812000001,C,
            // {20190812114310,N,

            //// регулярки любят проц кушать, упрощаем
            //string patternNewLine = "^\\{[0-9]{14},";

            //Regex regex = new Regex(patternNewLine);
            //MatchCollection matches = regex.Matches(line);

            //return matches.Count > 0;

            if (line.Length != 18)
            {
                return(false);
            }

            string statusTransaction = LineLog.GetStatusTransaction(line.Substring(16, 1));

            if (statusTransaction.Length != 0)
            {
                return(true);
            }
            else
            {
                return(false);
            }
        }
Example #2
0
        private IndexOutputLog GetRecord(DictLog dictLog, string nameBase, string lineLog)
        {
            LineLog logData = new LineLog();

            logData.ParseLine(lineLog, dictLog);
            logData.indexOutputLog.Base = nameBase;

            return(logData.indexOutputLog);
        }
Example #3
0
        public string[] ParseStringToArrayObject(string line)
        {
            string[] result;

            LineLog logData = new LineLog();

            result = logData.ParseStringToArrayObject(line);

            return(result);
        }
Example #4
0
        public void ParseLine(string line, DictLog dictLog)
        {
            //1) Дата и время в формате "yyyyMMddHHmmss", легко превращается в дату функцией Дата();
            //2) Статус транзакции – может принимать четыре значения "N" – "Отсутствует", "U" – "Зафиксирована", "R" – "Не завершена" и "C" – "Отменена";
            //3) Транзакция в формате записи из двух элементов преобразованных в шестнадцатеричное число
            //  –   первый – число секунд с 01.01.0001 00:00:00 умноженное на 10000,
            //      второй – номер транзакции;
            //4) Пользователь – указывается номер в массиве пользователей;
            //5) Компьютер – указывается номер в массиве компьютеров;
            //6) Приложение – указывается номер в массиве приложений;
            //7) Соединение – номер соединения;
            //8) Событие – указывается номер в массиве событий;
            //9) Важность – может принимать четыре значения – "I" – "Информация", "E" – "Ошибки", "W" – "Предупреждения" и "N" – "Примечания";
            //10) Комментарий – любой текст в кавычках;
            //11) Метаданные – указывается номер в массиве метаданных;
            //12) Данные – самый хитрый элемент, содержащий вложенную запись;
            //13) Представление данных – текст в кавычках;
            //14) Сервер – указывается номер в массиве серверов;
            //15) Основной порт – указывается номер в массиве основных портов;
            //16) Вспомогательный порт – указывается номер в массиве вспомогательных портов;
            //17) Сеанс – номер сеанса;
            //18) Количество дополнительных метаданных, номера которых будут перечислены в следующих элементах записи.
            //    Именно 18 - й элемент определяет длину записи, т.к.дальше будут следовать столько элементов сколько указано здесь +один последний,
            //    назначение которого пока не определено и обычно там "{0}".Возможно это просто маркер окончания записи.Так же есть идея что {0}
            //    похоже на пустой массив.

            // {20190729165108,N,{0,0},1,1,2,433,3,I,"",0,{"P",{6,{"S","jenkins"},{"S","ROSSKO\pavel.makarov"}}},"",1,1,0,1,0,{0}},
            // {20190729165201,C,{2435928362a10,74c},1,1,2,433,5,I,\"\",0,{\"U\"},\"\",1,1,0,1,0,{0}},
            // { 20190729165201,U,{ 2435928362a10,74c},1,1,2,433,6,I,"",45,{ "R",21:94e038d547ded5ea11e9af4b2d5a712d},"тест",1,1,0,1,0,{ 0} },
            // {20190731120047,U,{2435984cb07f0,1dde2b},1,1,2,40,6,I,"",41,{"R",107:a49762e541d0f9ee11e2a921473faba2},"WMS_1NSK",1,1,0,1,0,{0}},
            // {20190726083202,U,{243587bd5e620,154a},1,1,2,252,10,I,"",6,{"R",17:b3c300505699197f11e631d8d789bc5c},"Клементьев А.А. (Станционная, 16/1)",1,1,0,2,0,{0}},
            // {20190812000019,N,{ 0,0},4,1,5,336800,10,I,"",247,{ "S","Отправка количества сканированийноменклатуры в сололайн"},"",1,1,0,1,0,{ 0}},
            // {20190812114310,N,{ 0,0},2,1,4,10357,38,E,"{ОбщийМодуль.СобытийнаяМодельФронтПривилигерованный.Модуль(1670)}: При загрузке Маршрутный лист ОТГАГ012099 от 06.08.2019 0:00:00 не найден документ Заявка на возврат товаров от покупателя ОТГАГ046985 от 05.08.2019 17:29:03		ВызватьИсключение СообщениеОбОшибке;",
            //  0,{ "S","{""TypeDocument"": ""МаршрутныйЛист"",""Presentation"": ""Маршрутный лист ОТГАГ012099 от 06.08.2019 0:00:00"",""GUIDWithType"": ""{\""#\"",ba77c4fb-bed9-42ce-be5c-5e5a70a68369,228:ae5800505699b66311e9b7ae029cee1b}"",""GUID"": ""029cee1b-b7ae-11e9-ae58-00505699b663"",""DeletionMark"": false,""Unload"": true,""Comment"": ""tms 06.08.2019 1:22:50"",""Number"": ""ОТГАГ012099"",""DateTime"": ""2019-08-06T00:00:00"",""NumberKIS"": ""ОТГАГ012099"",""DateTimeKIS"": ""2019-08-06T00:00:00"",""Manager"": """",""WarehouseName"": ""Мск_Основной"",""WarehouseCode"": ""ОТ0000014"",""Driver"": ""Луньков Алексей Михайлович"",""TransportVehicle"": ""HYNDAI HD 72"",""Left"": true,""Delivered"": true,""RouteNumber"": ""03"",""RoutePoints"": [{""GUIDDocument"": ""{\""#\"",eddd79d8-809c-497f-9c4a-5943afddda98,195:ae5800505699b66311e9b4fc2cc5830d}"",""Presentation"": ""Реализация товаров и услуг ОТГАГ193609 от 02.08.2019 15:04:39"",""Status"": ""Доставлен"",""TypeDocument"": ""РеализацияТоваровУслуг"",""WarehouseName"": ""Мск_Основной"",""WarehouseCode"": ""ОТ0000014""},{""GUIDDocument"": ""{\""#\"",eddd79d8-809c-497f-9c4a-5943afddda98,195:ae5800505699b66311e9b74765f37017}"",""Presentation"": ""Реализация товаров и услуг ОТГАГ195398 от 05.08.2019 13:08:15"",""Status"": ""Доставлен"",""TypeDocument"": ""РеализацияТоваровУслуг"",""WarehouseName"": ""Мск_Основной"",""WarehouseCode"": ""ОТ0000014""}],""headers"": {""message_id"": ""7c3d54c5-bb3a-465e-8329-ce1f7b0a0c34"",""owner_id"": ""5ade20ac-b9e8-42dc-9003-4122957339e8"",""timestamp"": 1565610184883,""event_owner"": """"}}"},
            //  "",1,3,0,3376,0,{0}},
            // {20191025103710,N,{0,0},369,6,1,499504,2,E,"Имя отчета: ""АнализПродаж""Установленные параметры:РазрешитьВсеФилиалы, значение: НетФилиалПоУмолчанию, значение: МассивПериод, значение: 25.10.2019 - 25.10.2019Установленные отборы:Ответственный, вид сравнения: Равно, значение: Семенов_Константин",0,{"U"},"",1,9,0,3925781,0,{0}},

            string[] arrLine    = ParseStringToArrayObject(line);
            string[] data       = ParseStringToArrayObject(arrLine[11]);
            string   dataObject = "";

            // если символов 32 то это гуид объекта
            // иначае имя фонового задания
            if (data.Length > 1 && data[1] != null)
            {
                string          patternUUID = "^[a-fA-F0-9]*:[a-fA-F0-9]{32}$";
                Regex           regex       = new Regex(patternUUID);
                MatchCollection matches     = regex.Matches(data[1]);
                if (matches.Count != 0)
                {
                    dataObject = GetGUIDByUUID(data[1]);
                }
                else
                {
                    dataObject = data[1];
                }
            }

            this.indexOutputLog                  = new IndexOutputLog();
            this.indexOutputLog.Timestamp        = ConvertStringToDateTime(arrLine[0]);
            this.indexOutputLog.Transaction      = GetStatusTransaction(arrLine[1]);
            this.indexOutputLog.User             = DictLog.GetValueFromDictionaryLog(dictLog, arrLine[3], "user");
            this.indexOutputLog.Computer         = DictLog.GetValueFromDictionaryLog(dictLog, arrLine[4], "computer");
            this.indexOutputLog.Application      = DictLog.GetValueFromDictionaryLog(dictLog, arrLine[5], "application");
            this.indexOutputLog.NumberConnection = int.Parse(arrLine[6].Length == 0 ? "0" : arrLine[6]);
            this.indexOutputLog.Event            = LineLog.GetNameEvent(DictLog.GetValueFromDictionaryLog(dictLog, arrLine[7], "event"));
            this.indexOutputLog.Level            = LineLog.GetLevel(arrLine[8]);
            this.indexOutputLog.Comment          = arrLine[9].Trim('\"');
            this.indexOutputLog.Metadata         = DictLog.GetValueFromDictionaryLog(dictLog, arrLine[10], "metadata");
            this.indexOutputLog.Presentation     = arrLine[12].Trim('\"');
            this.indexOutputLog.Server           = DictLog.GetValueFromDictionaryLog(dictLog, arrLine[13], "server");
            string strMainPort = DictLog.GetValueFromDictionaryLog(dictLog, arrLine[14], "mainPort");

            this.indexOutputLog.MainPort = int.Parse(strMainPort.Length == 0 ? "0" : strMainPort);
            string strAdditionalPort = DictLog.GetValueFromDictionaryLog(dictLog, arrLine[16], "additionalPort");

            this.indexOutputLog.AdditionalPort = int.Parse(strAdditionalPort.Length == 0 ? "0" : strAdditionalPort);
            this.indexOutputLog.NumberSession  = int.Parse(arrLine[17].Length == 0 ? "0" : arrLine[17]);
            this.indexOutputLog.Data           = dataObject;

            string[] dataTransaction = ParseStringToArrayObject(arrLine[2]);
            // дату транзакции пока опускаем
            //DateTime timestampTransaction = LineLog.getDateFromTimestamp1C(dataTransaction[0]);
            //if (timestampTransaction != new DateTime(1, 1, 1))
            //    this.indexOutputLog.Timestamp = timestampTransaction;
            this.indexOutputLog.NumberTransaction = Convert.ToInt64(dataTransaction[1], 16);
        }
Example #5
0
        public void FromFileToElastic()
        {
            // прочитаем настройки
            settingsFile = new Settings();
            settingsFile.Read();

            if (!Directory.Exists(settingsFile.PathJournal))
            {
                throw new Exception("Не найден каталог " + settingsFile.PathJournal);
            }

            SettingsReadBase settingsReadBase = new SettingsReadBase();

            settingsReadBase.Read();

            // прочитаем каталог баз
            Dictionary <string, string> arrayBase = DictLog.GetCatalogBase(settingsFile);

            nameIndex          = settingsFile.NameIndexElastic + "-" + DateTime.Now.ToString("yyyyMMdd");
            connectionSettings = new ConnectionSettings(new Uri("http://" + settingsFile.AdressElastic + ":" + settingsFile.PortElastic.ToString()));
            connectionSettings.DefaultIndex(nameIndex);
            // при указании идентификации используем ее
            if (settingsFile.ElasticUserName != null)
            {
                connectionSettings.BasicAuthentication(settingsFile.ElasticUserName, settingsFile.ElasticUserPassword);
            }

            elasticClient = new ElasticClient(connectionSettings);
            // добавить настройки кластера для создаваемых по умолчанию индексов
            // 0 реплик
            //elasticClient.Cluster.PutSettings();

            // обойдем подкаталоги и прочитаем логи
            DirectoryInfo di = new DirectoryInfo(settingsFile.PathJournal);

            foreach (DirectoryInfo subDir in di.GetDirectories())
            {
                // получим имя базы
                if (!arrayBase.ContainsKey(subDir.Name))
                {
                    continue;
                }

                string nameBase = arrayBase[subDir.Name];

                // обойдем файлы
                foreach (DirectoryInfo subDirLog in subDir.GetDirectories())
                {
                    // для первого запуска берем общую дату
                    DateTime LastBoundaryPeriod = LineLog.ConvertStringToDateTime(settingsReadBase.LastRunTime);

                    // получим последнее время чтения
                    if (settingsReadBase.LastTimeReadLogBase.ContainsKey(subDir.Name))
                    {
                        LastBoundaryPeriod = LineLog.ConvertStringToDateTime(settingsReadBase.LastTimeReadLogBase[subDir.Name]);
                    }
                    else
                    {
                        settingsReadBase.LastTimeReadLogBase.Add(subDir.Name, LastBoundaryPeriod.ToString("yyyyMMddHHmmss"));
                    }

                    // получим словарь для разбора логов ЖР
                    DictLog dictLog = DictLog.ParseDictionaryLog(subDirLog);

                    // разберем лог ЖР
                    foreach (FileInfo file in subDirLog.GetFiles("*.lgp"))
                    {
                        // обработаем файл
                        // разрешаем запись другим потокам
                        using (var fstream = new FileStream(file.FullName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
                            using (StreamReader sreader = new StreamReader(fstream))
                            {
                                // ранее обработанные файлы пропускаем
                                // поскольку данные хранятся до секунды округляем время на начало секунды
                                // чтобы не было постоянного повторного считывания
                                DateTime LastWriteTime = file.LastWriteTime.AddMilliseconds(-file.LastWriteTime.Millisecond);
                                if (LastWriteTime < LastBoundaryPeriod)
                                {
                                    continue;
                                }
                                try
                                {
                                    LastBoundaryPeriod = LogRecordProcessing(dictLog, sreader, nameBase, LastBoundaryPeriod);
                                }
                                catch (Exception e)
                                {
                                    string error = e.Message;
                                    Log.AddRecord("LogRecordProcessing", error);
                                }
                            }
                    }

                    // некорректное сохранение часов, доделать
                    settingsReadBase.LastTimeReadLogBase[subDir.Name] = LastBoundaryPeriod.ToString("yyyyMMddHHmmss");
                }
            }

            // запишем настройки
            settingsFile.Write();
            settingsReadBase.Write();
        }
Example #6
0
        public static DictLog ParseDictionaryLog(DirectoryInfo subDirLog)
        {
            DictLog dictLog = new DictLog();

            // 6d184c14-f352-49bd-9baa-740acf9eca79
            string patternGUID = "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$";
            Regex  regex       = new Regex(patternGUID);

            // разберем словарь ЖР
            foreach (FileInfo file in subDirLog.GetFiles("*.lgf"))
            {
                // разрешаем запись другим потокам
                using (var fstream = new FileStream(file.FullName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
                    using (StreamReader sreader_dict = new StreamReader(fstream))
                    {
                        // первые 2 строки служебные
                        // 1 тип лога 1CV8LOG(ver 2.0)
                        // 2 идентификатор базы 28319a74-e5ca-487b-bd0d-c9207a1dc5f0

                        string lineDictLog = "";

                        while (!sreader_dict.EndOfStream)
                        {
                            string line = sreader_dict.ReadLine();

                            // заголовки пропускаем
                            if (line.Contains("1CV8LOG(ver 2.0)") || (regex.Matches(line).Count != 0))
                            {
                                continue;
                            }

                            //TODO: есть похожий метод в LogRecordProcessing, подумать над их объединением
                            if (ThisNewLineDictLog(lineDictLog) && ThisEndLineDictLog(lineDictLog) && lineDictLog.Length != 0)
                            {
                                // собрали строку лога, разберем ее
                                try
                                {
                                    LineLog  lineLog = new LineLog();
                                    string[] arrLine = lineLog.ParseStringToArrayObject(lineDictLog);
                                    addRecordDictLog(arrLine, dictLog);
                                    // обработали прошлую строку, обновим чтоб текущая обработалась при следующей итерации
                                    lineDictLog = line;
                                }
                                catch (Exception e)
                                {
                                    string error = e.Message + " record log:" + line;
                                    Log.AddRecord("DicLogProcessing", error);
                                }
                            }
                            else
                            {
                                lineDictLog += line;
                            }
                        }

                        // обработаем хвост
                        if (lineDictLog.Length != 0)
                        {
                            try
                            {
                                LineLog  lineLog = new LineLog();
                                string[] arrLine = lineLog.ParseStringToArrayObject(lineDictLog);
                                addRecordDictLog(arrLine, dictLog);
                            }
                            catch (Exception e)
                            {
                                string error = e.Message + " record log:" + lineDictLog + "; Файл логов " + file.FullName;
                                Log.AddRecord("DicLogProcessing", error);
                            }
                        }
                    }
            }

            return(dictLog);
        }