永和建设集团有限公司网站,网站推广积分,浙江省人才网官方网站建设厅招聘,个人建设什么网站好NLog是.Net中最流行的日志记录开源项目(之一)#xff0c;它灵活、免费、开源官方支持文件、网络(TCP、UDP)、数据库、控制台等输出社区支持Elastic、Seq等日志平台输出实时日志需求在工业物联网等特定场景下需要实时获取日志信息工业物联网领域常用的是mqtt协议那我们就使用NL… NLog是.Net中最流行的日志记录开源项目(之一)它灵活、免费、开源官方支持文件、网络(TCP、UDP)、数据库、控制台等输出社区支持Elastic、Seq等日志平台输出实时日志需求在工业物联网等特定场景下需要实时获取日志信息工业物联网领域常用的是mqtt协议那我们就使用NLog 自定义一个Target将日志输出到MqttServerWeb通过Mqtt(websocket)实时获取日志而不是传统的通过WebApi轮询日志NLog自定义Target官方文档介绍了如何自定义Target可以获取到一串日志消息无法获取结构化消息需要使用自定义Field来完成这部分工作/// summary
/// Additional field details
/// /summary
[NLogConfigurationItem]
public class Field
{/// summary/// Name of additional field/// /summary[RequiredParameter]public string Name { get; set; }/// summary/// Value with NLog see crefNLog.Layouts.Layout/ rendering support/// /summary[RequiredParameter]public Layout Layout { get; set; }/// summary/// Custom type conversion from default string to other type/// /summary/// remarks/// see crefSystem.Object/ can be used if the see crefLayout/ renders JSON/// /remarkspublic Type LayoutType { get; set; } typeof(string);/// inheritdoc /public override string ToString(){return $Name: {Name}, LayoutType: {LayoutType}, Layout: {Layout};}
}重写Write方法protected override void Write(LogEventInfo logEvent)
{//default fieldsDictionarystring, object logDictionary new(){{ timestamp, logEvent.TimeStamp },{ level, logEvent.Level.Name },{ message, RenderLogEvent(Layout, logEvent) }};//customer fields//这里都处理为字符串了有优化空间foreach (var field in Fields){var renderedField RenderLogEvent(field.Layout, logEvent);if (string.IsNullOrWhiteSpace(renderedField))continue;logDictionary[field.Name] renderedField;}SendTheMessage2MqttBroker(JsonConvert.SerializeObject(logDictionary));
}使用下面将使用Nlog.Target.MQTT,演示通过web实时查看应用程序的日志。创建WebApi项目引用NLog.Target.MQTT配置文件extensionsadd assemblyNLog.Web.AspNetCore/!--add assemblyNLog.Targets.MQTT/--add assemblyNLog.Targets.MQTT/
/extensions
!-- the targets to write to --
targets!-- MQTT Target --target xsi:typeMQTT namemqtt hostlocalhost port1883 usernameUserName passwordPassword topicloglayout${longdate}|${event-properties:itemEventId_Id:whenEmpty0}|${level:uppercasetrue}|${logger}|${message} ${exception:formattostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}|${callsite} field namemachine layout${machinename} /field nameprocessid layout${processid} /field namethreadname layout${threadname} /field namelogger layout${logger} /field namecallsite layout${callsite-linenumber} /field nameurl layout${aspnet-request-url} /field nameaction layout${aspnet-mvc-action} /field namelevel layout${level:uppercasetrue} /field namemessage layout${message} /field nameexception layout${exception:formattoString} //target
/targets
!-- rules to map from logger name to target --
ruleslogger name* minlevelTrace writeTomqtt /
/rules配置MQTTServer和NLog// ...
// NLog: Setup NLog for Dependency injection
builder.Logging.ClearProviders();
builder.Logging.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace);
builder.Host.UseNLog();//AddHostedMqttServer
builder.Services.AddHostedMqttServer(mqttServer {mqttServer.WithoutDefaultEndpoint();}).AddMqttConnectionHandler().AddConnections();//Config Port
builder.WebHost.UseKestrel(option
{option.ListenAnyIP(1883, l l.UseMqtt());option.ListenAnyIP(80);
});
var app builder.Build();// ...
//UseStaticFiles html js etc.
app.UseStaticFiles();
app.UseRouting();//Websocket Mqtt
app.UseEndpoints(endpoints
{//MqttServerWebSocketendpoints.MapConnectionHandlerMqttConnectionHandler(/mqtt, options {options.WebSockets.SubProtocolSelector MqttSubProtocolSelector.SelectSubProtocol;});
});
// ...Web连接MqttServer// ...
script src./jquery.min.js/script
script src./mqtt.min.js/script
script src./vue.js/script
// ...var client mqtt.connect(ws:// window.location.host /mqtt, options);
client.on(connect,function() {client.subscribe(log,function(err) {if (!err) {console.log(subed!);} else {alert(subed error!);}});});
client.on(message,function(topic, message) {if (topic log) {if (app.logs.length 50)app.logs.length 0;app.logs.unshift($.parseJSON(message.toString()));}});
// ...输出日志// ...
_logger.LogDebug(LogDebug!);
_logger.LogError(new Exception(Exception Message!), LogError!);//new thread output log after 500ms
Thread thread new Thread(ThreadProc);
thread.Name My Thread;
thread.Start();
// ...实时查看日志 访问/index.html8. 也可以通过Mqtt客户端订阅日志 源码及相关链接[1] Githubhttps://github.com/iioter/NLog.Targets.MQTT[2] Giteehttps://gitee.com/iioter/NLog.Targets.MQTT[3] IoTGateway-Dochttp://iotgateway.net/blog/NLog[4] NLog自定义Targethttps://github.com/NLog/NLog/wiki/How-to-write-a-custom-target感兴趣可以关注我