1
0
mirror of https://github.com/romanlryji/EventLogLoader.git synced 2025-12-07 23:23:44 +02:00

C# application

This commit is contained in:
Roman
2019-10-02 11:18:07 +03:00
parent 2f830f19af
commit 2aaa26f0c1
35 changed files with 6197 additions and 2 deletions

6
EventLogApp/App.config Normal file
View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.1"/>
</startup>
</configuration>

View File

@@ -0,0 +1,22 @@
using System.Collections.Generic;
namespace EventLogApp
{
public class ConfigSetting
{
public string ConnectionString { get; set; }
public string DBType { get; set; }
public int RepeatTime { get; set; }
public string ESIndexName { get; set; }
public bool ESUseSynonymsForFieldsNames { get; set; }
public ElasticSearchFieldSynonymsClass ESFieldSynonyms { get; set; }
public List<InfobaseSetting> Infobases { get; set; }
public ConfigSetting()
{
Infobases = new List<InfobaseSetting>();
ESFieldSynonyms = new ElasticSearchFieldSynonymsClass();
}
}
}

View File

@@ -0,0 +1,30 @@
using Newtonsoft.Json;
using System.IO;
namespace EventLogApp
{
class ConfigSettings
{
public static ConfigSetting LoadConfigSettingFromFile(string ConfigFilePath)
{
if (File.Exists(ConfigFilePath))
{
string JsonText = File.ReadAllText(ConfigFilePath);
ConfigSetting ConfigSettingObj = JsonConvert.DeserializeObject<ConfigSetting>(JsonText);
return ConfigSettingObj;
}
return new ConfigSetting();
}
public static void SaveConfigSettingToFile(ConfigSetting ConfigSettingObj, string ConfigFilePath)
{
string JsonText = JsonConvert.SerializeObject(ConfigSettingObj, Formatting.Indented);
File.WriteAllText(ConfigFilePath, JsonText);
}
}
}

View File

@@ -0,0 +1,26 @@
namespace EventLogApp
{
public class ElasticSearchFieldSynonymsClass
{
public string ServerName { get; set; }
public string DatabaseName { get; set; }
public string RowID { get; set; }
public string Severity { get; set; }
public string DateTime { get; set; }
public string ConnectID { get; set; }
public string DataType { get; set; }
public string SessionNumber { get; set; }
public string DataStructure { get; set; }
public string DataString { get; set; }
public string Comment { get; set; }
public string SessionDataSplitCode { get; set; }
public string EventType { get; set; }
public string Metadata { get; set; }
public string Computer { get; set; }
public string PrimaryPort { get; set; }
public string Server { get; set; }
public string SecondaryPort { get; set; }
public string Application { get; set; }
public string UserName { get; set; }
}
}

View File

@@ -0,0 +1,9 @@
namespace EventLogApp
{
internal class Application : CodeNameType
{
public Application(long code, string name) : base(code, name)
{
}
}
}

View File

@@ -0,0 +1,12 @@
namespace EventLogApp
{
internal class CodeNameGuidType : CodeNameType
{
public string Guid;
public CodeNameGuidType(long code, string name, string guid) : base(code, name)
{
this.Guid = guid;
}
}
}

View File

@@ -0,0 +1,22 @@
namespace EventLogApp
{
internal class CodeNameType
{
public long Code;
public string Name;
public CodeNameType(long code, string name)
{
this.Code = code;
if (string.IsNullOrEmpty(name))
{
this.Name = string.Empty;
}
else
{
this.Name = name;
}
}
}
}

View File

@@ -0,0 +1,9 @@
namespace EventLogApp
{
internal class Computer : CodeNameType
{
public Computer(long code, string name) : base(code, name)
{
}
}
}

View File

@@ -0,0 +1,28 @@
using System;
namespace EventLogApp
{
internal class ESRecord
{
public long RowID { get; set; }
public string ServerName { get; set; }
public string DatabaseName { get; set; }
public DateTime DateTime { get; set; }
public string Severity { get; set; }
public EventType EventType { get; set; }
public string Computer { get; set; }
public string Application { get; set; }
public Metadata Metadata { get; set; }
public User UserName { get; set; }
public int SessionNumber { get; set; }
public int ConnectID { get; set; }
public int DataType { get; set; }
public string DataStructure { get; set; }
public string DataString { get; set; }
public string Comment { get; set; }
public string PrimaryPort { get; set; }
public string SecondaryPort { get; set; }
public string Server { get; set; }
public int SessionDataSplitCode { get; set; }
}
}

View File

@@ -0,0 +1,27 @@
//using Nest;
using System.Collections.Generic;
namespace EventLogApp
{
internal class EventElementsDictionary<T> : Dictionary<long, T> where T : CodeNameType
{
//private Dictionary<int, T> dictionary = new Dictionary<int, T>();
public EventElementsDictionary() : base() { }
EventElementsDictionary(int capacity) : base(capacity) { }
public void Add(T item)
{
if (typeof(T).IsSubclassOf(typeof(CodeNameGuidType)))
{
if (base.ContainsKey(item.Code))
{
base.Remove(item.Code);
}
}
base.Add(item.Code, item);
}
}
}

View File

@@ -0,0 +1,9 @@
namespace EventLogApp
{
internal class EventType : CodeNameType
{
public EventType(long code, string name) : base(code, name)
{
}
}
}

View File

@@ -0,0 +1,9 @@
namespace EventLogApp
{
internal class MainPort : CodeNameType
{
public MainPort(long code, string name) : base(code, name)
{
}
}
}

View File

@@ -0,0 +1,9 @@
namespace EventLogApp
{
internal class Metadata : CodeNameGuidType
{
public Metadata(long code, string name, string guid) : base(code, name, guid)
{
}
}
}

View File

