Другое

Исправление ошибки логгера MuleSoft: AnypointMonitoringFileAppender в RTF

Решение ошибок логгера MuleSoft Runtime Fabric с полным руководством по настройке AnypointMonitoringFileAppender. Узнайте пошаговые решения для производственных сред.

Ошибка компонента логгера MuleSoft: “Попытка добавления в неинициализированный аппендер AnypointMonitoringFileAppender” в Production (RTF)

Я столкнулся с ошибкой компонента логгера в моем приложении MuleSoft при развертывании в production (RTF), хотя в локальной среде все работает нормально. Сообщение об ошибке:

ERROR StatusConsoleListener Attempted to append to non-started appender AnypointMonitoringFileAppender

Несмотря на то, что вывод логов происходит нормально, эта ошибка постоянно появляется в production. Я пробовал добавлять недостающий AnypointMonitoringFileAppender в мою конфигурацию log4j2.xml и отключать ошибки для StatusConsoleListener, но ни одно из этих решений не решило проблему.

Вот моя текущая конфигурация log4j2.xml:

xml
<?xml version="1.0" encoding="utf-8"?>
<Configuration>

    <Appenders>

        <RollingFile name="file" fileName="${sys:mule.home}${sys:file.separator}logs${sys:file.separator}myapp.log" 
                 filePattern="${sys:mule.home}${sys:file.separator}logs${sys:file.separator}myapp-%i.log">

            <PatternLayout pattern="%-5p %d [%t] [processor: %X{processorPath}; event: %X{correlationId}] %c: %m%n" />

            <SizeBasedTriggeringPolicy size="10 MB" />

            <DefaultRolloverStrategy max="10"/>

        </RollingFile>

    </Appenders>

    <Loggers>

        <!-- Http Logger показывает трафик на уровне DEBUG. -->
        <!--AsyncLogger name="org.mule.service.http.impl.service.HttpMessageLogger" level="DEBUG" /-->

        <AsyncLogger name="org.mule.service.http" level="WARN"/>

        <AsyncLogger name="org.mule.extension.http" level="WARN"/>

        <!-- Mule логгер -->        

        <AsyncLogger name="org.mule.runtime.core.internal.processor.LoggerMessageProcessor" level="INFO"/>

        <AsyncRoot level="INFO">

            <AppenderRef ref="file" />

        </AsyncRoot>

    </Loggers>
</Configuration>

Я также попытался добавить недостающий AnypointMonitoringFileAppender:

xml
<!-- Добавляем недостающий AnypointMonitoringFileAppender для RTF -->
<RollingFile name="AnypointMonitoringFileAppender"
             fileName="${sys:mule.home}${sys:file.separator}logs${sys:file.separator}anypoint-monitoring.log"
             filePattern="${sys:mule.home}${sys:file.separator}logs${sys:file.separator}anypoint-monitoring-%i.log">
    <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
    <SizeBasedTriggeringPolicy size="10 MB"/>
    <DefaultRolloverStrategy max="10"/>
</RollingFile>

И пробовал отключать ошибки StatusConsoleListener:

xml
<Logger name="StatusConsoleListener" level="OFF"/>
<Logger name="org.apache.logging.log4j.status.StatusConsoleListener" level="OFF"/>

Ни один из этих подходов не решил проблему. Что может вызывать эту ошибку только в production-среде, и как правильно настроить логгер для работы в RTF?

Ошибка “Attempted to append to non-started appender AnypointMonitoringFileAppender” возникает именно в средах MuleSoft Runtime Fabric (RTF), поскольку платформа RTF ожидает наличия определенных аппендеров ведения журнала и их правильной конфигурации. Эта ошибка появляется только в production, поскольку RTF управляет ведением журналов иначе, чем локальные среды разработки.


Содержание


Понимание основной причины

AnypointMonitoringFileAppender - это специальный аппендер, который MuleSoft Runtime Fabric использует для мониторинга и аналитических целей. Когда этот аппендер упоминается, но не правильно сконфигурирован, Log4j2 генерирует ошибку “non-started appender”. Это происходит потому, что:

  1. RTF ожидает определенную инфраструктуру ведения журналов - Платформа ссылается на AnypointMonitoringFileAppender внутренне для сбора данных мониторинга и телеметрии

  2. Проблемы с наследованием конфигурации - Ваш пользовательский log4j2.xml может переопределять конфигурацию RTF по умолчанию без включения всех требуемых аппендеров

  3. Зависимости, специфичные для среды - RTF имеет дополнительные требования к ведению журналов, которые отсутствуют в локальных средах разработки

