Botframework如何记录日志

时间:2016-08-08 15:10:50

标签: history botframework botbuilder

您是否知道如何记录所有传出/传入消息?我不确定如何捕获传出的消息。

我使用链和表格。 例如

await Conversation.SendAsync(activity, rootDialog.BuildChain);

activity.CreateReply(.....);

2 个答案:

答案 0 :(得分:2)

我找到了更好的解决方案

    public class BotToUserLogger : IBotToUser
{
    private readonly IMessageActivity _toBot;
    private readonly IConnectorClient _client;

    public BotToUserLogger(IMessageActivity toBot, IConnectorClient client)
    {
        SetField.NotNull(out _toBot, nameof(toBot), toBot);
        SetField.NotNull(out _client, nameof(client), client);
    }

    public IMessageActivity MakeMessage()
    {
        var toBotActivity = (Activity)_toBot;
        return toBotActivity.CreateReply();
    }

    public async Task PostAsync(IMessageActivity message, CancellationToken cancellationToken = default(CancellationToken))
    {
        await _client.Conversations.ReplyToActivityAsync((Activity)message, cancellationToken);
    }
}

public class BotToUserDatabaseWriter : IBotToUser
{
    private readonly IBotToUser _inner;
    public BotToUserDatabaseWriter(IBotToUser inner)
    {
        SetField.NotNull(out _inner, nameof(inner), inner);
    }
    public IMessageActivity MakeMessage()
    {
        return _inner.MakeMessage();
    }

    public async Task PostAsync(IMessageActivity message, CancellationToken cancellationToken = default(CancellationToken))
    {
        // loging outgoing message
        Debug.WriteLine(message.Text);

        //TODO log message for example into DB

        await _inner.PostAsync(message, cancellationToken);
    }

在控制器使用中

 public MessagesController()
    {
        var builder = new ContainerBuilder();
        builder.RegisterType<BotToUserLogger>()
            .AsSelf()
            .InstancePerLifetimeScope();

        builder.Register(c => new BotToUserTextWriter(c.Resolve<BotToUserLogger>()))
            .AsImplementedInterfaces()
            .InstancePerLifetimeScope();
        builder.Update(Microsoft.Bot.Builder.Dialogs.Conversation.Container);
    }

答案 1 :(得分:0)

看起来我无法记录传出消息。

我更改了SDK源代码。

在Conversations.cs中添加事件

例如像这样。

  public delegate void MessageSendedEventHandler(object sender, Activity activity, string conversationId);
    public static event MessageSendedEventHandler MessageSended;

并添加每个Send .... HttpMessagesAsync方法 这个MessageSended?.Invoke(this, activity, conversationId);

它不是很好的解决方案。但它的工作