栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

NLog自定义Target之MQTT

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

NLog自定义Target之MQTT

 优质资源分享 
学习路线指引(点击解锁)知识定位人群定位
李 Python实战微信订餐小程序 李进阶级本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。
Python量化交易实战入门级手把手带你打造一个易扩展、更安全、效率更高的量化交易系统

NLog是.Net中最流行的日志记录开源项目(之一),它灵活、免费、开源

官方支持文件、网络(Tcp、Udp)、数据库、控制台等输出

社区支持Elastic、Seq等日志平台输出

实时日志需求

在工业物联网等特定场景下需要实时获取日志信息

工业物联网领域常用的是mqtt协议

那我们就使用NLog 自定义一个Target,将日志输出到MqttServer

Web通过Mqtt(websocket)实时获取日志,而不是传统的通过WebApi轮询日志

NLog自定义Target
  1. 官方文档介绍了如何自定义Target,可以获取到一串日志消息,无法获取结构化消息
  2. 需要时用使用自定义Field来完成这部分工作
/// 
/// Additional field details
/// 
[NLogConfigurationItem]
public class Field
{
    /// 
    /// Name of additional field
    /// 
    [RequiredParameter]
    public string Name { get; set; }

    /// 
    /// Value with NLog  rendering support
    /// 
    [RequiredParameter]
    public Layout Layout { get; set; }

    /// 
    /// Custom type conversion from default string to other type
    /// 
    /// 
    ///  can be used if the  renders JSON
    /// 
    public Type LayoutType { get; set; } = typeof(string);

    /// 
    public override string ToString()
    {
        return $"Name: {Name}, LayoutType: {LayoutType}, Layout: {Layout}";
    }
}

  1. 重写Write方法
protected override void Write(LogEventInfo logEvent)
{
    //default fields
    Dictionary 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实时查看应用程序的日志。

  1. 创建WebApi项目
  2. 引用NLog.Target.MQTT

  1. 配置文件

    
    
    
extensions>



    
    
        
        
        
        
        
        
        
        
        
        
    target>
targets>



    
rules>

  1. 配置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 =>
{
    //MqttServerWebSocket
    endpoints.MapConnectionHandler("/mqtt", options =>
 {
 options.WebSockets.SubProtocolSelector = MqttSubProtocolSelector.SelectSubProtocol;
 });
});
// ...

  1. Web连接MqttServer
// ... 
"./jquery.min.js">