Какой самый безопасный и эффективный способ применения выражений фильтра к журнальным сообщениям, которые всегда происходят с одной и той же категорией?
У меня более 100 приложений в одном контейнере, которые регистрируют один и тот же файл.Сообщения, которые я хочу обработать, очень специфичны.Применение одной сложной спецификации фильтра к каждому сообщению кажется чрезмерной нагрузкой, поэтому я решил создать отдельные регистраторы для каждой категории с сообщением, которое я хочу отфильтровать.Каждый регистратор получает свой собственный обработчик со своей спецификацией фильтра.Таким образом, я применил бы логику фильтрации только к наименьшему возможному количеству сообщений журнала.
Вот регистраторы в standalone.xml:
<root-logger>
<level name="INFO"/>
<handlers>
<handler name="CONSOLE"/>
<handler name="FILE"/>
</handlers>
</root-logger>
<logger category="org.hibernate.engine.jdbc.spi.SqlExceptionHelper" use-parent-handlers="false">
<level name="INFO"/>
<handlers>
<handler name="CONSOLE"/>
<handler name="SQL_EXECUTION_HELPER_FILE"/>
</handlers>
</logger>
<logger category="org.jboss.as.ejb3.invocation" use-parent-handlers="false">
<level name="INFO"/>
<handlers>
<handler name="CONSOLE"/>
<handler name="EJB3_INVOCATION_FILE"/>
</handlers>
</logger>
Вот обработчики файлов:
<periodic-rotating-file-handler name="FILE" autoflush="true">
<formatter>
<named-formatter name="PATTERN"/>
</formatter>
<file relative-to="jboss.server.log.dir" path="server.log"/>
<suffix value=".yyyy-MM-dd"/>
<append value="true"/>
</periodic-rotating-file-handler>
<periodic-rotating-file-handler name="SQL_EXECUTION_HELPER_FILE">
<filter-spec value="any( not(match("ERROR: duplicate key value violates unique constraint \"option_option_expiry_id_option_type_id_strike_price_key\"")), all( match("ERROR: duplicate key value violates unique constraint \"option_option_expiry_id_option_type_id_strike_price_key\""), levelChange(WARN) ) )"/>
<formatter>
<named-formatter name="PATTERN"/>
</formatter>
<file relative-to="jboss.server.log.dir" path="server.log"/>
<suffix value=".yyyy-MM-dd"/>
<append value="true"/>
</periodic-rotating-file-handler>
<periodic-rotating-file-handler name="EJB3_INVOCATION_FILE">
<filter-spec value="any( not(match("EJB Invocation failed on component OptionProductManagementDataService for method public void com.nodalexchange.optionproductmanagement.OptionProductManagementDataService.insert")), all( match("EJB Invocation failed on component OptionProductManagementDataService for method public void com.nodalexchange.optionproductmanagement.OptionProductManagementDataService.insert"), levelChange(WARN) ) )"/>
<formatter>
<named-formatter name="PATTERN"/>
</formatter>
<file relative-to="jboss.server.log.dir" path="server.log"/>
<suffix value=".yyyy-MM-dd"/>
<append value="true"/>
</periodic-rotating-file-handler>
Я не понимаю, как работают эти обработчики файлов, например, используют ли они общий дескриптор файла или каждый открывает свой собственный.Это всегда работало хорошо для меня, за исключением одного случая, когда я получал сообщения только от одного обработчика и ничего больше, что заставляет меня полагать, что использовать несколько обработчиков небезопасно, но я не смог воспроизвести это.
- Существует ли риск повреждения файлов при записи многими обработчиками в один и тот же файл?
- Есть ли лучший способ?