@@ -0,0 +1,198 @@
//using Nest;
using System;
using System.Collections.Generic;
using System.Data.SQLite;
using System.Globalization;
namespace EventLogApp
{
public class OneEventRecord
{
public NLog.Logger Log;
public long RowID { get; set; }
public DateTime DateTime { get; set; }
public long ConnectID { get; set; }
public long Severity { get; set; }
public string TransactionStatus { get; set; }
public string Transaction { get; set; }
public DateTime TransactionStartTime { get; set; }
public long TransactionMark { get; set; }
public long UserName { get; set; }
public long ComputerName { get; set; }
public long AppName { get; set; }
public long EventID { get; set; }
public string EventType { get; set; }
public string Comment { get; set; }
public int MetadataID;
public long SessionDataSplitCode { get; set; }
public string DataStructure { get; set; }
public string DataString { get; set; }
public long DataType { get; set; }
public long ServerID { get; set; }
public long MainPortID { get; set; }
public long SecondPortID { get; set; }
public long SessionNumber { get; set; }
private string eventString;
public OneEventRecord()
{
Log = NLog.LogManager.GetLogger("CurrentThread");
}
public OneEventRecord(string eventString)
{
CultureInfo provider = CultureInfo.InvariantCulture;
this.eventString = eventString;
List<string> parsedEvent = ParserServices.ParseEventLogString(eventString);
DateTime = DateTime.ParseExact(parsedEvent[0], "yyyyMMddHHmmss", provider);
TransactionStatus = parsedEvent[1];
string transactionString = parsedEvent[2].ToString().Replace("}", "").Replace("{", "");
long transactionDate = From16To10(transactionString.Substring(0, transactionString.IndexOf(",")));
TransactionStartTime = new DateTime().AddYears(2000);
try
{
if (transactionDate != 0)
{
TransactionStartTime = new DateTime().AddSeconds(Convert.ToInt64(transactionDate / 10000));
}
}
catch (Exception ex)
{
Log.Error(ex, this.GetType().ToString());
}
TransactionMark = From16To10(transactionString.Substring(transactionString.IndexOf(",") + 1));
Transaction = parsedEvent[2];
UserName = Convert.ToInt32(parsedEvent[3]);
ComputerName = Convert.ToInt32(parsedEvent[4]);
AppName = Convert.ToInt32(parsedEvent[5]);
EventID = Convert.ToInt32(parsedEvent[7]);
EventType = parsedEvent[8];
Comment = parsedEvent[9].RemoveQuotes();
MetadataID = Convert.ToInt32(parsedEvent[10]);
DataStructure = parsedEvent[11];
DataString = parsedEvent[12].RemoveQuotes();
ServerID = Convert.ToInt32(parsedEvent[13]);
MainPortID = Convert.ToInt32(parsedEvent[14]);
SecondPortID = Convert.ToInt32(parsedEvent[15]);
SessionNumber = Convert.ToInt32(parsedEvent[16]);
if (DataStructure == "{\"U\"}") //'empty reference
{
DataStructure = string.Empty;
}
else if (DataStructure.StartsWith("{"))
{
//'internal representation for different objects.
List<string> ParsedObject = ParserServices.ParseEventLogString(DataStructure);
if (ParsedObject.Count == 2)
{
if (ParsedObject[0] == "\"S\"" || ParsedObject[0] == "\"R\"") //'this is string or reference
DataStructure = ParsedObject[1].RemoveQuotes(); //'string value
}
}
switch (EventType)
{
case "I":
Severity = 1;// '"Information";
break;
case "W":
Severity = 2;// '"Warning"
break;
case "E":
Severity = 3;// '"Error"
break;
case "N":
Severity = 4;// '"Note"
break;
}
}
public OneEventRecord(SQLiteDataReader reader)
{
System.Text.Encoding ANSI = System.Text.Encoding.GetEncoding(1252);
System.Text.Encoding UTF8 = System.Text.Encoding.UTF8;
RowID = (long)reader["rowID"];
Severity = (long)reader["severity"];
ConnectID = (long)reader["connectID"];
DateTime = new DateTime().AddSeconds(Convert.ToInt64((long)reader["date"] / 10000));
TransactionStatus = reader["transactionStatus"].ToString();
TransactionMark = (long)reader["transactionID"];
TransactionStartTime = new DateTime().AddYears(2000);
try
{
if ((long)reader["transactionDate"] != 0)
{
TransactionStartTime = new DateTime().AddSeconds(Convert.ToInt64((long)reader["transactionDate"] / 10000));
}
}
catch (Exception ex)
{
Log.Error(ex, this.GetType().ToString());
}
UserName = (long)reader["userCode"];
ComputerName = (long)reader["computerCode"];
AppName = (long)reader["appCode"];
EventID = (long)reader["eventCode"];
Comment = (string)reader["comment"];
string MDCodes = (string)reader["metadataCodes"];
if (string.IsNullOrEmpty(MDCodes))
{
MetadataID = 0;
}
else if (MDCodes.Contains(","))
{
string MDCode = MDCodes.Split(',')[0];
int.TryParse(MDCode, out MetadataID);
}
else
{
int.TryParse(MDCodes, out MetadataID);
}
string s = string.Empty;
if (!string.IsNullOrEmpty((string)reader["data"]))
{
s = UTF8.GetString(ANSI.GetBytes((string)reader["data"]));
}
DataStructure = s;
DataType = (long)reader["dataType"];
DataString = (string)reader["dataPresentation"];
ServerID = (long)reader["workServerCode"];
MainPortID = (long)reader["primaryPortCode"];
SecondPortID = (long)reader["secondaryPortCode"];
SessionNumber = (long)reader["session"];
SessionDataSplitCode = (long)reader["sessionDataSplitCode"];
Transaction = string.Empty;
EventType = string.Empty;
}
private long From16To10(string str)
{
return long.Parse(str, NumberStyles.HexNumber);
}
}
}

