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(); }