Documentation Menu

OnLogging Event

Lets you modify and cancel log messages.

Definition

public event LoggingHandler OnLogging

Remarks

The Logging event is raised by JSNLog just before it sends a log message to the server side logging package (events tutorial).

This allows you to:

  • Access the cookies, request headers, etc. of the log request sent from the client;
  • Modify the log message, severity and logger name before they are logged;
  • Stop the message from being logged at all.

Note that a simpler but less powerful way to add information to your log messages is via the serverSideMessageFormat attribute of the <jsnlog> / JsnlogConfiguration configuration element.

Creating and adding a logging event handler

Because you need to create and add the handler only once in the life of the application, you will want to add your code to the Application_Start handler in the Global.asax.cs file:

// Global.asax.cs

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        ...
    }

    ...
}

Your handler has to match the LoggingHandler delegate, as defined by JSNLog. This means your method takes a LoggingEventArgs parameter and returns void:

// Global.asax.cs

using JSNLog;

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        ...

        LoggingHandler loggingHandler = 
            (LoggingEventArgs loggingEventArgs) =>
            {
                ...
            };

        // Add the new handler to the logging event.
        JavascriptLogging.OnLogging += loggingHandler;
    }

    ...
}

Now you can add code to stop messages from being logged:

// Global.asax.cs

using JSNLog;

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        ...

        LoggingHandler loggingHandler = 
            (LoggingEventArgs loggingEventArgs) =>
            {
                if (loggingEventArgs.FinalMessage.Contains("this will be suppressed"))
                {
                    loggingEventArgs.Cancel = true;
                    return;
                }
            };

        // Add the new handler to the logging event.
        JavascriptLogging.OnLogging += loggingHandler;
    }

    ...
}

Or add for example all request headers to every log message:

// Global.asax.cs

using JSNLog;

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        ...

        LoggingHandler loggingHandler = 
            (LoggingEventArgs loggingEventArgs) =>
            {
                Dictionary<string, string> logRequestHeaders = loggingEventArgs.LogRequest.Headers;
                string logRequestHeadersString =
                    string.Join(" | ", logRequestHeaders.Select(m => m.Key + ":" + m.Value).ToArray());

                // Add string with headers to the log message that will be sent to the logging package
                loggingEventArgs.FinalMessage += " | " + logRequestHeadersString;
            };

        // Add the new handler to the logging event.
        JavascriptLogging.OnLogging += loggingHandler;
    }

    ...
}

LoggingEventArgs

An object of this type will be passed to your event handler.

Definition

public class LoggingEventArgs : FinalLogData
{
    public bool Cancel { get; set; }
}
    
public class FinalLogData
{
    public ILogRequest LogRequest { get; }

    public string FinalLogger { get; set; }
    public Level FinalLevel { get; set; }
    public string FinalMessage { get; set; }

    public string ServerSideMessageFormat { get; set; }
}

Properties

Name Description
Cancel
read/write
Initialized to false. Set to true to stop the message from being logged.
LogRequest
read only
Cookies, headers, etc. of the log request from the client.
FinalLogger
read/write
Name of the logger that will be sent to the server side log.
FinalLevel
read/write
Severity level that will be sent to the server side log.
FinalMessage
read/write
Message that will be sent to the server side log.
ServerSideMessageFormat
read
Format set by the serverSideMessageFormat property of the <jsnlog> / JsnlogConfiguration element.

ILogRequest

Describes the original log request received from the client.

Definition

public interface ILogRequest
{
    string Message { get; }
    string Logger { get; }
    string Level { get; }
    DateTime UtcDate { get; }
    string JsonMessage { get; }

    string UserAgent { get; }
    string UserHostAddress { get; }
    string RequestId { get; }
    string Url { get; }

    Dictionary<string, string> QueryParameters { get; }
    Dictionary<string, string> Cookies { get; }
    Dictionary<string, string> Headers { get; }
}

Properties

Name Description
Message Original message logged on the client.
Logger Name of the client side logger.
Level Numeric severity of the log message as set on the client.
UtcDate Date and time in UTC when the message was generated, according to the client's clock.
JsonMessage Original message given to the JavaScript logger, as a valid JSON value (details).
UserAgent Identifies the make of the browser.
UserHostAddress IP address(es) of the sender of the request (details below).
RequestId Identifies the request for which the log message was created (details).
Url Url of the page on which the message was generated.
QueryParameters Dictionary mapping query parameter names to their values.
Cookies Dictionary mapping cookie names to their values.
Headers Dictionary mapping request header names to their values.

Working out the IP address of the sender of a request

Working out the IP address of original sender of an HTTP request (that is, the user's browser) is not as simple as looking at the source address in the request.

If your web server sits behind a load balancer, the source of the final request to the web server is not the browser, but the load balancer. The request may also have been passed on through intermediate proxies, causing the same issue.

The most common (but non-standard) solution to this is that proxies and load balancers (such as AWS' Elastic Load Balancer) send an X-Forwarded-For request header with the IP addresses of the browser and any proxies that the request passed through, except for the final source address. JSNLog uses this request header to work out the IP address of the actual browser and the proxies and/or load balancer that the request passed through.

JSNLog reports the IP address(es) of the sender(s) of the request as a string of text containing a comma separated list. First is the browser itself, then intermediate proxies (in the order in which they were reached) and then the load balancer if there is one:

Browser IP address, Proxy 1, ..., Proxy N [, Load Balancer]