View File

@@ -0,0 +1,9 @@
namespace EventLogApp
{
internal class SecondPort : CodeNameType
{
public SecondPort(long code, string name) : base(code, name)
{
}
}
}

View File

@@ -0,0 +1,9 @@
namespace EventLogApp
{
internal class Server : CodeNameType
{
public Server(long code, string name) : base(code, name)
{
}
}
}

View File

@@ -0,0 +1,22 @@
namespace EventLogApp
{
public static class StringExtension
{
public static string RemoveQuotes(this string str)
{
string retval = str;
if (retval.StartsWith("\""))
{
retval = retval.Substring(1);
}
if (retval.EndsWith("\""))
{
retval = retval.Substring(0, retval.Length - 1);
}
return retval;
}
}
}

View File

@@ -0,0 +1,9 @@
namespace EventLogApp
{
internal class User : CodeNameGuidType
{
public User(long code, string name, string guid) : base(code, name, guid)
{
}
}
}

View File

@@ -0,0 +1,161 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{036F352B-E448-47E0-BB91-F98D4896C6CA}</ProjectGuid>
<OutputType>Exe</OutputType>
<RootNamespace>EventLogApp</RootNamespace>
<AssemblyName>EventLogApp</AssemblyName>
<TargetFrameworkVersion>v4.7.1</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<Deterministic>true</Deterministic>
<NuGetPackageImportStamp>
</NuGetPackageImportStamp>
<TargetFrameworkProfile />
<IsWebBootstrapper>false</IsWebBootstrapper>
<PublishUrl>publish\</PublishUrl>
<Install>true</Install>
<InstallFrom>Disk</InstallFrom>
<UpdateEnabled>false</UpdateEnabled>
<UpdateMode>Foreground</UpdateMode>
<UpdateInterval>7</UpdateInterval>
<UpdateIntervalUnits>Days</UpdateIntervalUnits>
<UpdatePeriodically>false</UpdatePeriodically>
<UpdateRequired>false</UpdateRequired>
<MapFileExtensions>true</MapFileExtensions>
<ApplicationRevision>0</ApplicationRevision>
<ApplicationVersion>1.0.0.%2a</ApplicationVersion>
<UseApplicationTrust>false</UseApplicationTrust>
<BootstrapperEnabled>true</BootstrapperEnabled>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<PlatformTarget>x64</PlatformTarget>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="BouncyCastle.Crypto, Version=1.8.3.0, Culture=neutral, PublicKeyToken=0e99375e54769942">
<HintPath>..\packages\BouncyCastle.1.8.3.1\lib\BouncyCastle.Crypto.dll</HintPath>
</Reference>
<Reference Include="Google.Protobuf, Version=3.6.1.0, Culture=neutral, PublicKeyToken=a7d26565bac4d604, processorArchitecture=MSIL">
<HintPath>..\packages\Google.Protobuf.3.6.1\lib\net45\Google.Protobuf.dll</HintPath>
</Reference>
<Reference Include="MySql.Data, Version=8.0.16.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d, processorArchitecture=MSIL">
<HintPath>..\packages\MySql.Data.8.0.16\lib\net452\MySql.Data.dll</HintPath>
</Reference>
<Reference Include="Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<HintPath>..\packages\Newtonsoft.Json.12.0.2\lib\net45\Newtonsoft.Json.dll</HintPath>
</Reference>
<Reference Include="NLog, Version=4.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c, processorArchitecture=MSIL">
<HintPath>..\packages\NLog.4.6.2\lib\net45\NLog.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.ComponentModel" />
<Reference Include="System.ComponentModel.DataAnnotations" />
<Reference Include="System.Configuration" />
<Reference Include="System.Configuration.Install" />
<Reference Include="System.Core" />
<Reference Include="System.Data.SQLite, Version=1.0.110.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=MSIL">
<HintPath>..\packages\System.Data.SQLite.Core.1.0.110.0\lib\net451\System.Data.SQLite.dll</HintPath>
</Reference>
<Reference Include="System.Drawing" />
<Reference Include="System.Drawing.Design" />
<Reference Include="System.IO.Compression" />
<Reference Include="System.Management" />
<Reference Include="System.Runtime.Serialization" />
<Reference Include="System.ServiceModel" />
<Reference Include="System.ServiceProcess" />
<Reference Include="System.Transactions" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="EventElements\EventElementsDictionary.cs" />
<Compile Include="EventElements\Application.cs" />
<Compile Include="EventElements\Computer.cs" />
<Compile Include="EventElements\CodeNameGuidType.cs" />
<Compile Include="EventElements\CodeNameType.cs" />
<Compile Include="ConfigSetting.cs" />
<Compile Include="ConfigSettings.cs" />
<Compile Include="ElasticSearchFieldSynonymsClass.cs" />
<Compile Include="EventElements\ESRecord.cs" />
<Compile Include="EventElements\StringExtension.cs" />
<Compile Include="EventLogProcessor.cs" />
<Compile Include="EventLogService.cs">
<SubType>Component</SubType>
</Compile>
<Compile Include="EventLogService.Designer.cs">
<DependentUpon>EventLogService.cs</DependentUpon>
</Compile>
<Compile Include="EventLogServiceInstaller.cs">
<SubType>Component</SubType>
</Compile>
<Compile Include="EventLogServiceInstaller.Designer.cs">
<DependentUpon>EventLogServiceInstaller.cs</DependentUpon>
</Compile>
<Compile Include="EventElements\EventType.cs" />
<Compile Include="InfobaseSetting.cs" />
<Compile Include="EventLogLoaderService.cs" />
<Compile Include="EventElements\OneEventRecord.cs" />
<Compile Include="EventElements\Metadata.cs" />
<Compile Include="EventElements\MainPort.cs" />
<Compile Include="ParserServices.cs" />
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="EventElements\User.cs" />
<Compile Include="EventElements\Server.cs" />
<Compile Include="EventElements\SecondPort.cs" />
<Compile Include="ReadParameters.cs" />
</ItemGroup>
<ItemGroup>
<None Include="App.config" />
<Content Include="NLog.config">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<None Include="NLog.xsd">
<SubType>Designer</SubType>
</None>
<None Include="packages.config" />
</ItemGroup>
<ItemGroup>
<BootstrapperPackage Include=".NETFramework,Version=v4.7.1">
<Visible>False</Visible>
<ProductName>Microsoft .NET Framework 4.7.1 %28x86 and x64%29</ProductName>
<Install>true</Install>
</BootstrapperPackage>
<BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
<Visible>False</Visible>
<ProductName>.NET Framework 3.5 SP1</ProductName>
<Install>false</Install>
</BootstrapperPackage>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Import Project="..\packages\System.Data.SQLite.Core.1.0.110.0\build\net451\System.Data.SQLite.Core.targets" Condition="Exists('..\packages\System.Data.SQLite.Core.1.0.110.0\build\net451\System.Data.SQLite.Core.targets')" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
<ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('..\packages\System.Data.SQLite.Core.1.0.110.0\build\net451\System.Data.SQLite.Core.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\System.Data.SQLite.Core.1.0.110.0\build\net451\System.Data.SQLite.Core.targets'))" />
</Target>
</Project>

