@@ -1,10 +1,11 @@ | |||||
using JT1078.Protocol; | |||||
using JT1078.DotNetty.Core.Metadata; | |||||
using JT1078.Protocol; | |||||
using System.Threading.Tasks; | using System.Threading.Tasks; | ||||
namespace JT1078.DotNetty.Core.Interfaces | namespace JT1078.DotNetty.Core.Interfaces | ||||
{ | { | ||||
public interface IJT1078TcpMessageHandlers | public interface IJT1078TcpMessageHandlers | ||||
{ | { | ||||
Task Processor(JT1078Package package); | |||||
Task<JT1078Response> Processor(JT1078Request request); | |||||
} | } | ||||
} | } |
@@ -1,10 +1,11 @@ | |||||
using JT1078.Protocol; | |||||
using JT1078.DotNetty.Core.Metadata; | |||||
using JT1078.Protocol; | |||||
using System.Threading.Tasks; | using System.Threading.Tasks; | ||||
namespace JT1078.DotNetty.Core.Interfaces | namespace JT1078.DotNetty.Core.Interfaces | ||||
{ | { | ||||
public interface IJT1078UdpMessageHandlers | public interface IJT1078UdpMessageHandlers | ||||
{ | { | ||||
Task Processor(JT1078Package package); | |||||
Task<JT1078Response> Processor(JT1078Request request); | |||||
} | } | ||||
} | } |
@@ -0,0 +1,20 @@ | |||||
using JT1078.Protocol; | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Text; | |||||
namespace JT1078.DotNetty.Core.Metadata | |||||
{ | |||||
public class JT1078Request | |||||
{ | |||||
public JT1078Request(JT1078Package package,byte[] src) | |||||
{ | |||||
Package = package; | |||||
Src = src; | |||||
} | |||||
public JT1078Package Package { get; } | |||||
public byte[] Src { get; } | |||||
} | |||||
} |
@@ -0,0 +1,10 @@ | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Text; | |||||
namespace JT1078.DotNetty.Core.Metadata | |||||
{ | |||||
public class JT1078Response | |||||
{ | |||||
} | |||||
} |
@@ -3,15 +3,16 @@ using System.Collections.Generic; | |||||
using System.Text; | using System.Text; | ||||
using System.Threading.Tasks; | using System.Threading.Tasks; | ||||
using JT1078.DotNetty.Core.Interfaces; | using JT1078.DotNetty.Core.Interfaces; | ||||
using JT1078.DotNetty.Core.Metadata; | |||||
using JT1078.Protocol; | using JT1078.Protocol; | ||||
namespace JT1078.DotNetty.Tcp.Handlers | namespace JT1078.DotNetty.Tcp.Handlers | ||||
{ | { | ||||
class JT1078TcpMessageProcessorEmptyImpl : IJT1078TcpMessageHandlers | class JT1078TcpMessageProcessorEmptyImpl : IJT1078TcpMessageHandlers | ||||
{ | { | ||||
public Task Processor(JT1078Package package) | |||||
public Task<JT1078Response> Processor(JT1078Request request) | |||||
{ | { | ||||
return Task.CompletedTask; | |||||
return Task.FromResult<JT1078Response>(default); | |||||
} | } | ||||
} | } | ||||
} | } |
@@ -7,6 +7,7 @@ using JT1078.DotNetty.Core.Services; | |||||
using JT1078.Protocol; | using JT1078.Protocol; | ||||
using JT1078.DotNetty.Core.Interfaces; | using JT1078.DotNetty.Core.Interfaces; | ||||
using JT1078.DotNetty.Core.Session; | using JT1078.DotNetty.Core.Session; | ||||
using JT1078.DotNetty.Core.Metadata; | |||||
namespace JT1078.DotNetty.Tcp.Handlers | namespace JT1078.DotNetty.Tcp.Handlers | ||||
{ | { | ||||
@@ -53,7 +54,7 @@ namespace JT1078.DotNetty.Tcp.Handlers | |||||
JT1078Package package = JT1078Serializer.Deserialize(msg); | JT1078Package package = JT1078Serializer.Deserialize(msg); | ||||
AtomicCounterService.MsgSuccessIncrement(); | AtomicCounterService.MsgSuccessIncrement(); | ||||
SessionManager.TryAdd(package.SIM, ctx.Channel); | SessionManager.TryAdd(package.SIM, ctx.Channel); | ||||
handlers.Processor(package); | |||||
handlers.Processor(new JT1078Request(package, msg)); | |||||
if (logger.IsEnabled(LogLevel.Debug)) | if (logger.IsEnabled(LogLevel.Debug)) | ||||
{ | { | ||||
logger.LogDebug("accept package success count<<<" + AtomicCounterService.MsgSuccessCount.ToString()); | logger.LogDebug("accept package success count<<<" + AtomicCounterService.MsgSuccessCount.ToString()); | ||||
@@ -0,0 +1,44 @@ | |||||
<?xml version="1.0" encoding="utf-8" ?> | |||||
<!-- | |||||
参考:http://www.cnblogs.com/fuchongjundream/p/3936431.html | |||||
autoReload:自动再配置 | |||||
internalLogFile:可以让NLog把内部的调试和异常信息都写入指定文件里程序没问题了,日志却出了问题。这个该怎么办,到底是哪里不正确了?假如日志本身除了bug该如何解决?这就需要日志排错。把日志的错误信息写入日志。 | |||||
<nlog throwExceptions="true" /> | |||||
<nlog internalLogFile="file.txt" />- 设置internalLogFile属性可以让NLog把内部的调试和异常信息都写入指定文件里。 | |||||
<nlog internalLogLevel="Trace|Debug|Info|Warn|Error|Fatal" /> - 决定内部日志的级别,级别越高,输出的日志信息越简洁。 | |||||
<nlog internalLogToConsole="false|true" /> - 是否把内部日志输出到标准控制台。 | |||||
<nlog internalLogToConsoleError="false|true" /> - 是否把内部日志输出到标准错误控制台 (stderr)。 | |||||
设置throwExceptions属性为“true”可以让NLog不再阻挡这类异常,而是把它们抛给调用者。在部署是这样做可以帮我们快速定位问题。一旦应用程序已经正确配置了,我们建议把throwExceptions的值设为“false”,这样由于日志引发的问题不至于导致应用程序的崩溃。 | |||||
--> | |||||
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xsi:schemaLocation="NLog NLog.xsd" | |||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | |||||
autoReload="true" | |||||
internalLogFile="wwwroot/logs/internalLog.txt" | |||||
internalLogLevel="Debug" > | |||||
<variable name="Directory" value="/data/logs/JT1078.Gateway"/> | |||||
<targets> | |||||
<target name="all" xsi:type="File" | |||||
fileName="${Directory}/all/${shortdate}.log" | |||||
layout="${date:format=yyyyMMddHHmmss} ${callsite} ${level}:${message} ${onexception:${exception:format=tostring} ${newline} ${stacktrace} ${newline}"/> | |||||
<target name="JT1078TcpMessageHandlers" xsi:type="File" | |||||
fileName="${Directory}/JT1078TcpMessageHandlers/${shortdate}.log" | |||||
layout="${date:format=yyyyMMddHHmmss},${message}"/> | |||||
<target name="JT1078TcpMessageHandlersHex" xsi:type="File" | |||||
fileName="${Directory}/JT1078TcpMessageHandlersHex/${shortdate}.log" | |||||
layout="${date:format=yyyyMMddHHmmss},${message}"/> | |||||
<target name="console" xsi:type="ColoredConsole" | |||||
useDefaultRowHighlightingRules="false" | |||||
layout="${date:format=yyyyMMddHHmmss} ${callsite} ${level} ${message} ${onexception:${exception:format=tostring} ${newline} ${stacktrace} ${newline}"> | |||||
<highlight-row condition="level == LogLevel.Debug" foregroundColor="DarkGray" /> | |||||
<highlight-row condition="level == LogLevel.Info" foregroundColor="Gray" /> | |||||
<highlight-row condition="level == LogLevel.Warn" foregroundColor="Yellow" /> | |||||
<highlight-row condition="level == LogLevel.Error" foregroundColor="Red" /> | |||||
<highlight-row condition="level == LogLevel.Fatal" foregroundColor="Red" backgroundColor="White" /> | |||||
</target> | |||||
</targets> | |||||
<rules> | |||||
<logger name="*" minlevel="Error" maxlevel="Fatal" writeTo="all"/> | |||||
<logger name="JT1078TcpMessageHandlers" minlevel="Debug" maxlevel="Fatal" writeTo="JT1078TcpMessageHandlers"/> | |||||
<logger name="JT1078TcpMessageHandlersHex" minlevel="Debug" maxlevel="Fatal" writeTo="JT1078TcpMessageHandlersHex"/> | |||||
</rules> | |||||
</nlog> |
@@ -0,0 +1,44 @@ | |||||
<?xml version="1.0" encoding="utf-8" ?> | |||||
<!-- | |||||
参考:http://www.cnblogs.com/fuchongjundream/p/3936431.html | |||||
autoReload:自动再配置 | |||||
internalLogFile:可以让NLog把内部的调试和异常信息都写入指定文件里程序没问题了,日志却出了问题。这个该怎么办,到底是哪里不正确了?假如日志本身除了bug该如何解决?这就需要日志排错。把日志的错误信息写入日志。 | |||||
<nlog throwExceptions="true" /> | |||||
<nlog internalLogFile="file.txt" />- 设置internalLogFile属性可以让NLog把内部的调试和异常信息都写入指定文件里。 | |||||
<nlog internalLogLevel="Trace|Debug|Info|Warn|Error|Fatal" /> - 决定内部日志的级别,级别越高,输出的日志信息越简洁。 | |||||
<nlog internalLogToConsole="false|true" /> - 是否把内部日志输出到标准控制台。 | |||||
<nlog internalLogToConsoleError="false|true" /> - 是否把内部日志输出到标准错误控制台 (stderr)。 | |||||
设置throwExceptions属性为“true”可以让NLog不再阻挡这类异常,而是把它们抛给调用者。在部署是这样做可以帮我们快速定位问题。一旦应用程序已经正确配置了,我们建议把throwExceptions的值设为“false”,这样由于日志引发的问题不至于导致应用程序的崩溃。 | |||||
--> | |||||
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xsi:schemaLocation="NLog NLog.xsd" | |||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | |||||
autoReload="true" | |||||
internalLogFile="wwwroot/logs/internalLog.txt" | |||||
internalLogLevel="Debug" > | |||||
<variable name="Directory" value="${basedir}/wwwroot/logs/JT1078.Gateway"/> | |||||
<targets> | |||||
<target name="all" xsi:type="File" | |||||
fileName="${Directory}/all/${shortdate}.log" | |||||
layout="${date:format=yyyyMMddHHmmss} ${callsite} ${level}:${message} ${onexception:${exception:format=tostring} ${newline} ${stacktrace} ${newline}"/> | |||||
<target name="JT1078TcpMessageHandlers" xsi:type="File" | |||||
fileName="${Directory}/JT1078TcpMessageHandlers/${shortdate}.log" | |||||
layout="${date:format=yyyyMMddHHmmss},${message}"/> | |||||
<target name="JT1078TcpMessageHandlersHex" xsi:type="File" | |||||
fileName="${Directory}/JT1078TcpMessageHandlersHex/${shortdate}.log" | |||||
layout="${date:format=yyyyMMddHHmmss},${message}"/> | |||||
<target name="console" xsi:type="ColoredConsole" | |||||
useDefaultRowHighlightingRules="false" | |||||
layout="${date:format=yyyyMMddHHmmss} ${callsite} ${level} ${message} ${onexception:${exception:format=tostring} ${newline} ${stacktrace} ${newline}"> | |||||
<highlight-row condition="level == LogLevel.Debug" foregroundColor="DarkGray" /> | |||||
<highlight-row condition="level == LogLevel.Info" foregroundColor="Gray" /> | |||||
<highlight-row condition="level == LogLevel.Warn" foregroundColor="Yellow" /> | |||||
<highlight-row condition="level == LogLevel.Error" foregroundColor="Red" /> | |||||
<highlight-row condition="level == LogLevel.Fatal" foregroundColor="Red" backgroundColor="White" /> | |||||
</target> | |||||
</targets> | |||||
<rules> | |||||
<logger name="*" minlevel="Error" maxlevel="Fatal" writeTo="all,console"/> | |||||
<logger name="JT1078TcpMessageHandlers" minlevel="Debug" maxlevel="Fatal" writeTo="JT1078TcpMessageHandlers,console"/> | |||||
<logger name="JT1078TcpMessageHandlersHex" minlevel="Debug" maxlevel="Fatal" writeTo="JT1078TcpMessageHandlersHex,console"/> | |||||
</rules> | |||||
</nlog> |
@@ -1,4 +1,6 @@ | |||||
using JT1078.DotNetty.Core.Interfaces; | |||||
using DotNetty.Buffers; | |||||
using JT1078.DotNetty.Core.Interfaces; | |||||
using JT1078.DotNetty.Core.Metadata; | |||||
using JT1078.Protocol; | using JT1078.Protocol; | ||||
using Microsoft.Extensions.Logging; | using Microsoft.Extensions.Logging; | ||||
using Newtonsoft.Json; | using Newtonsoft.Json; | ||||
@@ -11,17 +13,19 @@ namespace JT1078.DotNetty.TestHosting.Handlers | |||||
{ | { | ||||
public class JT1078TcpMessageHandlers : IJT1078TcpMessageHandlers | public class JT1078TcpMessageHandlers : IJT1078TcpMessageHandlers | ||||
{ | { | ||||
private readonly ILogger<JT1078TcpMessageHandlers> logger; | |||||
private readonly ILogger logger; | |||||
private readonly ILogger hexLogger; | |||||
public JT1078TcpMessageHandlers(ILoggerFactory loggerFactory) | public JT1078TcpMessageHandlers(ILoggerFactory loggerFactory) | ||||
{ | { | ||||
logger = loggerFactory.CreateLogger<JT1078TcpMessageHandlers>(); | |||||
logger = loggerFactory.CreateLogger("JT1078TcpMessageHandlers"); | |||||
hexLogger = loggerFactory.CreateLogger("JT1078TcpMessageHandlersHex"); | |||||
} | } | ||||
public Task Processor(JT1078Package package) | |||||
public Task<JT1078Response> Processor(JT1078Request request) | |||||
{ | { | ||||
logger.LogDebug(JsonConvert.SerializeObject(package)); | |||||
return Task.CompletedTask; | |||||
logger.LogInformation(JsonConvert.SerializeObject(request.Package)); | |||||
hexLogger.LogInformation(ByteBufferUtil.HexDump(request.Src)); | |||||
return Task.FromResult<JT1078Response>(default); | |||||
} | } | ||||
} | } | ||||
} | } |
@@ -1,4 +1,5 @@ | |||||
using JT1078.DotNetty.Core.Interfaces; | using JT1078.DotNetty.Core.Interfaces; | ||||
using JT1078.DotNetty.Core.Metadata; | |||||
using JT1078.Protocol; | using JT1078.Protocol; | ||||
using Microsoft.Extensions.Logging; | using Microsoft.Extensions.Logging; | ||||
using Newtonsoft.Json; | using Newtonsoft.Json; | ||||
@@ -15,10 +16,10 @@ namespace JT1078.DotNetty.TestHosting.Handlers | |||||
logger = loggerFactory.CreateLogger<JT1078UdpMessageHandlers>(); | logger = loggerFactory.CreateLogger<JT1078UdpMessageHandlers>(); | ||||
} | } | ||||
public Task Processor(JT1078Package package) | |||||
public Task<JT1078Response> Processor(JT1078Request request) | |||||
{ | { | ||||
logger.LogDebug(JsonConvert.SerializeObject(package)); | |||||
return Task.CompletedTask; | |||||
logger.LogDebug(JsonConvert.SerializeObject(request.Package)); | |||||
return Task.FromResult<JT1078Response>(default); | |||||
} | } | ||||
} | } | ||||
} | } |
@@ -11,6 +11,7 @@ | |||||
<PackageReference Include="Microsoft.Extensions.Hosting" Version="2.2.0" /> | <PackageReference Include="Microsoft.Extensions.Hosting" Version="2.2.0" /> | ||||
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="2.2.0" /> | <PackageReference Include="Microsoft.Extensions.Logging.Console" Version="2.2.0" /> | ||||
<PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="2.2.0" /> | <PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="2.2.0" /> | ||||
<PackageReference Include="NLog.Extensions.Logging" Version="1.5.1" /> | |||||
</ItemGroup> | </ItemGroup> | ||||
<ItemGroup> | <ItemGroup> | ||||
@@ -22,6 +23,15 @@ | |||||
<None Update="appsettings.json"> | <None Update="appsettings.json"> | ||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory> | <CopyToOutputDirectory>Always</CopyToOutputDirectory> | ||||
</None> | </None> | ||||
<None Update="Configs\nlog.unix.config"> | |||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory> | |||||
</None> | |||||
<None Update="Configs\nlog.win.config"> | |||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory> | |||||
</None> | |||||
<None Update="Configs\NLog.xsd"> | |||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory> | |||||
</None> | |||||
</ItemGroup> | </ItemGroup> | ||||
</Project> | </Project> |
@@ -7,6 +7,9 @@ using Microsoft.Extensions.DependencyInjection; | |||||
using Microsoft.Extensions.DependencyInjection.Extensions; | using Microsoft.Extensions.DependencyInjection.Extensions; | ||||
using Microsoft.Extensions.Hosting; | using Microsoft.Extensions.Hosting; | ||||
using Microsoft.Extensions.Logging; | using Microsoft.Extensions.Logging; | ||||
using Newtonsoft.Json; | |||||
using Newtonsoft.Json.Converters; | |||||
using NLog.Extensions.Logging; | |||||
using System; | using System; | ||||
using System.Collections.Concurrent; | using System.Collections.Concurrent; | ||||
using System.Collections.Generic; | using System.Collections.Generic; | ||||
@@ -18,6 +21,15 @@ namespace JT1078.DotNetty.TestHosting | |||||
{ | { | ||||
class Program | class Program | ||||
{ | { | ||||
static Program() | |||||
{ | |||||
Newtonsoft.Json.JsonSerializerSettings setting = new Newtonsoft.Json.JsonSerializerSettings(); | |||||
JsonConvert.DefaultSettings = new Func<JsonSerializerSettings>(() => | |||||
{ | |||||
setting.Converters.Add(new StringEnumConverter()); | |||||
return setting; | |||||
}); | |||||
} | |||||
static async Task Main(string[] args) | static async Task Main(string[] args) | ||||
{ | { | ||||
//3031636481E2108801123456781001100000016BB392CA7C02800028002E0000000161E1A2BF0098CFC0EE1E17283407788E39A403FDDBD1D546BFB063013F59AC34C97A021AB96A28A42C08 | //3031636481E2108801123456781001100000016BB392CA7C02800028002E0000000161E1A2BF0098CFC0EE1E17283407788E39A403FDDBD1D546BFB063013F59AC34C97A021AB96A28A42C08 | ||||
@@ -29,8 +41,16 @@ namespace JT1078.DotNetty.TestHosting | |||||
}) | }) | ||||
.ConfigureLogging((context, logging) => | .ConfigureLogging((context, logging) => | ||||
{ | { | ||||
if (Environment.OSVersion.Platform == PlatformID.Unix) | |||||
{ | |||||
NLog.LogManager.LoadConfiguration("Configs/nlog.unix.config"); | |||||
} | |||||
else | |||||
{ | |||||
NLog.LogManager.LoadConfiguration("Configs/nlog.win.config"); | |||||
} | |||||
logging.AddNLog(new NLogProviderOptions { CaptureMessageTemplates = true, CaptureMessageProperties = true }); | |||||
logging.SetMinimumLevel(LogLevel.Trace); | logging.SetMinimumLevel(LogLevel.Trace); | ||||
logging.AddConsole(); | |||||
}) | }) | ||||
.ConfigureServices((hostContext, services) => | .ConfigureServices((hostContext, services) => | ||||
{ | { | ||||
@@ -3,15 +3,16 @@ using System.Collections.Generic; | |||||
using System.Text; | using System.Text; | ||||
using System.Threading.Tasks; | using System.Threading.Tasks; | ||||
using JT1078.DotNetty.Core.Interfaces; | using JT1078.DotNetty.Core.Interfaces; | ||||
using JT1078.DotNetty.Core.Metadata; | |||||
using JT1078.Protocol; | using JT1078.Protocol; | ||||
namespace JT1078.DotNetty.Udp.Handlers | namespace JT1078.DotNetty.Udp.Handlers | ||||
{ | { | ||||
class JT1078UdpMessageProcessorEmptyImpl : IJT1078UdpMessageHandlers | class JT1078UdpMessageProcessorEmptyImpl : IJT1078UdpMessageHandlers | ||||
{ | { | ||||
public Task Processor(JT1078Package package) | |||||
public Task<JT1078Response> Processor(JT1078Request request) | |||||
{ | { | ||||
return Task.CompletedTask; | |||||
return Task.FromResult<JT1078Response>(default); | |||||
} | } | ||||
} | } | ||||
} | } |
@@ -52,7 +52,7 @@ namespace JT1078.DotNetty.Udp.Handlers | |||||
JT1078Package package = JT1078Serializer.Deserialize(msg.Buffer); | JT1078Package package = JT1078Serializer.Deserialize(msg.Buffer); | ||||
AtomicCounterService.MsgSuccessIncrement(); | AtomicCounterService.MsgSuccessIncrement(); | ||||
SessionManager.TryAdd(ctx.Channel, msg.Sender, package.SIM); | SessionManager.TryAdd(ctx.Channel, msg.Sender, package.SIM); | ||||
handlers.Processor(package); | |||||
handlers.Processor(new JT1078Request(package, msg.Buffer)); | |||||
if (logger.IsEnabled(LogLevel.Debug)) | if (logger.IsEnabled(LogLevel.Debug)) | ||||
{ | { | ||||
logger.LogDebug("accept package success count<<<" + AtomicCounterService.MsgSuccessCount.ToString()); | logger.LogDebug("accept package success count<<<" + AtomicCounterService.MsgSuccessCount.ToString()); | ||||