1. Java / Говнокод #5246

    +74

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    @Name("solr")
    @AutoCreate
    public class SolrClient {
        @Create
        public void init() {
            try {
                server = startRemoteSolr();
            } catch (Exception e) {
                log.error(e, e);
            }
        }
    
        public SolrServer startRemoteSolr() throws MalformedURLException, SolrServerException {
            CommonsHttpSolrServer solr = new CommonsHttpSolrServer("http://localhost:8983/solr");
            solr.setRequestWriter(new BinaryRequestWriter());
            return solr;
        }
    
    }

    Seam. Перевод для непричастного: на старте сайта вызывается метод startRemoteSolr(). Solr - это поисковый движок. Если он не запустится, на сайте не будет работать поиск. И если на запуске Solr будет ошибка, то в лог она попадёт просто как exception + stack trace.

    Что не так в коде? Очевидно, его писали люди, не задумываясь об эксплуатации, что свойственно новичкам. А ведь устранение проблем в рабочем сайте - это приоритет номер один. Сама разработка сайта, сидя в удобном кресле с кашкой кофе - где-то сильно ниже.

    Так вот, что не так?

    1. При выводе ошибок надо писать - что это за ошибка. В данном случае: "Запуск поисковика неудался, ПОИСК НА САЙТЕ РАБОТАТЬ НЕ БУДЕТ." И уже потом - stack trace.

    2. Если некая ошибка связана с ресурсами - сетевыми, или на файловой системе, в логе надо также описывать этот ресурс. Т.е. "Не удалось запустить клиент поисковика по адресу http://localhost:8983/solr". Что бы из логов сразу было видно, что порт указан правильно или нет, хост и тд.

    Но выпускникам ВМК МГУ такие вещи неведомы, они слишком крутые что бы опускаться до таких мелочей. Чайники, хуле.

    Запостил: yvu, 12 Января 2011

    Комментарии (24) RSS

    • типа, обьект Exception полностью описывает ситуацию. Впрочем, для админов. Для юзверей вообще никакого сообщения
      Ответить
    • вообще оно должно падать на консоль из которой сервер запущен, правда по стэк трэйсу порой вообще понять ничего невозможно
      Ответить
      • > должно падать на консоль из которой сервер запущен
        должно падать туда, куда логгер сказал. может быть в лог-файл, в консоль, куда угодно
        (видел даже случай особого извращения, когда логи пихались в БД. Вот весело было, когда соединение с базой не удавалось, получалась неочевидная рекурсия)
        Ответить
        • я имел ввиду данный пример, хотя может он отлавливается дальше и пишет куда надо
          Ответить
          • ну, грамотный логгер должен писать сначала куда сказали, а потом уж в stderr, (или сразу или если не получилось)
            Ответить
            • Логи пишутся в спец-файл, ограниченный по размеру, а не в stdout. За запись в stderr/stdout надо отрывать руки, т.к. сообщения там выпадают из общего потока сообщений (т.к. идут в другой файл).
              Ответить
              • а если запись в спецфайл зафейлилась, что делать? по-моему, еще хуже промолчать об этом
                Ответить
                • А если она зафейлилась и в stderr тоже - потому что это тоже файл? Что теперь? Ещё один файл попробовать? Ерунда - то, что логи не работают надо вообще мониторить внешним приложением.
                  Ответить
                  • если фейлит stderr, то это вообще великая беда
                    Ответить
                    • Не stderr, а файл, в который он перенаправлен.
                      Ответить
                      • но хоть куда-то он выводится? может, в консоль?
                        Ответить
                        • Нет никакой консоли в веб-приложении. И в обычном приложении тоже нет, потому что nohup. Это сервис, а не программа "ls". :) stderr/stdout надо перенаправлять в файл, что бы не терялось то, что туда пишет говнокод.
                          Ответить
                          • понятно. по умолчанию > null, а если сфейлит и лог-файл, будет много непоняток
                            Ответить
                            • Если речь про некий сервис, то stderr/stdout надо перенаправить в файл, а не в нул. В нул нельзя, потому что какой-нибудь говнокод обязательно сделает e.printStackTrace() и ошибка будет потеряна.

                              Надо а) в файл и б) настроить для файла ограничение по размеру через какой-нибудь roller.

                              Но это - производственная неизбежность, подстраховка. В трезвом уме сознательно писать в stdout/stderr не нужно.
                              Ответить
                              • я о том, что он в нулл по умолчанию, если не перенаправить
                                Ответить
                                • После nohup? Нет, оно падает в nohup.out в текущей директории.
                                  UPD: хотя, оно может от реализации шелла зависеть.
                                  Ответить
                                  • понятно. но, естественно, что при этом лучше туда не писать
                                    Ответить
              • Не совсем понял чем stderr не угодил. Стандартные потоки хороши еще и тем, что для них легко обеспечить перенаправление вывода.
                Ответить
                • Известно ли, что такое nohup? Концепция демона (сервиса)? О какой консоли речь? Нет её при запуске и быть не может. Тем более в ВЕБ-приложении, о котором речь.
                  Ответить
      • Cервер запускается автоматически а не из консоли. Дальше надо смотреть логи системы. И вместо тупого стек трейса увидеть человеческое описание ошибки с указанием чего и куда не получилось.
        Ответить
        • ага, автоматически, наверное когда сам захочет
          Ответить
          • Ты, если дурак, так и скажи. Острить не надо. А если чего-то не понимаешь, то задай вопрос.

            Сервер запускается либо на старте ОС, либо скриптом, выкладывающем новую версию, либо просто скриптом, который, например, перезапускает все ноды. Их, допустим, 20. Запускаются они автоматически - скрипт заходит на каждую систему, выполняет там старт, и отваливается.
            Ответить
            • ну... серверы разные бывают, и из консоли их запускать можно, что касается скриптов то они тоже стартуют не из вакуума, в любом случае stdout никто не отменял, как впрочем и лог
              Ответить

    Добавить комментарий