View File

@@ -0,0 +1,338 @@
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.IO;
using System.Threading;
namespace EventLogApp
{
public class EventLogLoaderService
{
List<EventLogProcessor> ListOfProcessors = new List<EventLogProcessor>();
List<Thread> ArrayThread;
public ConfigSetting ConfigSettingObj = new ConfigSetting();
string ConnectionString;
string DBType;
bool ItIsMySQL;
bool ItIsMSSQL;
bool ItIsElasticSearch;
public int SleepTime = 60 * 1000; //1 мин
public Thread WorkerThread;
private NLog.Logger Log;
public EventLogLoaderService()
{
//InitializeComponent();
Directory.SetCurrentDirectory(AppDomain.CurrentDomain.BaseDirectory);
Log = NLog.LogManager.GetLogger("CurrentThread");
ArrayThread = new List<Thread>();
WorkerThread = new Thread(DoWork);
WorkerThread.SetApartmentState(ApartmentState.STA);
}
public void DoWork()
{
if (!LoadConfigSetting())
{
Log.Error("Error while working with config.json file in application folder");
Environment.Exit(-1);
}
CreateTables();
foreach (EventLogProcessor IB in ListOfProcessors)
{
try
{
IB.GetInfobaseIDFromDatabase();
}
catch (Exception ex)
{
Log.Error(ex, $"Error occurred while getting infobase ID from target database ({IB.InfobaseName})");
continue;
}
try
{
var Thead = new Thread(IB.DoWork)
{
IsBackground = false
};
Thead.Start();
ArrayThread.Add(Thead);
//-------------------------------------
//IB.DoWork();
}
catch (Exception ex)
{
Log.Error(ex, $"Error occurred while starting new thread ({IB.InfobaseName})");
}
}
}
public void CreateTables()
{
try
{
if (ItIsMSSQL)
{
SqlConnection objConn = new SqlConnection(ConnectionString);
objConn.Open();
var command = new SqlCommand(@"IF NOT EXISTS (select * from sysobjects where id = object_id(N'Events'))
BEGIN
CREATE TABLE[dbo].[Events]([InfobaseCode] int Not NULL, [DateTime][datetime] Not NULL,
[TransactionStatus][varchar](1) NULL,
[TransactionStartTime][datetime] NULL,
[TransactionMark] bigint NULL,
[Transaction][varchar](100) NULL,
[UserName] int NULL,
[ComputerName] int NULL,
[AppName] Int NULL,
[EventID] int NULL,
[EventType][varchar](1) NULL,
[Comment][nvarchar](max) NULL,
[MetadataID] int NULL,
[DataStructure][nvarchar](max) NULL,
[DataString][nvarchar](max) NULL,
[ServerID] int NULL,
[MainPortID] int NULL,
[SecondPortID] int NULL,
[Seance] int NULL);
CREATE CLUSTERED INDEX[CIX_Events] ON[dbo].[Events]([InfobaseCode], [DateTime])
END", objConn);
command.ExecuteNonQuery();
command.CommandText = "IF NOT EXISTS (select * from sysobjects where id = object_id(N'Infobases'))" + Environment.NewLine +
" CREATE TABLE [dbo].[Infobases] ([Guid] [char](40) NOT NULL, [Code] int NOT NULL, [Name] [char](100))" + Environment.NewLine +
" IF NOT EXISTS (select * from sys.indexes where object_id = object_id(N'Infobases') AND Name = 'ClusteredIndex')" + Environment.NewLine +
" CREATE UNIQUE CLUSTERED INDEX [ClusteredIndex] ON [dbo].[Infobases] ([Guid] ASC);";
command.ExecuteNonQuery();
command.CommandText =
"IF NOT EXISTS (select * from sysobjects where id = object_id(N'Users'))" + Environment.NewLine +
"CREATE TABLE [dbo].[Users]([InfobaseCode] int NOT NULL, [Code] int NOT NULL, [Name] [nvarchar](100), [Guid] [varchar](40));" + Environment.NewLine +
"IF NOT EXISTS (select * from sys.indexes where object_id = object_id(N'Users') AND Name = 'ClusteredIndex')" + Environment.NewLine +
"CREATE UNIQUE CLUSTERED INDEX [ClusteredIndex] ON [dbo].[Users] ([InfobaseCode] ASC, [Code] ASC);" + Environment.NewLine +
"" +
"IF NOT EXISTS (select * from sysobjects where id = object_id(N'Metadata'))" + Environment.NewLine +
"CREATE TABLE [dbo].[Metadata]([InfobaseCode] int NOT NULL, [Code] int NOT NULL, [Name] [nvarchar](100), [Guid] [varchar](40));" + Environment.NewLine +
"IF NOT EXISTS (select * from sys.indexes where object_id = object_id(N'Metadata') AND Name = 'ClusteredIndex')" + Environment.NewLine +
"CREATE UNIQUE CLUSTERED INDEX [ClusteredIndex] ON [dbo].[Metadata] ([InfobaseCode] ASC, [Code] ASC);" + Environment.NewLine +
"" +
"IF NOT EXISTS (select * from sysobjects where id = object_id(N'Computers'))" + Environment.NewLine +
"CREATE TABLE [dbo].[Computers]([InfobaseCode] int NOT NULL, [Code] int NOT NULL, [Name] [nvarchar](100));" + Environment.NewLine +
"IF NOT EXISTS (select * from sys.indexes where object_id = object_id(N'Computers') AND Name = 'ClusteredIndex')" + Environment.NewLine +
"CREATE UNIQUE CLUSTERED INDEX [ClusteredIndex] ON [dbo].[Computers] ([InfobaseCode] ASC, [Code] ASC);" + Environment.NewLine +
"" +
"IF NOT EXISTS (select * from sysobjects where id = object_id(N'Applications'))" + Environment.NewLine +
"CREATE TABLE [dbo].[Applications]([InfobaseCode] int NOT NULL, [Code] int NOT NULL,[Name] [nvarchar](100));" + Environment.NewLine +
"IF NOT EXISTS (select * from sys.indexes where object_id = object_id(N'Applications') AND Name = 'ClusteredIndex')" + Environment.NewLine +
"CREATE UNIQUE CLUSTERED INDEX [ClusteredIndex] ON [dbo].[Applications] ([InfobaseCode] ASC, [Code] ASC);" + Environment.NewLine +
"" +
"IF NOT EXISTS (select * from sysobjects where id = object_id(N'EventsType'))" + Environment.NewLine +
"CREATE TABLE [dbo].[EventsType]([InfobaseCode] int NOT NULL, [Code] int NOT NULL, [Name] [nvarchar](max));" + Environment.NewLine +
"IF NOT EXISTS (select * from sys.indexes where object_id = object_id(N'EventsType') AND Name = 'ClusteredIndex')" + Environment.NewLine +
"CREATE UNIQUE CLUSTERED INDEX [ClusteredIndex] ON [dbo].[EventsType] ([InfobaseCode] ASC, [Code] ASC);" + Environment.NewLine +
"" +
"IF NOT EXISTS (select * from sysobjects where id = object_id(N'Servers'))" + Environment.NewLine +
"CREATE TABLE [dbo].[Servers]([InfobaseCode] int NOT NULL, [Code] int NOT NULL, [Name] [nvarchar](100));" + Environment.NewLine +
"IF NOT EXISTS (select * from sys.indexes where object_id = object_id(N'Servers') AND Name = 'ClusteredIndex')" + Environment.NewLine +
"CREATE UNIQUE CLUSTERED INDEX [ClusteredIndex] ON [dbo].[Servers] ([InfobaseCode] ASC, [Code] ASC);" + Environment.NewLine +
"" +
"IF NOT EXISTS (select * from sysobjects where id = object_id(N'MainPorts'))" + Environment.NewLine +
"CREATE TABLE [dbo].[MainPorts]([InfobaseCode] int NOT NULL, [Code] int NOT NULL, [Name] [nvarchar](100));" + Environment.NewLine +
"IF NOT EXISTS (select * from sys.indexes where object_id = object_id(N'MainPorts') AND Name = 'ClusteredIndex')" + Environment.NewLine +
"CREATE UNIQUE CLUSTERED INDEX [ClusteredIndex] ON [dbo].[MainPorts] ([InfobaseCode] ASC, [Code] ASC);" + Environment.NewLine +
"" +
"IF NOT EXISTS (select * from sysobjects where id = object_id(N'SecondPorts'))" + Environment.NewLine +
"CREATE TABLE [dbo].[SecondPorts]([InfobaseCode] int NOT NULL, [Code] int NOT NULL, [Name] [nvarchar](100));" + Environment.NewLine +
"IF NOT EXISTS (select * from sys.indexes where object_id = object_id(N'SecondPorts') AND Name = 'ClusteredIndex')" + Environment.NewLine +
"CREATE UNIQUE CLUSTERED INDEX [ClusteredIndex] ON [dbo].[SecondPorts] ([InfobaseCode] ASC, [Code] ASC);";
command.ExecuteNonQuery();
command.CommandText = "SELECT TOP 1 * FROM Events";
command.ExecuteReader();
command.Dispose();
objConn.Close();
objConn.Dispose();
}
else if (ItIsMySQL)
{
MySql.Data.MySqlClient.MySqlConnection objConn = new MySql.Data.MySqlClient.MySqlConnection(ConnectionString);
objConn.Open();
string DBName = objConn.Database;
MySql.Data.MySqlClient.MySqlCommand command = new MySql.Data.MySqlClient.MySqlCommand
{
Connection = objConn,
CommandText = "CREATE TABLE IF NOT EXISTS `Events` (`InfobaseCode` int(11) NOT NULL, `DateTime` int(11) NOT NULL," +
"`TransactionStatus` varchar(1) NULL, `TransactionStartTime` datetime NULL, " +
"`TransactionMark` bigint NULL, `Transaction` varchar(100) NULL, `UserName` int(11) NULL, `ComputerName` int(11) NULL, " +
"`AppName` int(11) NULL, `EventID` int(11) NULL, `EventType` varchar(1) NULL, " +
"`Comment` text NULL, `MetadataID` int(11) NULL, `DataStructure` text NULL, `DataString` text NULL, " +
"`ServerID` int(11) NULL, `MainPortID` int(11) NULL, `SecondPortID` int(11) NULL, `Seance` int(11) NULL" +
") ENGINE=InnoDB DEFAULT CHARSET=utf8;"
};
command.ExecuteNonQuery();
command.CommandText = "CREATE TABLE IF NOT EXISTS `Infobases` (`Guid` varchar(40) NOT NULL, `Code` int(11) NOT NULL, `Name` varchar(100)," +
"PRIMARY KEY `Guid` (`Guid`));";
command.ExecuteNonQuery();
command.CommandText =
"CREATE TABLE IF NOT EXISTS `Users`(`InfobaseCode` int(11) NOT NULL, `Code` int(11) NOT NULL, `Name` varchar(100), `Guid` varchar(40), PRIMARY KEY (`InfobaseCode`, `Code`));" + Environment.NewLine +
"" +
"CREATE TABLE IF NOT EXISTS `Metadata`(`InfobaseCode` int(11) NOT NULL, `Code` int(11) NOT NULL, `Name` varchar(100), `Guid` varchar(40), PRIMARY KEY (`InfobaseCode`, `Code`));" + Environment.NewLine +
"" +
"CREATE TABLE IF NOT EXISTS `Computers`(`InfobaseCode` int(11) NOT NULL, `Code` int(11) NOT NULL, `Name` varchar(100), PRIMARY KEY (`InfobaseCode`, `Code`));" + Environment.NewLine +
"" +
"CREATE TABLE IF NOT EXISTS `Applications`(`InfobaseCode` int(11) NOT NULL, `Code` int(11) NOT NULL, `Name` varchar(100), PRIMARY KEY (`InfobaseCode`, `Code`));" + Environment.NewLine +
"" +
"CREATE TABLE IF NOT EXISTS `EventsType`(`InfobaseCode` int(11) NOT NULL, `Code` int(11) NOT NULL, `Name` text, PRIMARY KEY (`InfobaseCode`, `Code`));" + Environment.NewLine +
"" +
"CREATE TABLE IF NOT EXISTS `Servers`(`InfobaseCode` int(11) NOT NULL, `Code` int(11) NOT NULL, `Name` varchar(100), PRIMARY KEY (`InfobaseCode`, `Code`));" + Environment.NewLine +
"" +
"CREATE TABLE IF NOT EXISTS `MainPorts`(`InfobaseCode` int(11) NOT NULL, `Code` int(11) NOT NULL, `Name` varchar(100), PRIMARY KEY (`InfobaseCode`, `Code`));" + Environment.NewLine +
"" +
"CREATE TABLE IF NOT EXISTS `SecondPorts`(`InfobaseCode` int(11) NOT NULL, `Code` int(11) NOT NULL, `Name` varchar(100), PRIMARY KEY (`InfobaseCode`, `Code`));";
command.ExecuteNonQuery();
command.Dispose();
objConn.Close();
objConn.Dispose();
}
Log.Info("Target database tables have been verified!");
}
catch (Exception ex)
{
Log.Error(ex, "Error occurred while during target database tables verification");
}
}
public bool LoadConfigSetting()
{
try
{
string PathConfigFile = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "config.json");
if (File.Exists(PathConfigFile))
{
ConfigSettingObj = ConfigSettings.LoadConfigSettingFromFile(PathConfigFile);
ConnectionString = ConfigSettingObj.ConnectionString;
DBType = ConfigSettingObj.DBType;
if (DBType == "MySQL")
{
ItIsMySQL = true;
}
else if (DBType == "MS SQL Server")
{
ItIsMSSQL = true;
}
else if (DBType == "ElasticSearch")
{
ItIsElasticSearch = true;
}
this.SleepTime = this.ConfigSettingObj.RepeatTime * 1000;
foreach (InfobaseSetting IBConfig in ConfigSettingObj.Infobases)
{
string IB_ID = IBConfig.DatabaseID;
string IB_Name = IBConfig.DatabaseName;
string IB_Catalog = IBConfig.DatabaseCatalog;
EventLogProcessor EventLogProcessorObj = new EventLogProcessor
{
Log = NLog.LogManager.GetLogger("CurrentThread"),
InfobaseGuid = IB_ID,
InfobaseName = IB_Name,
Catalog = IB_Catalog,
ConnectionString = this.ConnectionString,
SleepTime = this.SleepTime,
ItIsMSSQL = this.ItIsMSSQL,
ItIsMySQL = this.ItIsMySQL,
ItIsElasticSearch = this.ItIsElasticSearch,
ESIndexName = this.ConfigSettingObj.ESIndexName,
ESServerName = IBConfig.ESServerName,
ESUseSynonymsForFieldsNames = this.ConfigSettingObj.ESUseSynonymsForFieldsNames,
ESFieldSynonyms = this.ConfigSettingObj.ESFieldSynonyms
};
try
{
EventLogProcessorObj.LoadEventsStartingAt = DateTime.Parse(IBConfig.StartDate);
}
catch (Exception ex)
{
EventLogProcessorObj.LoadEventsStartingAt = new DateTime(1900, 1, 1);
Log.Error(ex, this.GetType().ToString());
}
ListOfProcessors.Add(EventLogProcessorObj);
}
return true;
}
else
{
Log.Error("File config.json was not found!");
return false;
}
}
catch (Exception ex)
{
Log.Error(ex, "Parameters cannot be load from config.json file (it may be corrupted)");
throw ex;
}
}
public void SubStart()
{
WorkerThread.Start();
}
public void SubStop()
{
WorkerThread.Abort();
}
}
}

