Table of Contents

Built-in Logging

Logging is a universal approach to detecting problems and debugging your software.

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.

For example:

The library provides ConsoleLogFactory and FileLogFactory classes.

When the 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

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

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

Implementation example for ILog and ILogFactory interfaces:

public class ConsoleLogFactory : ILogFactory
{
    private readonly 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;
        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 static 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 "";
    }



}

Read more about Logging at page "Creating global and local logger".