Beispiel #1
0
        public void Read()
        {
            // лог пишем в директорию с которой запущен сервис
            string fullFilename = AppDomain.CurrentDomain.BaseDirectory + "\\OnecLogElasticReadBase.json";
            DataContractJsonSerializer jsonFormatter = new DataContractJsonSerializer(typeof(SettingsReadBase));

            using (FileStream fsread = new FileStream(fullFilename, FileMode.OpenOrCreate))
            {
                SettingsReadBase settingsFile = new SettingsReadBase();
                if (fsread.Length != 0)
                {
                    settingsFile = (SettingsReadBase)jsonFormatter.ReadObject(fsread);
                }

                this.LastRunTime         = settingsFile.LastRunTime;
                this.LastTimeReadLogBase = settingsFile.LastTimeReadLogBase;

                if (this.LastRunTime == null)
                {
                    this.LastRunTime = DateTime.Now.ToString("yyyyMMddHHmmss");
                }

                if (this.LastTimeReadLogBase == null)
                {
                    this.LastTimeReadLogBase = new Dictionary <string, string>();
                }
            }
        }
        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();
        }