Пользовательский регистратор Java: стандарты ведения журнала или / и лучшие практики
Я разрабатываю фреймворк, и я не позволю банке быть настолько легкой и независимой, насколько это возможно.
Итак, я написал свой класс регистрации:
import java.util.Date;
import java.util.Properties;
public class Logger {
private static final Logger me = new Logger();
private static boolean info = false;
private static boolean debug = false;
private static boolean error = false;
private static String className = null;
public static Logger getInstance(Class<?> clazz) {
className = clazz.getCanonicalName();
try {
Properties props = new CustProps().load(clazz);
if(props.get(CustProps.NAME_LOG_MODE) != null) {
String devMode = props.getProperty(CustProps.NAME_LOG_MODE).toLowerCase();
if("info".equals(devMode)) {
info = true;
debug = true;
} else if("debug".equals(devMode)) {
debug = true;
}
}
} catch (Exception e) {
// debug is error by default
}
error = true;
return me;
}
public void logError(Object msg) {
if(isError()) {
System.out.println(new Date().toString()+ " ERROR ["+Logger.className+"] - " + msg);
}
}
public void logDebug(Object msg) {
if(isDebug()) {
System.out.println(new Date().toString()+ " DEBUG ["+Logger.className+"] - " + msg);
}
}
public void logInfo(Object msg) {
if(isInfo()) {
System.out.println(new Date().toString()+ " INFO ["+Logger.className+"] - " + msg);
}
}
public boolean isInfo() {
return Logger.info;
}
public boolean isDebug() {
return Logger.debug;
}
public boolean isError() {
return Logger.error;
}
}
Каковы лучшие методы, чтобы сделать эту регистрацию лучше? Стоит ли делать собственный логгер? Повлияет ли использование этого логгера на мой фреймворк, чем на выбор чего-то существующего (например, log4j)?
7 ответов
Вам не нравится java.util.logging.Logger? Он включен в JDK, вам больше ничего не нужно.
Я настоятельно рекомендую вам использовать slf4j в качестве API ведения журнала, поскольку он предназначен для переключения бэкэндов во время развертывания. Другими словами, если вы когда-либо перерастаете свою собственную структуру ведения журналов или вынуждены взаимодействовать с другими, используя что-то другое, это просто передумать.
Он также позволяет использовать конструкцию {} для простой вставки объектов в строки журнала без дополнительных затрат, если эта строка в действительности не записана (что действительно хорошо).
Я предлагаю вам рассмотреть возможность адаптации "простого" бэкэнда к вашим потребностям, поскольку он, вероятно, обеспечивает 90% того, что вы хотите.
http://www.slf4j.org/apidocs/org/slf4j/impl/SimpleLogger.html
Примечание. Не используйте напрямую какой-либо бэкэнд (например, log4j или java.util.logging), так как он по сути привязывает ваш код к этому бэкенду. Используйте фасад.
Вы задаете три вопроса:
- Каковы лучшие методы, чтобы сделать эту регистрацию лучше?
Как уже отмечали другие, лучше всего заменить его полностью, либо на что-то вроде log4j или slf4j, либо, для достижения вашей цели "независимости", просто с помощью java.util.Logger.
- Стоит ли делать собственный логгер?
Нет, за исключением особых случаев, когда по какой-то причине существующие платформы не соответствуют вашим потребностям. Вы ничего не сказали, чтобы указать, что это может быть так.
- Повлияет ли использование этого логгера на мой фреймворк, чем на выбор чего-то существующего (например, log4j)?
Да, если по какой-либо другой причине, кроме этого, другие сопровождающие потратят несколько минут на чтение вашего класса ведения журнала, когда они войдут в вашу кодовую базу. Использование существующего фреймворка означает, что они уже знают, что он делает.
Нет ничего более легкого, чем использование java.util.logging.Logger, поскольку он уже доступен в JRE.
Используйте log4j. Это не система каротажа с тяжелым весом, что вы подразумеваете под "независимой, насколько это возможно"?
Просто добавьте log4j jar в ваш фреймворк, и все готово.
Зачем заново изобретать колесо?
Если вы используете библиотеку журналирования утилит Java, то она уже находится в JDK, и поэтому у вас нет дополнительного кода для ее предоставления.
В противном случае, log4j, безусловно, довольно хорошо.
Я бы согласился с другими комментариями - используйте инструмент COTS (Logger, Log4j или другой). Написание и поддержка своих собственных (как правило) не стоит.
Еще один момент, который следует учитывать: если ваша инфраструктура содержит другое стороннее программное обеспечение, которое вы хотите интегрировать в один файл журнала, вам придется использовать какой-либо общий инструмент (например, тот, который поддерживается этим сторонним программным обеспечением). Часто очень полезно, чтобы все элементы системы объединяли журналы в одном месте.