Skip to content
This repository was archived by the owner on Nov 2, 2018. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
123 changes: 29 additions & 94 deletions Source/EasyGelf.Core/EasyGelf.Core.csproj
Original file line number Diff line number Diff line change
@@ -1,101 +1,36 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{B928D694-5633-4F00-B70F-23F6E5F3A2DB}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>EasyGelf.Core</RootNamespace>
<AssemblyName>EasyGelf.Core</AssemblyName>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\</SolutionDir>
<RestorePackages>true</RestorePackages>
<TargetFrameworkProfile />
<TargetFrameworks>netstandard1.5;net451</TargetFrameworks>
<IsPackagable>false</IsPackagable>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>

<PropertyGroup Condition="'$(Configuration)|$(TargetFramework)|$(Platform)'=='Debug|netstandard1.5|AnyCPU'">
<DefineConstants>TRACE;DEBUG;NETSTANDARD</DefineConstants>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>

<PropertyGroup Condition="'$(Configuration)|$(TargetFramework)|$(Platform)'=='Release|netstandard1.5|AnyCPU'">
<DefineConstants>TRACE;NETSTANDARD</DefineConstants>
</PropertyGroup>

<ItemGroup>
<Reference Include="RabbitMQ.Client">
<HintPath>..\packages\RabbitMQ.Client.3.5.0\lib\net40\RabbitMQ.Client.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Data" />
<PackageReference Include="RabbitMQ.Client" Version="4.1.3" />
<PackageReference Include="System.Net.Http" Version="4.3.2" />
<PackageReference Include="System.Net.Requests">
<Version>4.3.0</Version>
</PackageReference>
</ItemGroup>
<ItemGroup>
<Compile Include="..\Version.cs">
<Link>Properties\Version.cs</Link>
</Compile>
<Compile Include="CoreExtentions.cs" />
<Compile Include="Encoders\ChunkingEncoder.cs" />
<Compile Include="Encoders\CompositeEncoder.cs" />
<Compile Include="Encoders\MessageBasedIdGenerator.cs" />
<Compile Include="GelfMessageBuilder.cs" />
<Compile Include="Encoders\IChunkedMessageIdGenerator.cs" />
<Compile Include="GelfMessageSerializer.cs" />
<Compile Include="ProcessHelpers.cs" />
<Compile Include="SilentLogger.cs" />
<Compile Include="GelfLevel.cs" />
<Compile Include="GelfMessage.cs" />
<Compile Include="Encoders\ITransportEncoder.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Encoders\GZipEncoder.cs" />
<Compile Include="SimpleJson.cs" />
<Compile Include="Transports\Amqp\AmqpTransport.cs" />
<Compile Include="Transports\Amqp\AmqpTransportConfiguration.cs" />
<Compile Include="Transports\BufferedTransport.cs" />
<Compile Include="Transports\CannotConnectException.cs" />
<Compile Include="Transports\DisconnectedException.cs" />
<Compile Include="Transports\Http\HttpTransport.cs" />
<Compile Include="Transports\Http\HttpTransportConfiguration.cs" />
<Compile Include="Transports\ITransport.cs" />
<Compile Include="Transports\RetryingTransport.cs" />
<Compile Include="Transports\SendFailedException.cs" />
<Compile Include="Transports\IpTransportConfiguration.cs" />
<Compile Include="Transports\Tcp\ITcpConnection.cs" />
<Compile Include="Transports\Tcp\TcpConnection.cs" />
<Compile Include="Transports\Tcp\TcpSslConnection.cs" />
<Compile Include="Transports\Tcp\TcpTransport.cs" />
<Compile Include="Transports\Tcp\TcpTransportConfiguration.cs" />
<Compile Include="Transports\Tcp\TcpTransportFactory.cs" />
<Compile Include="Transports\Udp\UdpTransport.cs" />
<Compile Include="Transports\Udp\UdpTransportConfiguration.cs" />
</ItemGroup>
<ItemGroup>
<None Include="packages.config" />

