Как написать цель NLog, используя Signalr - PullRequest
4 голосов
/ 28 февраля 2012

Я пытаюсь написать цель для NLog отправлять сообщения подключенным клиентам с помощью SignalR.

Вот что у меня сейчас.Что мне интересно, так это , следует ли мне использовать разрешение ConnectionManager следующим образом -или- каким-то образом получить ссылку на концентратор (SignalrTargetHub) и вызвать SendMessageметод на это?

Есть ли какие-либо последствия для производительности?

[Target("Signalr")]
public class SignalrTarget:TargetWithLayout
{

    public SignalR.IConnectionManager ConnectionManager { get; set; }

    public SignalrTarget()
    {
        ConnectionManager = AspNetHost.DependencyResolver.Resolve<IConnectionManager>();
    }

    protected override void Write(NLog.LogEventInfo logEvent)
    {

        dynamic clients = GetClients();

        var logEventObject = new
        {
            Message = this.Layout.Render(logEvent), 
            Level = logEvent.Level.Name,
            TimeStamp = logEvent.TimeStamp.ToString("yyyy-MM-dd HH:mm:ss.fff")
        };

        clients.onLoggedEvent(logEventObject);
    }

    private dynamic GetClients()
    {
        return ConnectionManager.GetClients<SignalrTargetHub>();
    }

}

1 Ответ

2 голосов
/ 06 марта 2012

Я получил базовую структуру, с которой начал. Всего несколько настроек для получения необходимой информации.

  • Добавлены детали исключения.
  • HTML закодировал окончательное сообщение.

[Target("Signalr")]  
public class SignalrTarget:TargetWithLayout  
{  
    protected override void Write(NLog.LogEventInfo logEvent)
    {
        var sb = new System.Text.StringBuilder();
        sb.Append(this.Layout.Render(logEvent));

        if (logEvent.Exception != null)
            sb.AppendLine().Append(logEvent.Exception.ToString());

        var message = HttpUtility.HtmlEncode(sb.ToString());

        var logEventObject = new
        {
            Message = message,
            Logger = logEvent.LoggerName,
            Level = logEvent.Level.Name,
            TimeStamp = logEvent.TimeStamp.ToString("HH:mm:ss.fff")
        };

        GetClients().onLoggedEvent(logEventObject);
    }

    private dynamic GetClients()
    {
        return AspNetHost.DependencyResolver.Resolve<IConnectionManager>().GetClients<SignalrTargetHub>();
    }
 }

В моем простом тестировании все работает хорошо. Еще предстоит выяснить, добавляет ли это какую-либо значительную нагрузку в состоянии стресса.

...