File diff suppressed because it is too large Load Diff

37
EventLogApp/EventLogService.Designer.cs generated Normal file
View File

@@ -0,0 +1,37 @@
namespace EventLogApp
{
partial class EventLogService
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Component Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
components = new System.ComponentModel.Container();
this.ServiceName = "EventLogService";
}
#endregion
}
}

View File

@@ -0,0 +1,32 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Threading.Tasks;
namespace EventLogApp
{
partial class EventLogService : ServiceBase
{
public EventLogService()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
EventLogLoaderService service = new EventLogLoaderService();
service.DoWork();
}
protected override void OnStop()
{
// TODO: Add code here to perform any tear-down necessary to stop your service.
}
}
}

View File

@@ -0,0 +1,36 @@
namespace EventLogApp
{
partial class EventLogServiceInstaller
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Component Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
components = new System.ComponentModel.Container();
}
#endregion
}
}

View File

@@ -0,0 +1,33 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Configuration.Install;
using System.Linq;
using System.ServiceProcess;
using System.Threading.Tasks;
namespace EventLogApp
{
[RunInstaller(true)]
public partial class EventLogServiceInstaller : System.Configuration.Install.Installer
{
ServiceInstaller serviceInstaller;
ServiceProcessInstaller processInstaller;
public EventLogServiceInstaller()
{
InitializeComponent();
serviceInstaller = new ServiceInstaller();
processInstaller = new ServiceProcessInstaller();
processInstaller.Account = ServiceAccount.LocalSystem;
serviceInstaller.StartType = ServiceStartMode.Manual;
serviceInstaller.ServiceName = "EventLogService";
Installers.Add(processInstaller);
Installers.Add(serviceInstaller);
}
}
}