<ItemGroup Condition="'$(TargetFramework)' == 'netstandard1.5'">
<PackageReference Include="System.Diagnostics.Process">
<Version>4.3.0</Version>
</PackageReference>
<PackageReference Include="System.Reflection.TypeExtensions">
<Version>4.3.0</Version>
</PackageReference>
<PackageReference Include="System.Runtime.Serialization.Primitives">
<Version>4.3.0</Version>
</PackageReference>
</ItemGroup>
<ItemGroup />
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
<ErrorText>This project references NuGet package(s) that are missing on this computer. Enable 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('$(SolutionDir)\.nuget\NuGet.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\.nuget\NuGet.targets'))" />
</Target>
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>
</Project>

13 changes: 9 additions & 4 deletions Source/EasyGelf.Core/Encoders/ChunkingEncoder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@

namespace EasyGelf.Core.Encoders
{
using System.Threading.Tasks;

public sealed class ChunkingEncoder : ITransportEncoder
{
private const int HeaderSize = 12;
Expand All @@ -19,18 +21,19 @@ public ChunkingEncoder(IChunkedMessageIdGenerator idGenerator, int maxSize)
this.maxSize = maxSize;
}

public IEnumerable<byte[]> Encode(byte[] bytes)
public async Task<IEnumerable<byte[]>> Encode(byte[] bytes)
{
if (bytes.Length <= maxSize)
yield return bytes;
return new[] { bytes };
else
{
var messageChunkSize = maxSize - HeaderSize;
var chunksCount = bytes.Length / messageChunkSize + 1;
if(chunksCount > MaxChunkCount)
throw new ArgumentOutOfRangeException("bytes");
var remainingBytes = bytes.Length;
var messageId = idGenerator.GenerateId(bytes);
var messageId = await idGenerator.GenerateId(bytes);
var result = new List<byte[]>();
for (var chunkSequenceNumber = 0; chunkSequenceNumber < chunksCount; ++chunkSequenceNumber)
{
var chunkOffset = chunkSequenceNumber * messageChunkSize;
Expand All @@ -43,10 +46,12 @@ public IEnumerable<byte[]> Encode(byte[] bytes)
stream.WriteByte((byte)chunkSequenceNumber);
stream.WriteByte((byte)chunksCount);
stream.Write(bytes, chunkOffset, chunkBytes);
yield return stream.ToArray();
result.Add(stream.ToArray());
}
remainingBytes -= chunkBytes;
}

return result;
}
}
}
Expand Down
9 changes: 7 additions & 2 deletions Source/EasyGelf.Core/Encoders/CompositeEncoder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@

namespace EasyGelf.Core.Encoders
{
using System.Threading.Tasks;

public sealed class CompositeEncoder : ITransportEncoder
{
private readonly ITransportEncoder[] encoders;
Expand All @@ -12,9 +14,12 @@ public CompositeEncoder(params ITransportEncoder[] encoders)
this.encoders = encoders;
}

public IEnumerable<byte[]> Encode(byte[] bytes)
public async Task<IEnumerable<byte[]>> Encode(byte[] bytes)
{
return encoders.Aggregate((IEnumerable<byte[]>) new List<byte[]> {bytes}, (current, encoder) => current.SelectMany(encoder.Encode));

return encoders.Aggregate(
(IEnumerable<byte[]>)new List<byte[]> { bytes },
(current, encoder) => current.SelectMany(x => encoder.Encode(x).Result));
}
}
}
9 changes: 7 additions & 2 deletions Source/EasyGelf.Core/Encoders/GZipEncoder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,22 @@

