Table of Contents

Logging and Troubleshooting

Wireshark

The best way to analyze SMPP Protocol is to capture network traffic with Wireshark tool http://www.wireshark.org/.

SMPP related Wiki article: https://wiki.wireshark.org/SMPP

Internal Logger

Inetlab.SMPP library provides build-in logging functionality based on ILog and ILogFactory interfaces. You can implement this interface with any kind of logging framework for your solution.

Library provides ConsoleLogFactory and FileLogFactory classes.

When application starts you need to register global ILogFactory for the library.

   LogManager.SetLoggerFactory(new ConsoleLogFactory(LogLevel.Info));

or you can set Logger property when you create instances of SmppClient, SmppServerClient or SmppServer

client.Logger = new ConsoleLogger("MyClient", LogLevel.Verbose);
                                      

Library writes received and sent packet bytes in log when you enable Verbose log level. It can help us to analyze SMPP packets transfered between client and server.

Implementation example for ILog and ILogFactory interfaces:

public class ConsoleLogFactory : ILogFactory
{
    private LogLevel _minLevel;

    public ConsoleLogFactory( LogLevel minLevel)
    {
        _minLevel = minLevel;
    }

    public ILog GetLogger(string loggerName)
    {
        return new ConsoleLogger(loggerName, _minLevel);
    }
}

public class ConsoleLogger : ILog
{
    private readonly LogLevel _minLevel;

    public string Name { get; private set; }

    public ConsoleLogger(string loggerName, LogLevel minLevel)
    {
        Name = loggerName;
        _minLevel = minLevel;
    }

    public bool IsEnabled(LogLevel level)
    {
        return level >= _minLevel;
    }

    public void Write(LogLevel level, string message, Exception ex, params object[] args)
    {
        if (level < _minLevel) return;

        int threadId = Environment.CurrentManagedThreadId;

        string text = message;

        

        StringBuilder sb = new StringBuilder();
        sb.AppendFormat("{0:dd.MM.yyyy HH:mm:ss}:{1}:{2,3}: ({3}) ", DateTime.Now, GetLevelString(level), threadId, Name);
        sb.AppendFormat(message, args);
        if (ex != null)
        {
            sb.Append(" Exception: ");
            sb.Append(ex.ToString());
        }
      

        Console.WriteLine(sb.ToString());

    }



    private string GetLevelString(LogLevel level)
    {
        switch (level)
        {
            case LogLevel.Fatal:
                return "FATAL";

            case LogLevel.Error:
                return "ERROR";
               
            case LogLevel.Warning:
                return "WARN ";
                
            case LogLevel.Info:
                return "INFO ";

            case LogLevel.Debug:
                return "DEBUG";

            case LogLevel.Verbose:
                return "TRACE";

        }

        return "";
    }



}

Special events

You can also use special events in base class SmppClientBase for tracking PDUs:

Metrics

To monitor SmppClient or SmppServerClient performance you can use send and receive queue metrics. Queue propery of type QueueState provides following parameters:

Property name Description
SendCount A number of PDUs that stay in the send queue before sending to network
ReceiveCount A number of PDUs that stay in the receive queue and wait for being processed with application event handlers.
ReceiveWorkersCount A number of worker threads that process PDUs from receive queue and invoke event handlers in the application
IncompleteRequests A number of request that didn't receive their response