View File

@@ -0,0 +1,12 @@
namespace EventLogApp
{
public class InfobaseSetting
{
public string ESServerName { get; set; }
public string DatabaseID { get; set; }
public string DatabaseName { get; set; }
public string DatabaseCatalog { get; set; }
public string StartDate { get; set; }
public bool Found { get; set; }
}
}

41
EventLogApp/NLog.config Normal file
View File

@@ -0,0 +1,41 @@
<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"
autoReload="true"
throwExceptions="false"
internalLogLevel="Off" internalLogFile="c:\temp\nlog-internal.log">
<!-- optional, add some variables
https://github.com/nlog/NLog/wiki/Configuration-file#variables
-->
<variable name="myvar" value="myvalue"/>
<!--
See https://github.com/nlog/nlog/wiki/Configuration-file
for information on customizing logging rules and outputs.
-->
<targets>
<!--
add your targets here
See https://github.com/nlog/NLog/wiki/Targets for possible targets.
See https://github.com/nlog/NLog/wiki/Layout-Renderers for the possible layout renderers.
-->
<!--
Write events to a file with the date in the filename.
<target xsi:type="File" name="f" fileName="${basedir}/logs/${shortdate}.log"
layout="${longdate} ${uppercase:${level}} ${message}" />
-->
</targets>
<rules>
<!-- add your logging rules here -->
<!--
Write all events with minimal level of Debug (So Debug, Info, Warn, Error and Fatal, but not Trace) to "f"
<logger name="*" minlevel="Debug" writeTo="f" />
-->
</rules>
</nlog>