namespace EasyGelf.Core.Encoders
{
using System.Threading.Tasks;

public sealed class GZipEncoder : ITransportEncoder
{
public IEnumerable<byte[]> Encode(byte[] bytes)
public async Task<IEnumerable<byte[]>> Encode(byte[] bytes)
{
var result = new List<byte[]>();
using (var input = new MemoryStream(bytes))
using (var output = new MemoryStream())
{
using (var compressed = new GZipStream(output, CompressionMode.Compress))
CopyTo(input, compressed);
yield return output.ToArray();
result.Add(output.ToArray());
}

return result;
}

private static void CopyTo(Stream source, Stream destination)
Expand Down
4 changes: 3 additions & 1 deletion Source/EasyGelf.Core/Encoders/IChunkedMessageIdGenerator.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
namespace EasyGelf.Core.Encoders
{
using System.Threading.Tasks;

public interface IChunkedMessageIdGenerator
{
byte[] GenerateId(byte[] message);
Task<byte[]> GenerateId(byte[] message);
}
}
4 changes: 3 additions & 1 deletion Source/EasyGelf.Core/Encoders/ITransportEncoder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,10 @@

namespace EasyGelf.Core.Encoders
{
using System.Threading.Tasks;

public interface ITransportEncoder
{
IEnumerable<byte[]> Encode(byte[] bytes);
Task<IEnumerable<byte[]>> Encode(byte[] bytes);
}
}
8 changes: 5 additions & 3 deletions Source/EasyGelf.Core/Encoders/MessageBasedIdGenerator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,17 @@

namespace EasyGelf.Core.Encoders
{
using System.Threading.Tasks;

//TODO Simplify message id generator
public sealed class MessageBasedIdGenerator : IChunkedMessageIdGenerator
{
public byte[] GenerateId(byte[] message)
public async Task<byte[]> GenerateId(byte[] message)
{ //create a bit array to store the entire message id (which is 8 bytes)
var bitArray = new BitArray(64);

//Read the server ip address
var ipAddresses = Dns.GetHostAddresses(Dns.GetHostName());
var ipAddresses = await Dns.GetHostAddressesAsync(Dns.GetHostName());
var ipAddress =
(from ip in ipAddresses where ip.AddressFamily == AddressFamily.InterNetwork select ip).FirstOrDefault();

Expand Down Expand Up @@ -49,7 +51,7 @@ public byte[] GenerateId(byte[] message)

//copy all bits from bit array into a byte[]
var result = new byte[8];
bitArray.CopyTo(result, 0);
((ICollection)bitArray).CopyTo(result, 0);

return result;
}
Expand Down
5 changes: 0 additions & 5 deletions Source/EasyGelf.Core/Properties/AssemblyInfo.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,6 @@
// 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("EasyGelf.Core")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("EasyGelf.Core")]
[assembly: AssemblyCopyright("Copyright © 2014")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
Expand Down
2 changes: 1 addition & 1 deletion Source/EasyGelf.Core/SimpleJson.cs
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@

// original json parsing code from http://techblog.procurios.nl/k/618/news/view/14605/14863/How-do-I-write-my-own-parser-for-JSON.html

#if NETFX_CORE
#if NETFX_CORE || NETSTANDARD
#define SIMPLE_JSON_TYPEINFO
#endif

Expand Down
8 changes: 5 additions & 3 deletions Source/EasyGelf.Core/Transports/Amqp/AmqpTransport.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@

namespace EasyGelf.Core.Transports.Amqp
{
using System.Threading.Tasks;

public sealed class AmqpTransport : ITransport
{
private readonly AmqpTransportConfiguration configuration;
Expand All @@ -21,16 +23,16 @@ public AmqpTransport(AmqpTransportConfiguration configuration, ITransportEncoder
this.messageSerializer = messageSerializer;
}

public void Send(GelfMessage message)
public async Task Send(GelfMessage message)
{
EstablishConnection();
foreach (var bytes in encoder.Encode(messageSerializer.Serialize(message)))
foreach (var bytes in await encoder.Encode(messageSerializer.Serialize(message)))
{
var basicProperties = new BasicProperties
{
DeliveryMode = configuration.Persistent ? (byte)2 : (byte)1
};
channel.BasicPublish(configuration.Exchange, configuration.RoutingKey, false, false, basicProperties, bytes);
channel.BasicPublish(configuration.Exchange, configuration.RoutingKey, false, basicProperties, bytes);
}
}

Expand Down
4 changes: 3 additions & 1 deletion Source/EasyGelf.Core/Transports/BufferedTransport.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@

namespace EasyGelf.Core.Transports
{
using System.Threading.Tasks;

public sealed class BufferedTransport : ITransport
{
private readonly BlockingCollection<GelfMessage> buffer = new BlockingCollection<GelfMessage>();
Expand Down Expand Up @@ -50,7 +52,7 @@ public BufferedTransport(IEasyGelfLogger logger, ITransport transport)
}) {IsBackground = true, Name = "EasyGelf Buffered Transport Thread"}.Start();
}

public void Send(GelfMessage message)
public async Task Send(GelfMessage message)
{
buffer.Add(message, cancellationTokenSource.Token);
}
Expand Down
Loading