求助:开发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.BuilderNuGet包。
内容的提问来源于stack exchange,提问作者TheNewbie
相关产品推荐
相关产品推荐

