1

I have to add custom method method to my logging system. Let's say I have in several places line of code like: private static Logger LOGGER = LoggerFactory.getLogger(MyJavaClass.class);

Logging is handling by slf4j. How can I extend my logger with adding new(!) method like public void error(SomeTypeObject obj) { /implementation/ }

The goal is to not change existing code. How can I force LoggerFactory to return my own Logger implementation extended with mentioned method?

I followed answers for this queston: stackoverflow.com/questions/2653855/implement-custom-logger-with-slf4j

So, I've made my LoggerFactory, StaticLoggerBinder and MyLoggerAdapter.

StaticLoggerBinder

public class StaticLoggerBinder implements LoggerFactoryBinder {

    private static final StaticLoggerBinder SINGLETON = new StaticLoggerBinder();

    public static final StaticLoggerBinder getSingleton() {
        return SINGLETON;
    }

    public static String REQUESTED_API_VERSION = "1.6.99";

    private static final String loggerFactoryClassStr = MyLoggerFactory.class.getName();

    private final ILoggerFactory loggerFactory;

    private StaticLoggerBinder() {
        loggerFactory = new MyLoggerFactory();
    }

    public ILoggerFactory getLoggerFactory() {
        return loggerFactory;
    }

    public String getLoggerFactoryClassStr() {
        return loggerFactoryClassStr;
    }
}

Logger Factory

public class MyLoggerFactory implements ILoggerFactory {

    ConcurrentMap<String, Logger> loggerMap;

    public MyLoggerFactory() {
        loggerMap = new ConcurrentHashMap<String, Logger>();
    }

    public Logger getLogger(String name) {
        Logger simpleLogger = loggerMap.get(name);
        if (simpleLogger != null) {
            return simpleLogger;
        } else {
            Logger newInstance = new MyLoggerAdapter(name);
            Logger oldInstance = loggerMap.putIfAbsent(name, newInstance);
            return oldInstance == null ? newInstance : oldInstance;
        }
    }

    void reset() {
        loggerMap.clear();
    }
}

MyLogger

public class MyLoggerAdapter implements Logger {
//methods from Logger interface
//and my additional method

    public void error(Exception ex) {
        //do smthng;
    }
}

Now, in MyJavaClass i have a field private static Logger LOGGER = LoggerFactory.getLogger(MyJavaClass.class);

The problem is, when i try to LOGGER.error(myExceptionObject) the method is not visible. I am missing something. I would be very grateful for help.

Adam De
  • 131
  • 1
  • 2
  • 8
  • Possible duplicate of [Implement Custom Logger with slf4j](https://stackoverflow.com/questions/2653855/implement-custom-logger-with-slf4j) – Karol Dowbecki Mar 22 '18 at 22:57

2 Answers2

1

In your MyJavaClass you should use your MyLoggerFactory:

private static MyLoggerAdapter LOGGER = MyLoggerFactory.getLogger();

instead of

private static Logger LOGGER = LoggerFactory.getLogger(MyJavaClass.class);
Otrozone
  • 283
  • 1
  • 3
  • 8
0

In this example logger can get so:

private static MyLoggerAdapter log = (MyLoggerAdapter) StaticLoggerBinder.getSingleton().getLoggerFactory.getLogger(MyController.class.getName());
Alexander Lu
  • 101
  • 1
  • 2