Пользовательский регистратор 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 ведения журнала, поскольку он предназначен для переключения бэкэндов во время развертывания. Другими словами, если вы когда-либо перерастаете свою собственную структуру ведения журналов или вынуждены взаимодействовать с другими, используя что-то другое, это просто передумать.

http://slf4j.org/

Он также позволяет использовать конструкцию {} для простой вставки объектов в строки журнала без дополнительных затрат, если эта строка в действительности не записана (что действительно хорошо).

Я предлагаю вам рассмотреть возможность адаптации "простого" бэкэнда к вашим потребностям, поскольку он, вероятно, обеспечивает 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 или другой). Написание и поддержка своих собственных (как правило) не стоит.

Еще один момент, который следует учитывать: если ваша инфраструктура содержит другое стороннее программное обеспечение, которое вы хотите интегрировать в один файл журнала, вам придется использовать какой-либо общий инструмент (например, тот, который поддерживается этим сторонним программным обеспечением). Часто очень полезно, чтобы все элементы системы объединяли журналы в одном месте.

Другие вопросы по тегам