You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:开发MS Bot Framework Composer(Node.js)自定义中间件记录消息时间戳

在Bot Framework Composer中实现自定义消息时间戳日志中间件

1. 编写自定义中间件类

创建一个专门处理消息时间戳日志的中间件,它会拦截用户发送的每条消息并提取时间戳信息。

新建MessageTimestampLoggerMiddleware.cs文件,代码如下:

using Microsoft.Bot.Builder;
using Microsoft.Extensions.Logging;
using System.Threading;
using System.Threading.Tasks;

public class MessageTimestampLoggerMiddleware : IMiddleware
{
    private readonly ILogger<MessageTimestampLoggerMiddleware> _logger;

    public MessageTimestampLoggerMiddleware(ILogger<MessageTimestampLoggerMiddleware> logger)
    {
        _logger = logger;
    }

    public async Task OnTurnAsync(ITurnContext turnContext, NextDelegate next, CancellationToken cancellationToken = default)
    {
        // 只处理用户发送的消息
        if (turnContext.Activity.Type == ActivityTypes.Message && turnContext.Activity.From?.Role == "user")
        {
            var timestamp = turnContext.Activity.Timestamp;
            var userId = turnContext.Activity.From.Id;
            var messageText = turnContext.Activity.Text;

            // 记录时间戳及相关信息,可替换为写入数据库/文件等逻辑
            _logger.LogInformation("用户消息日志 - 用户ID: {UserId}, 时间戳: {Timestamp}, 消息内容: {MessageText}",
                userId, timestamp, messageText);
        }

        // 继续执行后续机器人逻辑
        await next(cancellationToken);
    }
}

2. 将中间件集成到Composer机器人

Composer基于Bot Framework SDK开发,需要在项目的服务配置中注册并添加中间件:

.NET 6+ 项目(Program.cs)

找到机器人服务注册的代码段,添加中间件注册:

var builder = WebApplication.CreateBuilder(args);

// 注册机器人核心服务
builder.Services.AddBotFrameworkAdapter();

// 注册自定义时间戳日志中间件
builder.Services.AddSingleton<IMiddleware, MessageTimestampLoggerMiddleware>();

// 其他原有代码...

var app = builder.Build();
app.UseBotFramework();
app.Run();

自定义适配器添加中间件(可选)

如果项目使用自定义适配器处理错误逻辑,需要在适配器构造函数中手动添加中间件:

public class AdapterWithErrorHandler : BotFrameworkHttpAdapter
{
    public AdapterWithErrorHandler(ICredentialProvider credentialProvider, ILogger<BotFrameworkHttpAdapter> logger, IMiddleware timestampMiddleware, ConversationState conversationState = null)
        : base(credentialProvider)
    {
        // 注入自定义时间戳中间件
        Use(timestampMiddleware);

        // 原有错误处理逻辑
        OnTurnError = async (turnContext, exception) =>
        {
            logger.LogError(exception, "机器人运行出错");
            await turnContext.SendActivityAsync("抱歉,我暂时无法处理你的请求。");
        };
    }
}

然后替换原有适配器注册:

builder.Services.AddSingleton<IBotFrameworkHttpAdapter, AdapterWithErrorHandler>();

3. 验证功能

启动机器人,发送几条测试消息,查看控制台日志(或配置的日志文件),就能看到包含用户消息时间戳的日志条目,示例如下:

info: MessageTimestampLoggerMiddleware[0]
用户消息日志 - 用户ID: user_xxxx, 时间戳: 2024-05-20T15:40:22.123Z, 消息内容: 你好,请问怎么操作?

补充说明

  • 如果需要将日志持久化到数据库或文件,直接替换中间件中的_logger.LogInformation代码即可。
  • 时间戳默认是UTC格式,如需转换为本地时间,可使用timestamp.ToLocalTime()处理。
  • 确保项目已引用对应版本的Microsoft.Bot.Builder NuGet包。

内容的提问来源于stack exchange,提问作者TheNewbie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 17:30:11