3481
EventLogApp/NLog.xsd Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,51 @@
using System;
using System.Collections.Generic;
namespace EventLogApp
{
class ParserServices
{
public static List<string> ParseEventLogString(string Text)
{
List<string> ArrayLines = new List<string>();
var Text2 = Text.Substring(1, Text.EndsWith(",") ? Text.Length - 3 : Text.Length - 2) + ",";
var Delim = Text2.IndexOf(",");
string str = "";
while (Delim > 0)
{
str = str + Text2.Substring(0, Delim).Trim();
Text2 = Text2.Substring(Delim + 1);
if (CountSubstringInString(str, "{") == CountSubstringInString(str, "}") && Math.IEEERemainder(CountSubstringInString(str, "\""), 2) == 0)
{
if (str.StartsWith("\"") && str.EndsWith("\""))
{
str = str.Substring(1, str.Length - 2);
}
ArrayLines.Add(str);
str = "";
}
else
{
str = str + ",";
}
Delim = Text2.IndexOf(",");
}
return ArrayLines;
}
public static int CountSubstringInString(string Str, string SubStr)
{
return (Str.Length - Str.Replace(SubStr, "").Length) / SubStr.Length;
}
}
}

26
EventLogApp/Program.cs Normal file
View File

@@ -0,0 +1,26 @@
using System.ServiceProcess;
namespace EventLogApp
{
class Program
{
static void Main(string[] args)
{
EventLogLoaderService service = new EventLogLoaderService();
service.DoWork();
//------------------------------------------------------
//ServiceBase[] ServicesToRun;
//ServicesToRun = new ServiceBase[]
//{
// new EventLogService()
//};
//ServiceBase.Run(ServicesToRun);
}
}
}

View File

