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