@@ -1,10 +1,11 @@ | |||
using JT1078.Protocol; | |||
using JT1078.DotNetty.Core.Metadata; | |||
using JT1078.Protocol; | |||
using System.Threading.Tasks; | |||
namespace JT1078.DotNetty.Core.Interfaces | |||
{ | |||
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; | |||
namespace JT1078.DotNetty.Core.Interfaces | |||
{ | |||
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.Threading.Tasks; | |||
using JT1078.DotNetty.Core.Interfaces; | |||
using JT1078.DotNetty.Core.Metadata; | |||
using JT1078.Protocol; | |||
namespace JT1078.DotNetty.Tcp.Handlers | |||
{ | |||
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.DotNetty.Core.Interfaces; | |||
using JT1078.DotNetty.Core.Session; | |||
using JT1078.DotNetty.Core.Metadata; | |||
namespace JT1078.DotNetty.Tcp.Handlers | |||
{ | |||
@@ -53,7 +54,7 @@ namespace JT1078.DotNetty.Tcp.Handlers | |||
JT1078Package package = JT1078Serializer.Deserialize(msg); | |||
AtomicCounterService.MsgSuccessIncrement(); | |||
SessionManager.TryAdd(package.SIM, ctx.Channel); | |||
handlers.Processor(package); | |||
handlers.Processor(new JT1078Request(package, msg)); | |||
if (logger.IsEnabled(LogLevel.Debug)) | |||
{ | |||
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 Microsoft.Extensions.Logging; | |||
using Newtonsoft.Json; | |||
@@ -11,17 +13,19 @@ namespace JT1078.DotNetty.TestHosting.Handlers | |||
{ | |||
public class JT1078TcpMessageHandlers : IJT1078TcpMessageHandlers | |||
{ | |||
private readonly ILogger<JT1078TcpMessageHandlers> logger; | |||
private readonly ILogger logger; | |||
private readonly ILogger hexLogger; | |||
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.Metadata; | |||
using JT1078.Protocol; | |||
using Microsoft.Extensions.Logging; | |||
using Newtonsoft.Json; | |||
@@ -15,10 +16,10 @@ namespace JT1078.DotNetty.TestHosting.Handlers | |||
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.Logging.Console" 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> | |||
@@ -22,6 +23,15 @@ | |||
<None Update="appsettings.json"> | |||
<CopyToOutputDirectory>Always</CopyToOutputDirectory> | |||
</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> | |||
</Project> |
@@ -7,6 +7,9 @@ using Microsoft.Extensions.DependencyInjection; | |||
using Microsoft.Extensions.DependencyInjection.Extensions; | |||
using Microsoft.Extensions.Hosting; | |||
using Microsoft.Extensions.Logging; | |||
using Newtonsoft.Json; | |||
using Newtonsoft.Json.Converters; | |||
using NLog.Extensions.Logging; | |||
using System; | |||
using System.Collections.Concurrent; | |||
using System.Collections.Generic; | |||
@@ -18,6 +21,15 @@ namespace JT1078.DotNetty.TestHosting | |||
{ | |||
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) | |||
{ | |||
//3031636481E2108801123456781001100000016BB392CA7C02800028002E0000000161E1A2BF0098CFC0EE1E17283407788E39A403FDDBD1D546BFB063013F59AC34C97A021AB96A28A42C08 | |||
@@ -29,8 +41,16 @@ namespace JT1078.DotNetty.TestHosting | |||
}) | |||
.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.AddConsole(); | |||
}) | |||
.ConfigureServices((hostContext, services) => | |||
{ | |||
@@ -3,15 +3,16 @@ using System.Collections.Generic; | |||
using System.Text; | |||
using System.Threading.Tasks; | |||
using JT1078.DotNetty.Core.Interfaces; | |||
using JT1078.DotNetty.Core.Metadata; | |||
using JT1078.Protocol; | |||
namespace JT1078.DotNetty.Udp.Handlers | |||
{ | |||
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); | |||
AtomicCounterService.MsgSuccessIncrement(); | |||
SessionManager.TryAdd(ctx.Channel, msg.Sender, package.SIM); | |||
handlers.Processor(package); | |||
handlers.Processor(new JT1078Request(package, msg.Buffer)); | |||
if (logger.IsEnabled(LogLevel.Debug)) | |||
{ | |||
logger.LogDebug("accept package success count<<<" + AtomicCounterService.MsgSuccessCount.ToString()); | |||