@@ -0,0 +1,36 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("EventLogApp")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("EventLogApp")]
[assembly: AssemblyCopyright("Copyright © 2019")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("036f352b-e448-47e0-bb91-f98d4896c6ca")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

View File

@@ -0,0 +1,10 @@
namespace EventLogApp
{
internal class ReadParameters
{
public int InfobaseId { get; set; }
public long CurrentPosition { get; set; }
public string CurrentFilename { get; set; }
public long LastEventNumber83 { get; set; }
}
}

39
EventLogApp/config.json Normal file
View File

@@ -0,0 +1,39 @@
{
"ConnectionString": "Data Source=MSSQLSERVER;Server=srv-1cdata;Database=log1c;Password=1ccthdth;User ID=sa;",
"DBType": "MS SQL Server",
"RepeatTime": 60,
"ESIndexName": "event-log",
"ESUseSynonymsForFieldsNames": false,
"ESFieldSynonyms": {
"ServerName": "Сервер1С",
"DatabaseName": "ИнформационнаяБаза",
"RowID": "НомерСтроки",
"Severity": "УровеньСобытия",
"DateTime": "ДатаВремя",
"ConnectID": "НомерСоединения",
"DataType": "ТипДанных",
"SessionNumber": "НомерСессии",
"DataStructure": "СтруктураДанных",
"DataString": "ПредставлениеДанных",
"Comment": "Комментарий",
"SessionDataSplitCode": "Разделитель",
"EventType": "ТипСобытия",
"Metadata": "Метаданные",
"Computer": "Компьютер",
"PrimaryPort": "ОсновнойПорт",
"Server": "СерверПриложений",
"SecondaryPort": "ВторичныйПорт",
"Application": "Приложение",
"UserName": "ИмяПользователя"
},
"Infobases": [
{
"ESServerName": "",
"DatabaseID": "221faa36-9bda-4aa5-a5d6-a425e10d2955",
"DatabaseName": "un_acc30",
"DatabaseCatalog": "e:\\dev\\\1cLog\\1Cv8Log\\",
"StartDate": "",
"Found": false
}
]
}

View File

@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="BouncyCastle" version="1.8.3.1" targetFramework="net472" />
<package id="Google.Protobuf" version="3.6.1" targetFramework="net472" />
<package id="MySql.Data" version="8.0.16" targetFramework="net452" />
<package id="Newtonsoft.Json" version="12.0.2" targetFramework="net472" />
<package id="NLog" version="4.6.2" targetFramework="net472" />
<package id="NLog.Config" version="4.6.2" targetFramework="net472" />
<package id="NLog.Schema" version="4.6.2" targetFramework="net472" />
<package id="System.Data.SQLite.Core" version="1.0.110.0" targetFramework="net452" />
</packages>

View File

@@ -1,7 +1,7 @@
 
Microsoft Visual Studio Solution File, Format Version 12.00 Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 14 # Visual Studio 15
VisualStudioVersion = 14.0.25420.1 VisualStudioVersion = 15.0.28307.852
MinimumVisualStudioVersion = 10.0.40219.1 MinimumVisualStudioVersion = 10.0.40219.1
Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "EventLogLoaderDebug", "EventLogLoader\EventLogLoaderDebug.vbproj", "{2CE569B2-834D-4FE6-A23F-ACC68E8BDA9E}" Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "EventLogLoaderDebug", "EventLogLoader\EventLogLoaderDebug.vbproj", "{2CE569B2-834D-4FE6-A23F-ACC68E8BDA9E}"
EndProject EndProject
@@ -9,6 +9,8 @@ Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "EventLogLoaderManager", "Ev
EndProject EndProject
Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "EventLogLoaderService", "EventLogLoaderService\EventLogLoaderService.vbproj", "{F7EF5930-B310-4697-B522-2325EAF247F2}" Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "EventLogLoaderService", "EventLogLoaderService\EventLogLoaderService.vbproj", "{F7EF5930-B310-4697-B522-2325EAF247F2}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EventLogApp", "EventLogApp\EventLogApp.csproj", "{036F352B-E448-47E0-BB91-F98D4896C6CA}"
EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU Debug|Any CPU = Debug|Any CPU
@@ -49,8 +51,23 @@ Global
{F7EF5930-B310-4697-B522-2325EAF247F2}.Release|Mixed Platforms.Build.0 = Release|x86 {F7EF5930-B310-4697-B522-2325EAF247F2}.Release|Mixed Platforms.Build.0 = Release|x86
{F7EF5930-B310-4697-B522-2325EAF247F2}.Release|x86.ActiveCfg = Release|x86 {F7EF5930-B310-4697-B522-2325EAF247F2}.Release|x86.ActiveCfg = Release|x86
{F7EF5930-B310-4697-B522-2325EAF247F2}.Release|x86.Build.0 = Release|x86 {F7EF5930-B310-4697-B522-2325EAF247F2}.Release|x86.Build.0 = Release|x86
{036F352B-E448-47E0-BB91-F98D4896C6CA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{036F352B-E448-47E0-BB91-F98D4896C6CA}.Debug|Any CPU.Build.0 = Debug|Any CPU
{036F352B-E448-47E0-BB91-F98D4896C6CA}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{036F352B-E448-47E0-BB91-F98D4896C6CA}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{036F352B-E448-47E0-BB91-F98D4896C6CA}.Debug|x86.ActiveCfg = Debug|Any CPU
{036F352B-E448-47E0-BB91-F98D4896C6CA}.Debug|x86.Build.0 = Debug|Any CPU
{036F352B-E448-47E0-BB91-F98D4896C6CA}.Release|Any CPU.ActiveCfg = Release|Any CPU
{036F352B-E448-47E0-BB91-F98D4896C6CA}.Release|Any CPU.Build.0 = Release|Any CPU
{036F352B-E448-47E0-BB91-F98D4896C6CA}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{036F352B-E448-47E0-BB91-F98D4896C6CA}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{036F352B-E448-47E0-BB91-F98D4896C6CA}.Release|x86.ActiveCfg = Release|Any CPU
{036F352B-E448-47E0-BB91-F98D4896C6CA}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE
EndGlobalSection EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {5078F9AA-9CF7-46CF-BF5C-57C79E90A04A}
EndGlobalSection
EndGlobal EndGlobal