Как указано в документации MuleSoft, “Чтобы журналы были доступны для просмотра в Runtime Fabric и передавались в Splunk, настройте SplunkHttp Log4j appender.”


Правильная конфигурация ведения журналов в RTF

Чтобы решить эту проблему, вам нужно включить все требуемые аппендеры RTF в вашей пользовательской конфигурации log4j2.xml. Вот исправленный подход:

Требуемые аппендеры для RTF

xml
<?xml version="1.0" encoding="utf-8"?>
<Configuration>

    <Appenders>
        <!-- Ваш пользовательский аппендер -->
        <RollingFile name="file" 
                     fileName="${sys:mule.home}${sys:file.separator}logs${sys:file.separator}myapp.log" 
                     filePattern="${sys:mule.home}${sys:file.separator}logs${sys:file.separator}myapp-%i.log">
            <PatternLayout pattern="%-5p %d [%t] [processor: %X{processorPath}; event: %X{correlationId}] %c: %m%n" />
            <SizeBasedTriggeringPolicy size="10 MB" />
            <DefaultRolloverStrategy max="10"/>
        </RollingFile>

        <!-- Требуется для мониторинга RTF -->
        <RollingFile name="AnypointMonitoringFileAppender"
                     fileName="${sys:mule.home}${sys:file.separator}logs${sys:file.separator}anypoint-monitoring.log"
                     filePattern="${sys:mule.home}${sys:file.separator}logs${sys:file.separator}anypoint-monitoring-%i.log">
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
            <SizeBasedTriggeringPolicy size="10 MB"/>
            <DefaultRolloverStrategy max="10"/>
        </RollingFile>

        <!-- Опционально: Интеграция с Splunk для внешнего ведения журналов -->
        <SplunkHttp name="SplunkHttp"
                    url="https://your-splunk-instance:8088/services/collector/event"
                    source="mulesoft-rtf"
                    sourcetype="mulesoft:log"
                    pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n">
        </SplunkHttp>

    </Appenders>

    <Loggers>
        <!-- Http Logger показывает сетевой трафик на уровне DEBUG -->
        <!--AsyncLogger name="org.mule.service.http.impl.service.HttpMessageLogger" level="DEBUG" /-->

        <AsyncLogger name="org.mule.service.http" level="WARN"/>
        <AsyncLogger name="org.mule.extension.http" level="WARN"/>
        
        <!-- Mule logger -->        
        <AsyncLogger name="org.mule.runtime.core.internal.processor.LoggerMessageProcessor" level="INFO"/>

        <AsyncRoot level="INFO">
            <AppenderRef ref="file" />
            <!-- Ссылка на аппендер мониторинга RTF -->
            <AppenderRef ref="AnypointMonitoringFileAppender" />
            <!-- Опционально: Включить аппендер Splunk -->
            <AppenderRef ref="SplunkHttp" />
        </AsyncRoot>

    </Loggers>
</Configuration>

Пошаговое решение для устранения неполадок

Шаг 1: Проверьте расположение файла конфигурации

Убедитесь, что ваш пользовательский log4j2.xml правильно ссылается в вашем mule-artifact.json:

json
{
  "minMuleVersion": "4.0.0",
  "logConfigFile": "src/main/resources/custom-log4j2.xml"
}

Шаг 2: Включите поддержку пользовательского Log4j в RTF

Согласно документации MuleSoft Runtime Fabric, вам нужно включить поддержку пользовательского log4j:

bash
kubectl -n rtf patch secret custom-properties -p '{"data": {"CUSTOM_LOG4J_ENABLED": "dHJ1Z0=="}}'

Шаг 3: Перезапустите компоненты Runtime Fabric

После изменения конфигурации перезапустите необходимые компоненты:

  1. Перезапустите агент pod Runtime Fabric:

    bash
    kubectl -n rtf delete pod -l app=runtime-fabric-agent
    
  2. Перезапустите ваше приложение:

    • Перезапустите через Anypoint Platform
    • Или перезапустите конкретный pod приложения

Шаг 4: Проверьте инициализацию аппендера

