Можно ли регистрировать имя класса источника и имя метода в продукте Java?

В настоящее время я работаю над Java-приложением для некоторого инструмента мониторинга сети. В моем коде я должен много использовать логирование. Так как это программное обеспечение для управления сетью, информация в журналах весьма полезна для пользователя, поэтому ее использование обязательно. Но теперь я немного запутался с тем, какой метод логгера я бы предпочел. Сейчас я использую Logger.lop(...//...) поскольку с его помощью мы также регистрируем имя класса и метод, поэтому мне (разработчикам) становится очень легко отлаживать код и находить ошибку. Но, наконец, я запутался, должен ли я доставить его конечному пользователю с тем же механизмом ведения журнала??? Полезно ли сообщать пользователю, какой класс выполняется в данный момент, в каком методе произошла ошибка. Я много раз видел, как во многих продуктах используется обработка стека, поэтому обычно мы получаем и имя класса. Так нет ли проблем, чтобы сообщить конечному пользователю, какое у вас имя класса и метод??

3 ответа

Решение

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

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

При этом вы можете либо использовать другую конфигурацию ведения журнала для разработки и производства, либо эти детализированные сообщения могут перейти в отладку, трассировку и т. Д. Если вы используете log4j, обычно рекомендуется использовать isDebugEnabled обернуть любые операторы журналирования, которые включают в себя все, что вычисляется динамически, так как они вычисляются до того, как оператор журналирования определит, включен ли он.

log4j/ logback/ slf4j позволяют вам иметь разные форматы для разных приложений. Для разработки вы можете включить консольного приложения, где вы включаете имя класса в формате, а для конечных пользователей вы можете его опустить (для файлового приложения)

Стоит отметить, что такое ведение журналов является дорогостоящим в Java, в отличие от C++, где оно обычно реализуется с помощью препроцессора. К счастью, с помощью log4j/logback вы можете включать и выключать его - следуйте советам Божо.

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