Я поддерживаю библиотеку для доступа к базе данных на http://jooq.sourceforge.net,, и я хотел бы использовать log4j для ведения журнала. Но регистрация - действительно очень дополнительная часть моей библиотеки. Если log4j недоступен в коде клиента, то я не буду заниматься журналированием. Таким образом, я создал прокси-сервер журнала, как это:
public final class JooqLogger {
// Initialise only once
private static boolean initialisationError = false;
// The log4j Logger reference
private Logger logger;
// Get the logger proxy for a class
public static JooqLogger getLogger(Class<?> clazz) {
JooqLogger result = new JooqLogger();
try {
result.logger = Logger.getLogger(clazz);
}
// Log4j is not found on the classpath, so ignore most of logging
catch (Throwable t) {
if (!initialisationError) {
initialisationError = true;
result.error("JooqLogger could not initialise log4j logger...");
}
}
return result;
}
// All methods from log4j Logger are available as well.
// They provide redirection and ignore all calls if log4j is not available.
public boolean isTraceEnabled() {
if (logger != null) {
return logger.isTraceEnabled();
}
else {
return false;
}
}
public void trace(Object message) {
if (logger != null) {
logger.trace(message);
}
}
// [... etc ...]
}
Мои вопросы:
- Это хорошая идея / хорошая практика? Или я должен создать "жесткую" зависимость от log4j?
- При использовании вышеуказанного решения регистрация не будет такой точной, как если бы я непосредственно вызывал методы log4j. Например, номер зарегистрированной строки или файл .java в файлах журнала всегда будут такими же, как у JooqLogger, а не у вызывающего. Есть ли способ обойти эту проблему?