Убедитесь, что все аппендеры правильно инициализированы, просматривая журналы запуска, которые показывают:

  • Сообщения о запуске аппендера
  • Отсутствие предупреждений “non-started appender”
  • Правильное создание файлов для мониторинга журналов

Альтернативные подходы к ведению журналов для RTF

Интеграция с Splunk

Для production-сред рассмотрите использование аппендера SplunkHttp для централизованного ведения журналов:

xml
<SplunkHttp name="SplunkHttp"
            url="https://your-splunk-instance:8088/services/collector/event"
            source="mulesoft-rtf"
            sourcetype="mulesoft:log"
            pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n">
</SplunkHttp>

Как объясняется на DZone, “Вам нужно добавить аппендер SplunkHttp в log4j.xml. Предоставьте URL для подключения к Splunk, источник, шаблон расположения и т.д.”

Ведение журналов на основе категорий

Реализуйте ведение журналов на основе категорий для лучшей организации:

xml
<AsyncLogger name="org.mule" level="INFO" additivity="false">
    <AppenderRef ref="file"/>
    <AppenderRef ref="AnypointMonitoringFileAppender"/>
</AsyncLogger>

<AsyncLogger name="com.yourcompany" level="DEBUG" additivity="false">
    <AppenderRef ref="file"/>
</AsyncLogger>

Этот подход, как демонстрируется в уроках на YouTube, позволяет генерировать отдельные файлы журналов для каждой категории.


Лучшие практики для production-ведения журналов

1. Используйте асинхронное ведение журналов

Как рекомендовано в официальных руководствах MuleSoft, “Рекомендуется выбирать асинхронное ведение журналов в production для улучшения производительности приложения, то есть низкой задержки.”

2. Управляйте уровнями журналов из Anypoint Runtime Manager

Согласно рекомендациям MuleSoft, “Необходимо объявить категорию компонента журнала MuleSoft для управления уровнем журнала из Anypoint runtime manager.”

3. Мониторьте производительность ведения журналов

  • Установите соответствующие лимиты размера файла (10 МБ, как показано в примерах)
  • Реализуйте правильные стратегии ротации
  • Мониторьте использование дискового пространства в RTF

4. Обработка ошибок

Вместо отключения StatusConsoleListener правильно обрабатывайте ошибки:

xml
<Loggers>
    <!-- Сохраняйте уровень WARN для прослушивателя статуса, чтобы видеть реальные проблемы -->
    <Logger name="org.apache.logging.log4j.status.StatusLogger" level="WARN"/>
    
    <!-- Ваши другие журналы -->
</Loggers>

Заключение

Ошибка “Attempted to append to non-started appender AnypointMonitoringFileAppender” в средах MuleSoft RTF можно решить путем:

  1. Включения всех требуемых аппендеров RTF в вашей пользовательской конфигурации log4j2.xml
  2. Включения поддержки пользовательского log4j в Runtime Fabric с помощью команды kubectl
  3. Правильного перезапуска как агента RTF, так и вашего приложения после изменения конфигурации
  4. Использования асинхронного ведения журналов для лучшей производительности в production
  5. Реализации ведения журналов на основе категорий для лучшей организации и контроля

Помните, что RTF имеет специфические требования к ведению журналов, которые отличаются от локальных сред разработки. Ключевым моментом является обеспечение того, чтобы ваша пользовательская конфигурация включала все аппендеры, которые ожидает RTF, при сохранении ваших пользовательских потребностей в ведении журналов.

Для непрерывного мониторинга используйте возможности Anypoint Monitoring и рассмотрите интеграцию с внешними системами ведения журналов, такими как Splunk, для централизованного управления журналами в production-средах.


Источники

  1. Документация MuleSoft - Экспорт телеметрии внешне
  2. Документация MuleSoft - Конфигурация ведения журналов в Mule
  3. Документация MuleSoft - Использование журналов в Anypoint Monitoring
  4. Блог MuleSoft - Лучшие практики ведения журналов Mule 4
  5. Stack Overflow - Ошибка компонента журнала MuleSoft в anypont RTF
  6. DZone - Включение пользовательского ведения журналов для приложения MuleSoft
  7. Medium - Рекомендации по ведению журналов MuleSoft
  8. YouTube - Генерация файла журнала на основе КАТЕГОРИИ Mule log4j
Авторы
Проверено модерацией
Модерация