Регистратор JSch - где я могу настроить уровень

Как настроить уровень регистратора JSch?

Это похоже на Log4J, настраиваемый через XML?


person Alexey    schedule 09.11.2014    source источник
comment
спасибо за упоминание   -  person Alexey    schedule 10.11.2014
comment
@Alexey Если вы найдете ответ полезным, примите его (белая галочка в верхнем левом углу этого ответа). Он укажет другим пользователям, что действительно ответил на вопрос и что они могут ему доверять.   -  person xav    schedule 22.11.2014


Ответы (2)


Похоже, JSch не использует какую-либо известную структуру ведения журналов (я использую JSch v0.1.49, но последняя версия — v0.1.51) или какой-либо XML-файл конфигурации. Итак, вот что я сделал:

private class JSCHLogger implements com.jcraft.jsch.Logger {
    private Map<Integer, MyLevel> levels = new HashMap<Integer, MyLevel>();

    private final MyLogger LOGGER;


    public JSCHLogger() {
        // Mapping between JSch levels and our own levels
        levels.put(DEBUG, MyLevel.FINE);
        levels.put(INFO, MyLevel.INFO);
        levels.put(WARN, MyLevel.WARNING);
        levels.put(ERROR, MyLevel.SEVERE);
        levels.put(FATAL, MyLevel.SEVERE);

        LOGGER = MyLogger.getLogger(...); // Anything you want here, depending on your logging framework
    }

    @Override
    public boolean isEnabled(int pLevel) {
        return true; // here, all levels enabled 
    }

    @Override
    public void log(int pLevel, String pMessage) {
        MyLevel level = levels.get(pLevel);
        if (level == null) {
            level = MyLevel.SEVERE;
        }
        LOGGER.log(level, pMessage); // logging-framework dependent...
    }
}

Затем перед использованием JSch:

JSch.setLogger(new JSCHLogger());

Обратите внимание, что вместо MyLevel и MyLogger вы можете использовать любые классы фреймворка ведения журнала (Log4j, Logback,...)

Полный пример можно найти здесь: http://www.jcraft.com/jsch/examples/Logger.java.html

person xav    schedule 10.11.2014
comment
Спасибо за ответ, который полезен, но тот факт, что мы должны реализовать свой собственный класс ведения журнала, чтобы получить информацию из JSch, БЕЗУМНЫЙ. Если Spring может позволить нам войти через log4j или что-то еще, почему бы не Jcraft? - person SteveT; 29.03.2017
comment
@SteveT, лол, да, это грустно ... Глядя на исходный код, кажется, что им не очень нравятся стандарты Java, поэтому традиционные фреймворки, такие как SLF4J или Log4j, могут показаться им неинтересными ... - person xav; 29.03.2017
comment
Комментарии к текущему выпуску интерфейса Jsch Logger содержат некоторую нестандартную работу. Проверьте это: public static final Logger SIMPLE_LOGGER=new Logger(){ public boolean isEnabled(int level){return true;} public void log(int level, String message){System.err.println(message);} }; Обратите внимание, что обязательно используйте интерфейс Logger из пакета Jsch. - person Realn0whereman; 09.08.2018
comment
Мне интересно, как сбросить предыдущий регистратор, потому что JSch.getLogger() является частным пакетом. Я хотел бы временно установить свой собственный регистратор с помощью JSch.setLogger(), а затем вернуться к предыдущему. - person Max Spring; 10.10.2019

Просто хотел добавить небольшой комментарий к принятому ответу, но репутация не позволяет. Извините, если этот путь через другой ответ является злом, но действительно хочу упомянуть следующее.

Активация журнала работает таким образом и может дать вам много информации о процессе подключения (обмен ключами и т. д.). Но такого понятия, как отладочный вывод для основного функционала после аутентификации, практически нет, по крайней мере, для SFTP. И взгляд на источник показывает/подтверждает, что в ChannelSftp (и большинстве других классов) нет регистрации.

Поэтому, если вы хотите активировать это для проверки проблем со связью (после аутентификации), это напрасно - или вам нужно добавить подходящие утверждения в источник самостоятельно (я еще этого не сделал).

Мы сталкиваемся с полными зависаниями (потоки заданий застревают на несколько дней/бесконечно) в put, get и даже ls — и, конечно же, поставщик сервера утверждает, что это не проблема (и действительно работает клиент командной строки unix sftp — но не с сервера приложений). хост, к которому у нас нет доступа... поэтому нам придется проверить сетевое соединение). Если у кого-то есть идея, спасибо ..

person hyphan    schedule 13.04.2015
comment
Оказалось, что между нами и сервером был ответственный диспетчер. Тем не менее, это, безусловно, нехорошо, что в jsch нет абсолютно никаких тайм-аутов, что приводит к тому, что потоки зависают навсегда в таких случаях (не могу сказать вам, что именно произошло на сетевом уровне, но, вероятно, просто нет больше пакетов в соединении) - person hyphan; 24.04.2015