Логування в java - stack overflow російською

Зустрічав на просторах інтернету наступну цитату:

Логування має бути грамотним. За System.out.println для виведення логів початківцям програмістам вже через тиждень навчання слід відрубувати руки.

  • Підкажіть, як в Java правильно оформити логирование в оффлайн додатках, на tomcat і в інших випадках (наскільки я знаю там різні комманди записи в лог).
  • Як вибирати пріоритети повідомлень? Чи є якесь та негласна домовленість яким повідомленнями, який пріоритет ставити?
  • Чи варто з пріоритетом нижче, що стоїть в настройках, друкувати в лог вобще всі дії, які відбуваються (тобто пароль пройшов перевірку, обраний такий-то пункт меню, створення нового екземпляра такого-то класу пройшло успішно і т.п. - тобто іншими словами всю дрібниця на випадок необхідності пошуку помилки)?

Промисловим стандартом де-факто логгірованія в Java є Log4J. Всі інші системи логгірованія - це від лукавого, включаючи java.util.logging. Apache commons-loggins та ін. новомодні LogBack (до речі, останній все одно сумісний з Log4J)

Практично всі системи підтримують логгірованіе в стилі Log4J (я маю на увазі справжні Java системи, а не Android, який не зовсім Java). Якщо вони не підтримують Log4J - то це швидше за все неправильні системи :)

У нормальному додатку управління логами зазвичай винесено у зовнішній конфігураційний файл log4j.properties. так що зазвичай управління логами: а саме, що виводити і куди виводити зводиться до шаманства з файлом log4j.properties. У не найскладнішій варіанті це може виглядати так:

Що стосується питання по-приводу рівнів логгірованія. Те негласні домовленості такі:

  • Рівень INFO - просто інформування про якийсь подію
  • Рівень DEBUG - використовується при налагодженні
  • Рівень WARN - повідомлення про помилку або нестандартної ситуації, яка потенційно небезпечна
  • Рівень ERROR - повідомлення про помилку, після якої робота програми все ще можлива
  • Рівень FATAL - повідомлення про помилку, після якої нормальна робота програми неможлива. Зазвичай після цього робота програми припиняється.

2) Часто виникає питання (скоріше навіть не питання, а холівар): наскільки логгірованіе впливає на продуктивність. Я особисто, вирішую це питання для себе так:

Десь оголошую константу (припустимо в класі MyMain):

і далі в місцях, де йде налагоджувальне логгірованіе пишу:

При виході на продакшн DEBUG встановлюємо false і все. Компілятор сам вже прибере з коду логи загорнуті if (DEBUG) - всі задоволені.