Imports System.Data.SqlClient Imports System.Globalization Imports System.IO Imports MySql.Data.MySqlClient Imports Nest Imports Newtonsoft.Json Public Class EventLogProcessor #Region "Reference classes" Structure User Dim Code As Integer Dim Name As String Dim Guid As String End Structure Structure Metadata Dim Code As Integer Dim Name As String Dim Guid As String End Structure Structure Computer Dim Code As Integer Dim Name As String End Structure Structure Application Dim Code As Integer Dim Name As String End Structure Structure EventType Dim Code As Integer Dim Name As String End Structure Structure Server Dim Code As Integer Dim Name As String End Structure Structure MainPort Dim Code As Integer Dim Name As String End Structure Structure SecondPort Dim Code As Integer Dim Name As String End Structure Sub AddUser(Code As Integer, Guid As String, Name As String) Dim Usr = New User Usr.Code = Code Usr.Name = Name Usr.Guid = Guid DictUsers.Add(Code, Usr) End Sub Sub AddComputer(Code As Integer, Name As String) Dim Item = New Computer Item.Code = Code Item.Name = Name DictComputers.Add(Code, Item) End Sub Sub AddApplication(Code As Integer, Name As String) Dim Item = New Application Item.Code = Code Item.Name = Name DictApplications.Add(Code, Item) End Sub Sub AddEvent(Code As Integer, Name As String) Dim Item = New EventType Item.Code = Code Item.Name = Name DictEvents.Add(Code, Item) End Sub Sub AddMetadata(Code As Integer, Guid As String, Name As String) Dim MD = New Metadata MD.Code = Code MD.Name = Name MD.Guid = Guid DictMetadata.Add(Code, MD) End Sub Sub AddServer(Code As Integer, Name As String) Dim Item = New Server Item.Code = Code Item.Name = Name DictServers.Add(Code, Item) End Sub Sub AddMainPort(Code As Integer, Name As String) Dim Item = New MainPort Item.Code = Code If String.IsNullOrEmpty(Name) Then Item.Name = "" Else Item.Name = Name End If DictMainPorts.Add(Code, Item) End Sub Sub AddSecondPort(Code As Integer, Name As String) Dim Item = New SecondPort Item.Code = Code If String.IsNullOrEmpty(Name) Then Item.Name = "" Else Item.Name = Name End If DictSecondPorts.Add(Code, Item) End Sub #End Region Class ReadParameters Public InfobaseId As Integer Public CurrentPosition As Long Public CurrentFilename As String Public LastEventNumber83 As Long End Class Class OneEventRecord Public RowID As Long Public DateTime As Date Public ConnectID As Integer Public Severity As Integer Public TransactionStatus As String Public Transaction As String Public TransactionStartTime As Date Public TransactionMark As Int64 Public UserName As Integer Public ComputerName As Integer Public AppName As Integer Public Field2 As String Public EventID As Integer Public EventType As String Public Comment As String Public MetadataID As Integer Public SessionDataSplitCode As Integer Public DataStructure As String Public DataString As String Public DataType As Integer Public ServerID As Integer Public MainPortID As Integer Public SecondPortID As Integer Public SessionNumber As Integer Public Field7 As String Public Field8 As String End Class Class ESRecord Public RowID As Long Public ServerName As String Public DatabaseName As String Public DateTime As Date Public Severity As String Public EventType As EventType Public Computer As String Public Application As String Public Metadata As Metadata Public UserName As User Public SessionNumber As Integer Public ConnectID As Integer Public DataType As Integer Public DataStructure As String Public DataString As String Public Comment As String Public PrimaryPort As Integer Public SecondaryPort As Integer Public Server As String Public SessionDataSplitCode As Integer End Class Public EventsList As List(Of OneEventRecord) = New List(Of OneEventRecord) Public ESIndexName As String Public ESServerName As String Public InfobaseName As String Public InfobaseGuid As String Public InfobaseID As Integer = 0 Public ConnectionString As String = "" Public ItIsMSSQL As Boolean = False Public ItIsMySQL As Boolean = False Public ItIsES As Boolean = False Public SleepTime As Integer = 60 * 1000 '1 минута Public Log As NLog.Logger Public Catalog As String Dim CurrentPosition As Int64 = 0 Dim CurrentFilename As String = "" Dim LastEventNumber83 As Integer = 0 Dim DictUsers As Dictionary(Of Integer, User) = New Dictionary(Of Integer, User) Dim DictComputers As Dictionary(Of Integer, Computer) = New Dictionary(Of Integer, Computer) Dim DictApplications As Dictionary(Of Integer, Application) = New Dictionary(Of Integer, Application) Dim DictEvents As Dictionary(Of Integer, EventType) = New Dictionary(Of Integer, EventType) Dim DictMetadata As Dictionary(Of Integer, Metadata) = New Dictionary(Of Integer, Metadata) Dim DictServers As Dictionary(Of Integer, Server) = New Dictionary(Of Integer, Server) Dim DictMainPorts As Dictionary(Of Integer, MainPort) = New Dictionary(Of Integer, MainPort) Dim DictSecondPorts As Dictionary(Of Integer, SecondPort) = New Dictionary(Of Integer, SecondPort) Public LastReferenceUpdate As DateTime Public Sub SaveReferenceValuesToDatabase() If ItIsMSSQL Then Dim objConn As New SqlConnection(ConnectionString) objConn.Open() '--------------------------------------------------------------------------------------------------------- Dim command As New SqlCommand("IF NOT EXISTS (select * from [dbo].[Applications] where [Code] = @v1 AND [InfobaseCode] = @v3) " + "INSERT INTO [dbo].[Applications] ([InfobaseCode],[Code],[Name]) VALUES(@v3, @v1, @v2)", objConn) For Each Item In DictApplications Try command.Parameters.Clear() command.Parameters.Add(New SqlParameter("@v1", SqlDbType.Int)).Value = Item.Value.Code command.Parameters.Add(New SqlParameter("@v2", SqlDbType.Char)).Value = Item.Value.Name command.Parameters.Add(New SqlParameter("@v3", SqlDbType.Int)).Value = InfobaseID command.ExecuteNonQuery() Catch ex As Exception Console.WriteLine(ex.Message) End Try Next '--------------------------------------------------------------------------------------------------------- command.CommandText = "IF NOT EXISTS (select * from [dbo].[Computers] where [Code] = @v1 AND [InfobaseCode] = @v3) " + "INSERT INTO [dbo].[Computers] ([InfobaseCode],[Code],[Name]) VALUES(@v3, @v1,@v2)" For Each Item In DictComputers Try command.Parameters.Clear() command.Parameters.Add(New SqlParameter("@v1", SqlDbType.Int)).Value = Item.Value.Code command.Parameters.Add(New SqlParameter("@v2", SqlDbType.Char)).Value = Item.Value.Name command.Parameters.Add(New SqlParameter("@v3", SqlDbType.Int)).Value = InfobaseID command.ExecuteNonQuery() Catch ex As Exception Console.WriteLine(ex.Message) End Try Next '--------------------------------------------------------------------------------------------------------- command.CommandText = "IF NOT EXISTS (select * from [dbo].[EventsType] where [Code] = @v1 AND [InfobaseCode] = @v3) " + "INSERT INTO [dbo].[EventsType] ([InfobaseCode],[Code],[Name]) VALUES(@v3, @v1,@v2)" For Each Item In DictEvents Try command.Parameters.Clear() command.Parameters.Add(New SqlParameter("@v1", SqlDbType.Int)).Value = Item.Value.Code command.Parameters.Add(New SqlParameter("@v2", SqlDbType.Char)).Value = Item.Value.Name command.Parameters.Add(New SqlParameter("@v3", SqlDbType.Int)).Value = InfobaseID command.ExecuteNonQuery() Catch ex As Exception Console.WriteLine(ex.Message) End Try Next '--------------------------------------------------------------------------------------------------------- command.CommandText = "IF NOT EXISTS (select * from [dbo].[MainPorts] where [Code] = @v1 AND [InfobaseCode] = @v3) " + "INSERT INTO [dbo].[MainPorts] ([InfobaseCode],[Code],[Name]) VALUES(@v3, @v1,@v2)" For Each Item In DictMainPorts Try command.Parameters.Clear() command.Parameters.Add(New SqlParameter("@v1", SqlDbType.Int)).Value = Item.Value.Code command.Parameters.Add(New SqlParameter("@v2", SqlDbType.Char)).Value = Item.Value.Name command.Parameters.Add(New SqlParameter("@v3", SqlDbType.Int)).Value = InfobaseID command.ExecuteNonQuery() Catch ex As Exception Console.WriteLine(ex.Message) End Try Next '--------------------------------------------------------------------------------------------------------- command.CommandText = "IF NOT EXISTS (select * from [dbo].[Metadata] where [Code] = @v1 AND [InfobaseCode] = @v4) " + "INSERT INTO [dbo].[Metadata] ([InfobaseCode],[Code],[Name],[Guid]) VALUES(@v4, @v1,@v2,@v3)" For Each Item In DictMetadata Try command.Parameters.Clear() command.Parameters.Add(New SqlParameter("@v1", SqlDbType.Int)).Value = Item.Value.Code command.Parameters.Add(New SqlParameter("@v2", SqlDbType.Char)).Value = Item.Value.Name command.Parameters.Add(New SqlParameter("@v3", SqlDbType.Char)).Value = Item.Value.Guid command.Parameters.Add(New SqlParameter("@v4", SqlDbType.Int)).Value = InfobaseID command.ExecuteNonQuery() Catch ex As Exception Console.WriteLine(ex.Message) End Try Next '--------------------------------------------------------------------------------------------------------- command.CommandText = "IF NOT EXISTS (select * from [dbo].[Users] where [Code] = @v1 AND [InfobaseCode] = @v4) " + "INSERT INTO [dbo].[Users] ([InfobaseCode],[Code],[Name],[Guid]) VALUES(@v4, @v1,@v2,@v3)" For Each Item In DictUsers Try command.Parameters.Clear() command.Parameters.Add(New SqlParameter("@v1", SqlDbType.Int)).Value = Item.Value.Code command.Parameters.Add(New SqlParameter("@v2", SqlDbType.Char)).Value = Item.Value.Name command.Parameters.Add(New SqlParameter("@v3", SqlDbType.Char)).Value = Item.Value.Guid command.Parameters.Add(New SqlParameter("@v4", SqlDbType.Int)).Value = InfobaseID command.ExecuteNonQuery() Catch ex As Exception Console.WriteLine(ex.Message) End Try Next '--------------------------------------------------------------------------------------------------------- command.CommandText = "IF NOT EXISTS (select * from [dbo].[SecondPorts] where [Code] = @v1 AND [InfobaseCode] = @v3) " + "INSERT INTO [dbo].[SecondPorts] ([InfobaseCode],[Code],[Name]) VALUES(@v3, @v1,@v2)" For Each Item In DictSecondPorts Try command.Parameters.Clear() command.Parameters.Add(New SqlParameter("@v1", SqlDbType.Int)).Value = Item.Value.Code command.Parameters.Add(New SqlParameter("@v2", SqlDbType.Char)).Value = Item.Value.Name command.Parameters.Add(New SqlParameter("@v3", SqlDbType.Int)).Value = InfobaseID command.ExecuteNonQuery() Catch ex As Exception Console.WriteLine(ex.Message) End Try Next '--------------------------------------------------------------------------------------------------------- command.CommandText = "IF NOT EXISTS (select * from [dbo].[Servers] where [Code] = @v1 AND [InfobaseCode] = @v3) " + "INSERT INTO [dbo].[Servers] ([InfobaseCode],[Code],[Name]) VALUES(@v3, @v1,@v2)" For Each Item In DictServers Try command.Parameters.Clear() command.Parameters.Add(New SqlParameter("@v1", SqlDbType.Int)).Value = Item.Value.Code command.Parameters.Add(New SqlParameter("@v2", SqlDbType.Char)).Value = Item.Value.Name command.Parameters.Add(New SqlParameter("@v3", SqlDbType.Int)).Value = InfobaseID command.ExecuteNonQuery() Catch ex As Exception Console.WriteLine(ex.Message) End Try Next '--------------------------------------------------------------------------------------------------------- command.CommandText = "IF NOT EXISTS (select * from [dbo].[Infobases] where [Guid] = @v0) " + "INSERT INTO [dbo].[Infobases] ([Guid],[Code],[Name]) VALUES(@v0,@v1,@v2)" Try command.Parameters.Clear() command.Parameters.Add(New SqlParameter("@v0", SqlDbType.Char)).Value = InfobaseGuid command.Parameters.Add(New SqlParameter("@v1", SqlDbType.Int)).Value = InfobaseID command.Parameters.Add(New SqlParameter("@v2", SqlDbType.Char)).Value = InfobaseName command.ExecuteNonQuery() Catch ex As Exception Console.WriteLine(ex.Message) End Try command.Dispose() objConn.Close() objConn.Dispose() ElseIf ItIsMySQL Then Dim objConn = New MySql.Data.MySqlClient.MySqlConnection(ConnectionString) objConn.Open() Dim command As New MySqlCommand("REPLACE INTO `Applications`(`InfobaseCode`, `Code`, `Name`) VALUES(@v3, @v1, @v2)", objConn) For Each Item In DictApplications Try command.Parameters.Clear() command.Parameters.Add(New MySqlParameter("@v1", MySqlDbType.Int32)).Value = Item.Value.Code command.Parameters.Add(New MySqlParameter("@v2", MySqlDbType.VarChar)).Value = Item.Value.Name command.Parameters.Add(New MySqlParameter("@v3", MySqlDbType.Int32)).Value = InfobaseID command.ExecuteNonQuery() Catch ex As Exception Console.WriteLine(ex.Message) End Try Next '--------------------------------------------------------------------------------------------------------- command.CommandText = "REPLACE INTO `Computers` (`InfobaseCode`,`Code`,`Name`) VALUES(@v3, @v1, @v2)" For Each Item In DictComputers Try command.Parameters.Clear() command.Parameters.Add(New MySqlParameter("@v1", MySqlDbType.Int32)).Value = Item.Value.Code command.Parameters.Add(New MySqlParameter("@v2", MySqlDbType.VarChar)).Value = Item.Value.Name command.Parameters.Add(New MySqlParameter("@v3", MySqlDbType.Int32)).Value = InfobaseID command.ExecuteNonQuery() Catch ex As Exception Console.WriteLine(ex.Message) End Try Next '--------------------------------------------------------------------------------------------------------- command.CommandText = "REPLACE INTO `EventsType` (`InfobaseCode`,`Code`,`Name`) VALUES(@v3, @v1,@v2)" For Each Item In DictEvents Try command.Parameters.Clear() command.Parameters.Add(New MySqlParameter("@v1", MySqlDbType.Int32)).Value = Item.Value.Code command.Parameters.Add(New MySqlParameter("@v2", MySqlDbType.VarChar)).Value = Item.Value.Name command.Parameters.Add(New MySqlParameter("@v3", MySqlDbType.Int32)).Value = InfobaseID command.ExecuteNonQuery() Catch ex As Exception Console.WriteLine(ex.Message) End Try Next '--------------------------------------------------------------------------------------------------------- command.CommandText = "REPLACE INTO `MainPorts` (`InfobaseCode`,`Code`,`Name`) VALUES(@v3, @v1,@v2)" For Each Item In DictMainPorts Try command.Parameters.Clear() command.Parameters.Add(New MySqlParameter("@v1", MySqlDbType.Int32)).Value = Item.Value.Code command.Parameters.Add(New MySqlParameter("@v2", MySqlDbType.VarChar)).Value = Item.Value.Name command.Parameters.Add(New MySqlParameter("@v3", MySqlDbType.Int32)).Value = InfobaseID command.ExecuteNonQuery() Catch ex As Exception Console.WriteLine(ex.Message) End Try Next '--------------------------------------------------------------------------------------------------------- command.CommandText = "REPLACE INTO `Metadata` (`InfobaseCode`,`Code`,`Name`,`Guid`) VALUES(@v4, @v1,@v2,@v3)" For Each Item In DictMetadata Try command.Parameters.Clear() command.Parameters.Add(New MySqlParameter("@v1", MySqlDbType.Int32)).Value = Item.Value.Code command.Parameters.Add(New MySqlParameter("@v2", MySqlDbType.VarChar)).Value = Item.Value.Name command.Parameters.Add(New MySqlParameter("@v3", MySqlDbType.VarChar)).Value = Item.Value.Guid command.Parameters.Add(New MySqlParameter("@v4", MySqlDbType.Int32)).Value = InfobaseID command.ExecuteNonQuery() Catch ex As Exception Console.WriteLine(ex.Message) End Try Next '--------------------------------------------------------------------------------------------------------- command.CommandText = "REPLACE INTO `Users` (`InfobaseCode`,`Code`,`Name`,`Guid`) VALUES(@v4, @v1,@v2,@v3)" For Each Item In DictUsers Try command.Parameters.Clear() command.Parameters.Add(New MySqlParameter("@v1", MySqlDbType.Int32)).Value = Item.Value.Code command.Parameters.Add(New MySqlParameter("@v2", MySqlDbType.VarChar)).Value = Item.Value.Name command.Parameters.Add(New MySqlParameter("@v3", MySqlDbType.VarChar)).Value = Item.Value.Guid command.Parameters.Add(New MySqlParameter("@v4", MySqlDbType.Int32)).Value = InfobaseID command.ExecuteNonQuery() Catch ex As Exception Console.WriteLine(ex.Message) End Try Next '--------------------------------------------------------------------------------------------------------- command.CommandText = "REPLACE INTO `SecondPorts` (`InfobaseCode`,`Code`,`Name`) VALUES(@v3, @v1,@v2)" For Each Item In DictSecondPorts Try command.Parameters.Clear() command.Parameters.Add(New MySqlParameter("@v1", MySqlDbType.Int32)).Value = Item.Value.Code command.Parameters.Add(New MySqlParameter("@v2", MySqlDbType.VarChar)).Value = Item.Value.Name command.Parameters.Add(New MySqlParameter("@v3", MySqlDbType.Int32)).Value = InfobaseID command.ExecuteNonQuery() Catch ex As Exception Console.WriteLine(ex.Message) End Try Next '--------------------------------------------------------------------------------------------------------- command.CommandText = "REPLACE INTO `Servers` (`InfobaseCode`,`Code`,`Name`) VALUES(@v3, @v1,@v2)" For Each Item In DictServers Try command.Parameters.Clear() command.Parameters.Add(New MySqlParameter("@v1", MySqlDbType.Int32)).Value = Item.Value.Code command.Parameters.Add(New MySqlParameter("@v2", MySqlDbType.VarChar)).Value = Item.Value.Name command.Parameters.Add(New MySqlParameter("@v3", MySqlDbType.Int32)).Value = InfobaseID command.ExecuteNonQuery() Catch ex As Exception Console.WriteLine(ex.Message) End Try Next '--------------------------------------------------------------------------------------------------------- command.CommandText = "REPLACE INTO `Infobases` (`Guid`,`Code`,`Name`) VALUES(@v0,@v1,@v2)" Try command.Parameters.Clear() command.Parameters.Add(New MySqlParameter("@v0", MySqlDbType.VarChar)).Value = InfobaseGuid command.Parameters.Add(New MySqlParameter("@v1", MySqlDbType.Int32)).Value = InfobaseID command.Parameters.Add(New MySqlParameter("@v2", MySqlDbType.VarChar)).Value = InfobaseName command.ExecuteNonQuery() Catch ex As Exception Console.WriteLine(ex.Message) End Try command.Dispose() objConn.Close() objConn.Dispose() End If LastReferenceUpdate = Now End Sub Public Sub GetInfobaseIDFromDatabase() 'У нас есть ГУИД базы, но нет сквозного кода для информации. 'Сделано для оптимизации, чтобы в каждой строке события не записывать ГУИД, а хранить целое число. If ItIsMSSQL Then Dim objConn As New SqlConnection(ConnectionString) objConn.Open() Dim command As New SqlCommand("SELECT [Code] FROM [dbo].[Infobases] WHERE [Guid] = @v1", objConn) command.Parameters.Add(New SqlParameter("@v1", SqlDbType.Char)).Value = InfobaseGuid Dim rs = command.ExecuteReader If rs.Read Then InfobaseID = Convert.ToInt32(rs(0)) End If rs.Close() If InfobaseID = 0 Then command.CommandText = "INSERT INTO Infobases ([Code],[Name],[guid])" + " SELECT MAX(f) AS [Code], @v0 as [Name], @v1 as [guid] FROM " + " (SELECT MAX(Code) + 1 AS f FROM Infobases UNION ALL" + " SELECT 1 AS Expr1) AS T" command.Parameters.Clear() command.Parameters.Add(New SqlParameter("@v0", SqlDbType.Char)).Value = InfobaseName command.Parameters.Add(New SqlParameter("@v1", SqlDbType.Char)).Value = InfobaseGuid command.ExecuteNonQuery() command.CommandText = "SELECT [Code] FROM [dbo].[Infobases] WHERE [Guid] = @v1" rs = command.ExecuteReader() If rs.Read Then InfobaseID = Convert.ToInt32(rs(0)) End If rs.Close() End If command.Dispose() objConn.Close() objConn.Dispose() ElseIf ItIsMySQL Then Dim objConn As New MySqlConnection(ConnectionString) objConn.Open() Dim command As New MySqlCommand("SELECT `Code` FROM `Infobases` WHERE `Guid` = @v1", objConn) command.Parameters.Add(New MySqlParameter("@v1", MySqlDbType.VarChar)).Value = InfobaseGuid Dim rs = command.ExecuteReader If rs.Read Then InfobaseID = Convert.ToInt32(rs(0)) End If rs.Close() If InfobaseID = 0 Then command.CommandText = "INSERT INTO Infobases (`Code`,`Name`,`guid`)" + " SELECT MAX(f) AS `Code`, @v0 as `Name`, @v1 as `guid` FROM " + " (SELECT MAX(Code) + 1 AS f FROM `Infobases` UNION ALL" + " SELECT 1 AS `Expr1`) AS T" command.Parameters.Clear() command.Parameters.Add(New MySqlParameter("@v0", MySqlDbType.VarChar)).Value = InfobaseName command.Parameters.Add(New MySqlParameter("@v1", MySqlDbType.VarChar)).Value = InfobaseGuid command.ExecuteNonQuery() command.CommandText = "SELECT `Code` FROM `Infobases` WHERE `Guid` = @v1" rs = command.ExecuteReader() If rs.Read Then InfobaseID = Convert.ToInt32(rs(0)) End If rs.Close() End If command.Dispose() objConn.Close() objConn.Dispose() End If '-------------------------------------------------------------- End Sub Sub SaveReadParametersToFile() Dim ReadParametersFile = Path.Combine(My.Application.Info.DirectoryPath, "read-setting-" + InfobaseGuid + ".json") Dim ConfigSettingObj = New ReadParameters ConfigSettingObj.CurrentPosition = CurrentPosition ConfigSettingObj.CurrentFilename = CurrentFilename ConfigSettingObj.LastEventNumber83 = LastEventNumber83 Dim JsonText As String = JsonConvert.SerializeObject(ConfigSettingObj, Formatting.Indented) My.Computer.FileSystem.WriteAllText(ReadParametersFile, JsonText, False) End Sub Sub GetReadParametersFromFile() Dim ReadParametersFile = Path.Combine(My.Application.Info.DirectoryPath, "read-setting-" + InfobaseGuid + ".json") If My.Computer.FileSystem.FileExists(ReadParametersFile) Then Dim JsonText = My.Computer.FileSystem.ReadAllText(ReadParametersFile) Dim ConfigSettingObj = JsonConvert.DeserializeObject(Of ReadParameters)(JsonText) CurrentPosition = Convert.ToInt64(ConfigSettingObj.CurrentPosition) CurrentFilename = ConfigSettingObj.CurrentFilename LastEventNumber83 = ConfigSettingObj.LastEventNumber83 End If End Sub Sub SaveEventsToSQL() If EventsList.Count = 0 Then Return End If If ItIsMSSQL Then Dim objConn As New SqlConnection(ConnectionString) objConn.Open() Dim command As New SqlCommand("BEGIN TRANSACTION", objConn) command.ExecuteNonQuery() command.CommandText = "INSERT INTO [dbo].[Events] ([InfobaseCode],[DateTime],[TransactionStatus],[Transaction],[UserName],[ComputerName]" + ",[AppName],[Field2],[EventID],[EventType],[Comment],[MetadataID],[DataStructure],[DataString]" + ",[ServerID],[MainPortID],[SecondPortID],[Seance],[Field7],[Field8],[TransactionStartTime],[TransactionMark])" + " VALUES(@v0,@v1,@v2,@v3,@v4,@v5,@v6,@v7,@v8,@v9,@v10,@v11,@v12,@v13,@v14,@v15,@v16,@v17,@v18,@v19,@v20,@v21)" Dim i = 0 For Each Ev In EventsList If Ev.AppName = Nothing Then Continue For Try command.Parameters.Clear() command.Parameters.Add(New SqlParameter("@v0", SqlDbType.Int)).Value = InfobaseID command.Parameters.Add(New SqlParameter("@v1", SqlDbType.DateTime)).Value = Ev.DateTime command.Parameters.Add(New SqlParameter("@v2", SqlDbType.Char)).Value = Ev.TransactionStatus command.Parameters.Add(New SqlParameter("@v3", SqlDbType.Char)).Value = Ev.Transaction command.Parameters.Add(New SqlParameter("@v4", SqlDbType.Int)).Value = Ev.UserName command.Parameters.Add(New SqlParameter("@v5", SqlDbType.Int)).Value = Ev.ComputerName command.Parameters.Add(New SqlParameter("@v6", SqlDbType.Int)).Value = Ev.AppName command.Parameters.Add(New SqlParameter("@v7", SqlDbType.Char)).Value = Ev.Field2 command.Parameters.Add(New SqlParameter("@v8", SqlDbType.Int)).Value = Ev.EventID command.Parameters.Add(New SqlParameter("@v9", SqlDbType.Char)).Value = Ev.EventType command.Parameters.Add(New SqlParameter("@v10", SqlDbType.VarChar)).Value = Ev.Comment command.Parameters.Add(New SqlParameter("@v11", SqlDbType.Int)).Value = Ev.MetadataID If Ev.DataStructure.Length > 100 Then Ev.DataStructure = Ev.DataStructure.Substring(0, 99) End If command.Parameters.Add(New SqlParameter("@v12", SqlDbType.Char)).Value = Ev.DataStructure command.Parameters.Add(New SqlParameter("@v13", SqlDbType.VarChar)).Value = Ev.DataString command.Parameters.Add(New SqlParameter("@v14", SqlDbType.Int)).Value = Ev.ServerID command.Parameters.Add(New SqlParameter("@v15", SqlDbType.Int)).Value = Ev.MainPortID command.Parameters.Add(New SqlParameter("@v16", SqlDbType.Int)).Value = Ev.SecondPortID command.Parameters.Add(New SqlParameter("@v17", SqlDbType.Int)).Value = Ev.SessionNumber command.Parameters.Add(New SqlParameter("@v18", SqlDbType.Char)).Value = Ev.Field7 command.Parameters.Add(New SqlParameter("@v19", SqlDbType.Char)).Value = Ev.Field8 command.Parameters.Add(New SqlParameter("@v20", SqlDbType.DateTime)).Value = Ev.TransactionStartTime command.Parameters.Add(New SqlParameter("@v21", SqlDbType.BigInt)).Value = Ev.TransactionMark command.ExecuteNonQuery() i += 1 Catch ex As Exception Log.Error("Ошибка сохранения в БД записи от " + Ev.DateTime.ToString + " по ИБ " + InfobaseName + " : " + ex.Message) End Try Next SaveReadParametersToFile() Console.WriteLine(Now.ToShortTimeString + " New records have been processed " + i.ToString) command.CommandText = "COMMIT TRANSACTION" command.Parameters.Clear() command.ExecuteNonQuery() command.Dispose() objConn.Close() objConn.Dispose() ElseIf ItIsMySQL Then Dim objConn As New MySqlConnection(ConnectionString) objConn.Open() Dim command As New MySqlCommand("START TRANSACTION", objConn) command.ExecuteNonQuery() command.CommandText = "INSERT INTO `Events` (`InfobaseCode`,`DateTime`,`TransactionStatus`,`Transaction`,`UserName`,`ComputerName`" + ",`AppName`,`Field2`,`EventID`,`EventType`,`Comment`,`MetadataID`,`DataStructure`,`DataString`" + ",`ServerID`,`MainPortID`,`SecondPortID`,`Seance`,`Field7`,`Field8`,`TransactionStartTime`,`TransactionMark`)" + " VALUES(@v0,@v1,@v2,@v3,@v4,@v5,@v6,@v7,@v8,@v9,@v10,@v11,@v12,@v13,@v14,@v15,@v16,@v17,@v18,@v19,@v20,@v21)" Dim i = 0 For Each Ev In EventsList If Ev.AppName = Nothing Then Continue For Try command.Parameters.Clear() command.Parameters.Add(New MySqlParameter("@v0", MySqlDbType.Int32)).Value = InfobaseID command.Parameters.Add(New MySqlParameter("@v1", MySqlDbType.DateTime)).Value = Ev.DateTime command.Parameters.Add(New MySqlParameter("@v2", MySqlDbType.VarChar)).Value = Ev.TransactionStatus command.Parameters.Add(New MySqlParameter("@v3", MySqlDbType.VarChar)).Value = Ev.Transaction command.Parameters.Add(New MySqlParameter("@v4", MySqlDbType.Int32)).Value = Ev.UserName command.Parameters.Add(New MySqlParameter("@v5", MySqlDbType.Int32)).Value = Ev.ComputerName command.Parameters.Add(New MySqlParameter("@v6", MySqlDbType.Int32)).Value = Ev.AppName command.Parameters.Add(New MySqlParameter("@v7", MySqlDbType.VarChar)).Value = Ev.Field2 command.Parameters.Add(New MySqlParameter("@v8", MySqlDbType.Int32)).Value = Ev.EventID command.Parameters.Add(New MySqlParameter("@v9", MySqlDbType.VarChar)).Value = Ev.EventType command.Parameters.Add(New MySqlParameter("@v10", MySqlDbType.VarChar)).Value = Ev.Comment command.Parameters.Add(New MySqlParameter("@v11", MySqlDbType.Int32)).Value = Ev.MetadataID command.Parameters.Add(New MySqlParameter("@v12", MySqlDbType.VarChar)).Value = Ev.DataStructure command.Parameters.Add(New MySqlParameter("@v13", MySqlDbType.VarChar)).Value = Ev.DataString command.Parameters.Add(New MySqlParameter("@v14", MySqlDbType.Int32)).Value = Ev.ServerID command.Parameters.Add(New MySqlParameter("@v15", MySqlDbType.Int32)).Value = Ev.MainPortID command.Parameters.Add(New MySqlParameter("@v16", MySqlDbType.Int32)).Value = Ev.SecondPortID command.Parameters.Add(New MySqlParameter("@v17", MySqlDbType.Int32)).Value = Ev.SessionNumber command.Parameters.Add(New MySqlParameter("@v18", MySqlDbType.VarChar)).Value = Ev.Field7 command.Parameters.Add(New MySqlParameter("@v19", MySqlDbType.VarChar)).Value = Ev.Field8 command.Parameters.Add(New MySqlParameter("@v20", MySqlDbType.DateTime)).Value = Ev.TransactionStartTime command.Parameters.Add(New MySqlParameter("@v21", MySqlDbType.Int64)).Value = Ev.TransactionMark command.ExecuteNonQuery() i += 1 Catch ex As Exception Log.Error("Ошибка сохранения в БД записи от " + Ev.DateTime.ToString + " по ИБ " + InfobaseName + " : " + ex.Message) End Try Next Console.WriteLine(Now.ToShortTimeString + " New records have been processed " + i.ToString) SaveReadParametersToFile() command.CommandText = "COMMIT" command.Parameters.Clear() command.ExecuteNonQuery() command.Dispose() objConn.Close() objConn.Dispose() ElseIf ItIsES Then Dim node = New Uri(ConnectionString) Dim _settings = New ConnectionSettings(node).DefaultIndex(ESIndexName).MaximumRetries(2).MaxRetryTimeout(TimeSpan.FromSeconds(150)) Dim _current = New ElasticClient(_settings) 'Let's create proper array for ES Dim NewRecords As List(Of ESRecord) = New List(Of ESRecord) For Each EventRecord In EventsList Dim ESRecord = New ESRecord With {.ServerName = ESServerName, .DatabaseName = InfobaseName} ESRecord.RowID = EventRecord.RowID Select Case EventRecord.Severity Case 1 ESRecord.Severity = "Information" Case 2 ESRecord.Severity = "Warning" Case 3 ESRecord.Severity = "Error" Case 4 ESRecord.Severity = "Note" End Select ESRecord.DateTime = EventRecord.DateTime ESRecord.ConnectID = EventRecord.ConnectID ESRecord.DataType = EventRecord.DataType ESRecord.SessionNumber = EventRecord.SessionNumber ESRecord.DataStructure = EventRecord.DataStructure ESRecord.DataString = EventRecord.DataString ESRecord.Comment = EventRecord.Comment 'ESRecord.EventTypeString = EventRecord.EventType - this is severity ESRecord.SessionDataSplitCode = EventRecord.SessionDataSplitCode Dim EventObj = New EventType If DictEvents.TryGetValue(EventRecord.EventID, EventObj) Then ESRecord.EventType = EventObj End If Dim MetadataObj = New Metadata If DictMetadata.TryGetValue(EventRecord.MetadataID, MetadataObj) Then ESRecord.Metadata = MetadataObj End If Dim ComputerObj = New Computer If DictComputers.TryGetValue(EventRecord.ComputerName, ComputerObj) Then ESRecord.Computer = ComputerObj.Name End If Dim MainPortObj = New MainPort If DictMainPorts.TryGetValue(EventRecord.MainPortID, MainPortObj) Then ESRecord.PrimaryPort = MainPortObj.Name End If Dim ServerObj = New Server If DictServers.TryGetValue(EventRecord.ServerID, ServerObj) Then ESRecord.Server = ServerObj.Name End If Dim SecondPortObj = New SecondPort If DictSecondPorts.TryGetValue(EventRecord.SecondPortID, SecondPortObj) Then ESRecord.SecondaryPort = SecondPortObj.Name End If Dim ApplicationObj = New Application If DictApplications.TryGetValue(EventRecord.AppName, ApplicationObj) Then ESRecord.Application = ApplicationObj.Name End If Dim UserNameObj = New User If DictUsers.TryGetValue(EventRecord.UserName, UserNameObj) Then ESRecord.UserName = UserNameObj End If NewRecords.Add(ESRecord) Next Dim Result = _current.IndexMany(NewRecords, ESIndexName, "event-log-record") Console.WriteLine(Now.ToShortTimeString + " New records have been processed " + NewRecords.Count.ToString) SaveReadParametersToFile() End If EventsList.Clear() End Sub Sub LoadReference() 'Clear all reference dictionaries DictUsers.Clear() DictComputers.Clear() DictApplications.Clear() DictEvents.Clear() DictMetadata.Clear() DictServers.Clear() DictMainPorts.Clear() DictSecondPorts.Clear() Try Dim FileName = Path.Combine(Catalog, "1Cv8.lgf") If My.Computer.FileSystem.FileExists(FileName) Then Dim FI = My.Computer.FileSystem.GetFileInfo(FileName) If FI.LastWriteTime >= LastReferenceUpdate Then Dim FS As FileStream = New FileStream(FileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite) Dim SR As StreamReader = New StreamReader(FS) 'Dim TextFile = My.Computer.FileSystem.OpenTextFileReader(FileName) 'Dim Text = TextFile.ReadToEnd() 'TextFile.Close() Dim Text = SR.ReadToEnd() SR.Close() FS.Close() Dim ArrayLines = ParserServices.ParseString(Text) Dim i = 0 For Each a In ArrayLines If Not a Is Nothing Then Select Case a(1) Case "1" AddUser(Convert.ToInt32(a(4)), a(2), a(3)) Case "2" AddComputer(Convert.ToInt32(a(3)), a(2)) Case "3" AddApplication(Convert.ToInt32(a(3)), a(2)) Case "4" AddEvent(Convert.ToInt32(a(3)), a(2)) Case "5" AddMetadata(Convert.ToInt32(a(4)), a(2), a(3)) Case "6" AddServer(Convert.ToInt32(a(3)), a(2)) Case "7" AddMainPort(Convert.ToInt32(a(3)), a(2)) Case "8" AddSecondPort(Convert.ToInt32(a(3)), a(2)) 'Case "9" - не видел этих в файле 'Case "10" Case "11" Case "12" Case "13" 'в числе последних трех должны быть статус транзакции и важность Case Else End Select End If Next SaveReferenceValuesToDatabase() End If End If Catch ex As Exception Log.ErrorException("Error occurred while working with reference file", ex) End Try Try Dim FileName = Path.Combine(Catalog, "1Cv8.lgd") If My.Computer.FileSystem.FileExists(FileName) Then Dim Conn = New SQLite.SQLiteConnection("Data Source=" + FileName) Conn.Open() Dim Command = New SQLite.SQLiteCommand Command.Connection = Conn Command.CommandText = "SELECT [code], [name] FROM [AppCodes]" Dim rs = Command.ExecuteReader While rs.Read AddApplication(rs(0), RemoveQuotes(rs(1))) End While rs.Close() Command.CommandText = "SELECT [code], [name] FROM [ComputerCodes]" rs = Command.ExecuteReader While rs.Read AddComputer(rs(0), RemoveQuotes(rs(1))) End While rs.Close() Command.CommandText = "SELECT [code], [name] FROM [EventCodes]" rs = Command.ExecuteReader While rs.Read AddEvent(rs(0), RemoveQuotes(rs(1))) End While rs.Close() Command.CommandText = "SELECT [code], [uuid], [name] FROM [UserCodes]" rs = Command.ExecuteReader While rs.Read AddUser(rs(0), rs(1), rs(2)) End While rs.Close() Command.CommandText = "SELECT [code], [name] FROM [WorkServerCodes]" rs = Command.ExecuteReader While rs.Read AddServer(rs(0), RemoveQuotes(rs(1))) End While rs.Close() Command.CommandText = "SELECT [code], [uuid], [name] FROM [MetadataCodes]" rs = Command.ExecuteReader While rs.Read AddMetadata(rs(0), rs(1), rs(2)) End While rs.Close() Command.CommandText = "SELECT [code], [name] FROM [PrimaryPortCodes]" rs = Command.ExecuteReader While rs.Read AddMainPort(rs(0), rs(1)) End While rs.Close() Command.CommandText = "SELECT [code], [name] FROM [SecondaryPortCodes]" rs = Command.ExecuteReader While rs.Read AddSecondPort(rs(0), rs(1)) End While rs.Close() Command.Dispose() Conn.Close() Conn.Dispose() SaveReferenceValuesToDatabase() End If Catch ex As Exception Log.ErrorException("Error occurred while working with reference tables", ex) End Try End Sub Function RemoveQuotes(Str As String) As String RemoveQuotes = Str If RemoveQuotes.StartsWith("""") Then RemoveQuotes = RemoveQuotes.Substring(1) End If If RemoveQuotes.EndsWith("""") Then RemoveQuotes = RemoveQuotes.Substring(0, RemoveQuotes.Length - 1) End If Return RemoveQuotes End Function Sub FindAndStartParseFiles() Dim v83File = Path.Combine(Catalog, "1Cv8.lgd") If My.Computer.FileSystem.FileExists(v83File) Then LoadEvents83(v83File) SaveEventsToSQL() Else Dim ArrayFiles(0) As String Dim i = 0 If My.Computer.FileSystem.DirectoryExists(Catalog) Then Dim Files = My.Computer.FileSystem.GetFiles(Catalog) For Each File In Files If File.EndsWith(".lgp") Then ReDim Preserve ArrayFiles(i) ArrayFiles(i) = File i = i + 1 End If Next System.Array.Sort(ArrayFiles) For Each File In ArrayFiles If Not File Is Nothing Then Try Dim FI = My.Computer.FileSystem.GetFileInfo(File) If FI.Name >= CurrentFilename Then If Not FI.Name = CurrentFilename Then CurrentPosition = 61 ' start position for log-file 1C End If CurrentFilename = FI.Name LoadEvents(File) End If Catch ex As Exception Log.ErrorException("Error in FindAndStartParseFiles", ex) End Try End If Next SaveEventsToSQL() End If End If End Sub Sub LoadEvents83(FileName As String) Try Dim Conn = New System.Data.SQLite.SQLiteConnection("Data Source=" + FileName) Conn.Open() Dim Command = New System.Data.SQLite.SQLiteCommand Command.Connection = Conn Dim ANSI = Text.Encoding.GetEncoding(1252) Dim UTF8 = Text.Encoding.UTF8 While True Command.CommandText = "SELECT [rowID], [severity], [date], [connectID], [session], [transactionStatus], [transactionDate], [transactionID], [userCode], [computerCode], [appCode], [eventCode], [comment], [metadataCodes], [sessionDataSplitCode],-- [dataType], [data], [dataPresentation], [workServerCode], [primaryPortCode], [secondaryPortCode] FROM [EventLog] WHERE [rowID] > @LastEventNumber83 ORDER BY 1 LIMIT 1000" Command.Parameters.AddWithValue("LastEventNumber83", LastEventNumber83) Dim rs = Command.ExecuteReader Dim HasData = rs.HasRows While rs.Read Dim OneEvent = New OneEventRecord OneEvent.RowID = rs("rowID") OneEvent.Severity = rs("severity") OneEvent.ConnectID = rs("connectID") OneEvent.DateTime = New Date().AddSeconds(Convert.ToInt64(rs("date") / 10000)) OneEvent.TransactionStatus = rs("transactionStatus") OneEvent.TransactionMark = rs("transactionID") OneEvent.TransactionStartTime = New Date().AddYears(2000) Try If Not rs("transactionDate") = 0 Then OneEvent.TransactionStartTime = New Date().AddSeconds(Convert.ToInt64(rs("transactionDate") / 10000)) End If Catch ex As Exception End Try OneEvent.UserName = rs("userCode") OneEvent.ComputerName = rs("computerCode") OneEvent.AppName = rs("appCode") OneEvent.EventID = rs("eventCode") OneEvent.Comment = rs("comment") 'OneEvent.MetadataID = rs("metadataCodes") Dim MDCodes As String = rs("metadataCodes") If String.IsNullOrEmpty(MDCodes) Then OneEvent.MetadataID = 0 ElseIf MDCodes.Contains(",") Then Dim MDCode As String = MDCodes.Split(New Char() {","c}).GetValue(0) Integer.TryParse(MDCode, OneEvent.MetadataID) Else Integer.TryParse(MDCodes, OneEvent.MetadataID) End If Dim s = "" If Not String.IsNullOrEmpty(rs("data")) Then s = UTF8.GetString(ANSI.GetBytes(rs("data"))) End If OneEvent.DataStructure = s OneEvent.DataType = rs("dataType") OneEvent.DataString = rs("dataPresentation") OneEvent.ServerID = rs("workServerCode") OneEvent.MainPortID = rs("primaryPortCode") OneEvent.SecondPortID = rs("secondaryPortCode") OneEvent.SessionNumber = rs("session") OneEvent.SessionDataSplitCode = rs("sessionDataSplitCode") OneEvent.Transaction = "" OneEvent.Field2 = "" OneEvent.EventType = "" OneEvent.Field7 = "" OneEvent.Field8 = "" EventsList.Add(OneEvent) If EventsList.Count >= 1000 Then 'Console.WriteLine("Выгрузка 1000 событий: " + Now.ToString) SaveEventsToSQL() End If LastEventNumber83 = OneEvent.RowID End While rs.Close() SaveEventsToSQL() If Not HasData Then Exit While End If End While Command.Dispose() Conn.Close() Conn.Dispose() Catch ex As Exception Log.ErrorException("Error while working with EventLog table (SQLite)", ex) End Try End Sub Sub LoadEvents(FileName As String) Dim FS As FileStream = New FileStream(FileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite) FS.Position = CurrentPosition Dim SR As StreamReader = New StreamReader(FS) 'Dim TextFile = My.Computer.FileSystem.OpenTextFileReader(FileName) 'TextFile.BaseStream.Position = Events.CurrentPosition ' учесть, что первые 2 символа служебные, т.е. первый - №3 '' + 2 символа перевода каретки в конце каждой строки '' '' TEMP ''Dim TextFile2 = My.Computer.FileSystem.OpenTextFileReader(FileName) ''TextFile2.BaseStream.Position = Events.CurrentPosition + 1 '' '' TEMP Dim TextLine = "" Dim CountLines = 0 Dim NewLine = True Dim StrEvent = "" Dim CountBracket = 0 Dim Position = CurrentPosition 'Dim WasReadSomeString = False While Not TextLine Is Nothing 'CountLines = CountLines + 1 TextLine = SR.ReadLine() If TextLine Is Nothing Then 'если чтение прервано на середине, то ничего прибавлять не нужно, если же чтение 'было завершено до конца, а потом читаются новые события, то появляется запятая, которую нужно учеть с ПЛЮС ОДИН позиции 'If WasReadSomeString Then ' Position = Position + 1 ' Events.CurrentPosition = Position 'End If Exit While End If ' WasReadSomeString = True Position = Position + 2 + Text.Encoding.UTF8.GetBytes(TextLine).Length CurrentPosition = Position If NewLine Then StrEvent = TextLine Else StrEvent = StrEvent + vbNewLine + TextLine End If If ItsEndOfEvent(TextLine, CountBracket) Then NewLine = True If Not StrEvent Is Nothing Then Try AddEvent(StrEvent) Catch ex As Exception End Try '*** 'Exit While '** End If Else NewLine = False End If End While SaveEventsToSQL() SR.Close() FS.Close() End Sub Function ItsEndOfEvent(Str As String, ByRef Count As Integer) ItsEndOfEvent = False Dim TempStr = Str Dim TextBlockOpen = False For i = 0 To TempStr.Length - 1 Dim Simb = TempStr.Substring(i, 1) If Simb = """" Then TextBlockOpen = Not TextBlockOpen ElseIf Simb = "}" And Not TextBlockOpen Then Count = Count - 1 ElseIf Simb = "{" And Not TextBlockOpen Then Count = Count + 1 End If Next ItsEndOfEvent = (Count = 0) End Function Sub CreateStr(ByRef Str As String, LastLvl As Integer, Arr() As Object) Dim StrLvl = Arr(0).GetEnumerator Dim Lvl = 0 Dim StrTab = "" While StrLvl.MoveNext If StrLvl.Current = "." Then Lvl = Lvl + 1 End If End While For j = 1 To Lvl - 1 StrTab = StrTab + " " Next Dim StrVal = "" Dim Count = 0 For Each Ar In Arr Count = Count + 1 If Count > 1 Then StrVal = StrVal + IIf(StrVal = "", "", "; ") + Ar.ToString.Trim End If Next If Not StrVal = "" Then If Lvl <> LastLvl Then Str = Str + IIf(Str = "", "", vbNewLine) End If Str = Str + StrTab + StrVal End If LastLvl = Lvl End Sub Function From16To10(Str As String) From16To10 = 0 Dim Simb = "0123456789ABCDEF" Dim L = Str.Length For i = 0 To L - 1 Dim S = Str.Substring(i, 1) Dim Ind = Simb.IndexOf(S.ToUpper) If Ind > -1 Then From16To10 = From16To10 + Ind * Math.Pow(16, L - (i + 1)) End If Next End Function Public Sub AddEvent(Str As String) Dim provider As CultureInfo = CultureInfo.InvariantCulture Dim OneEvent As OneEventRecord = New OneEventRecord Dim Array = ParserServices.ParseEventlogString(Str) OneEvent.DateTime = Date.ParseExact(Array(0), "yyyyMMddHHmmss", provider) OneEvent.TransactionStatus = Array(1) Dim TransStr = Array(2).ToString.Replace("}", "").Replace("{", "") Dim TransDate = From16To10(TransStr.Substring(0, TransStr.IndexOf(","))) OneEvent.TransactionStartTime = New Date().AddYears(2000) Try If Not TransDate = 0 Then OneEvent.TransactionStartTime = New Date().AddSeconds(Convert.ToInt64(TransDate / 10000)) End If Catch ex As Exception End Try OneEvent.TransactionMark = From16To10(TransStr.Substring(TransStr.IndexOf(",") + 1)) OneEvent.Transaction = Array(2) OneEvent.UserName = Convert.ToInt32(Array(3)) OneEvent.ComputerName = Convert.ToInt32(Array(4)) OneEvent.AppName = Convert.ToInt32(Array(5)) OneEvent.Field2 = Array(6) OneEvent.EventID = Convert.ToInt32(Array(7)) OneEvent.EventType = Array(8) OneEvent.Comment = RemoveQuotes(Array(9)) OneEvent.MetadataID = Convert.ToInt32(Array(10)) OneEvent.DataStructure = Array(11) OneEvent.DataString = RemoveQuotes(Array(12)) OneEvent.ServerID = Convert.ToInt32(Array(13)) OneEvent.MainPortID = Convert.ToInt32(Array(14)) OneEvent.SecondPortID = Convert.ToInt32(Array(15)) OneEvent.SessionNumber = Convert.ToInt32(Array(16)) OneEvent.Field7 = Array(17) OneEvent.Field8 = Array(18) '************************************************************************* 'Additional parsing to make sure that data looks the same between old and new EventLog formats If OneEvent.DataStructure = "{""U""}" Then 'empty reference OneEvent.DataStructure = "" ElseIf OneEvent.DataStructure.StartsWith("{") Then 'internal representation for different objects. Dim ParsedObject = ParserServices.ParseEventlogString(OneEvent.DataStructure) If ParsedObject.Length = 2 Then If ParsedObject(0) = """S""" _ Or ParsedObject(0) = """R""" Then 'this is string or reference OneEvent.DataStructure = RemoveQuotes(ParsedObject(1)) 'string value End If End If End If Select Case OneEvent.EventType Case "I" OneEvent.Severity = 1 '"Information" Case "W" OneEvent.Severity = 2 '"Warning" Case "E" OneEvent.Severity = 3'"Error" Case "N" OneEvent.Severity = 4 '"Note" End Select '************************************************************************* EventsList.Add(OneEvent) 'Events(Events.Length - 1) = OneEvent If EventsList.Count >= 1000 Then 'Console.WriteLine("Выгрузка 1000 событий: " + Now.ToString) SaveEventsToSQL() End If End Sub Public Sub DoWork() While True Console.WriteLine(Now.ToShortTimeString + " Start new iteration...") Try LoadReference() GetReadParametersFromFile() FindAndStartParseFiles() Catch ex As Exception Log.ErrorException("Error occurred during log file processing (" + InfobaseName + ")", ex) End Try Threading.Thread.Sleep(SleepTime) End While End Sub End Class