1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/future94-alarm-log

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
README.md 24 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 30.11.2024 11:06 655f7b5

1. Мониторинг журналов и оповещение о проблемах

Основные функции:

  • мониторинг журналов на предмет возникновения указанных исключений или методов и классов, которые генерируют указанные исключения, с отправкой уведомлений в WeChat, корпоративный WeChat или электронную почту.
  • поддержка основных фреймворков для логирования: log4j, log4j2, logback.
  • поддержка фреймворков SpringBoot и SpringMVC.

2. SpringBoot

Подробности смотрите в пакете alarm-log-examples-spring-boot.

2.1 Интеграция

Добавьте следующие зависимости:

<dependency>
    <groupId>com.future94</groupId>
    <artifactId>alarm-log-spring-boot-starter</artifactId>
    <version>${latest.version}</version>
</dependency>

2.2 Включение мониторинга журналов

2.2.1 Синхронный способ

  • log4j: конфигурация описана в разделе [2.3.3 Настройка журнала](#233-Настройка журнала).
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration>
    <appender name="Console" class="org.apache.log4j.ConsoleAppender">
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss,SSS} [%p] %m  >> %c:%L%n"/>
        </layout>
    </appender>

    <!--Здесь замените на AspectLog4jAsyncAppender-->
    <appender name="AlarmLog" class="com.future94.alarm.log.core.enhance.log4j.AlarmLogLog4jAsyncAppender">
        <param name="doWarnException" value="false"/>
        <param name="warnExceptionExtend" value="java.lang.Exception,java.lang.RuntimeException"/>
        <appender-ref ref="Console"/>
    </appender>

    <root>
        <priority value="info" />
        <appender-ref ref="Console"/>
        <appender-ref ref="AlarmLog"/>
    </root>
</log4j:configuration>
  • log4j2: конфигурация описана в разделе [2.3.3 Настройка журнала](#233-Настройка журнала)
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true">
    <!--Сначала определите все appender-->
    <appenders>
        <!--Консольный журнал-->
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </Console>

        <AlarmLog name="AlarmLog">
            <warnExceptionExtend>false</warnExceptionExtend>
            <doWarnException>java.lang.Exception,java.lang.RuntimeException</doWarnException>
        </AlarmLog>

    </appenders>
    <!--Затем определите logger, только после определения logger и добавления appender, appender вступит в силу-->
    <loggers>
        <root level="INFO">
            <appender-ref ref="Console"/>
            <!-- AlarmLog обрабатывает журналы уровня INFO, если уровень равен INFO, он будет вызывать циклически, вызывая ERROR Recursive call to appender ALARM_LOG, поэтому лучше установить уровень ALARM_LOG на ERROR -->
            <appender-ref ref="AlarmLog" level="ERROR" />
        </root>
    </loggers>
</configuration>
  • logback: конфигурация описана в разделе [2.3.3 Настройка журнала](#233-Настройка журнала)
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true">

    <appender name="Console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
        </encoder>
    </appender>

    <appender name="AlarmLog" class="com.future94.alarm.log.core.enhance.logback.AlarmLogLogbackAsyncAppender">
        <warnExceptionExtend>false</warnExceptionExtend>
        <doWarnException>java.lang.Exception,java.lang.RuntimeException</doWarnException>
        <includeCallerData>true</includeCallerData>
        <appender-ref ref="Console"/>
    </appender>

    <root level="INFO">
        <appender-ref ref="Console" />
        <appender-ref ref="AlarmLog" level="ERROR" />
    </root>
</configuration>

2.2.2 Асинхронный способ

  • log4j: конфигурация описана в разделе [2.3.3 Настройка журнала](#233-Настройка журнала)
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration>
    <appender name="Console" class="org.apache.log4j.ConsoleAppender">
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss,SSS} [%p] %m  >> %c:%L%n"/>
        </layout>
    </appender>

    <!--Здесь заменить на AspectLog4jAsyncAppender-->
    <appender name="AlarmLog" class="com.future94.alarm.log.core.enhance.log4j.AlarmLogLog4jAsyncAppender">
        <param name="doWarnException" value="false"/>
        <param name="warnExceptionExtend" value="java.lang.Exception,java.lang.RuntimeException"/>
        <appender-ref ref="Console"/>

``` **Текст запроса:**

class="com.future94.alarm.log.core.enhance.log4j.AlarmLogLog4jAsyncAppender">
    <param name="doWarnException" value="false"/>
    <param name="warnExceptionExtend" value="java.lang.Exception,java.lang.RuntimeException"/>
    <appender-ref ref="Console"/>
</appender>
  • log4j2: doWarnException、warnExceptionExtend 配置意义与上面一致。注意:标签必须为 AlarmLog,name 属性可以随意。
<AlarmLog name="AlarmLog">
    <warnExceptionExtend>false</warnExceptionExtend>
    <doWarnException>java.lang.Exception, java.lang.RuntimeException</doWarnException>
</AlarmLog>
  • logback: doWarnException、warnExceptionExtend 配置意义与上面一致.
<appender name="AlarmLog" class="com.future94.alarm.log.core.enhance.logback.AlarmLogLogbackAsyncAppender">
    <warnExceptionExtend>false</warnExceptionExtend>
    <doWarnException>java.lang.Exception, java.lang.RuntimeException</doWarnException>
    <appender-ref ref="Console"/>
</appender>

Перевод текста на русский язык:

Класс «com.future94.alarm.log.core.enhance.log4j.AlarmLogLog4jAsyncAppender»:

Параметр «doWarnException» имеет значение «false».
Параметр «warnExceptionExtend» имеет значение «java.lang.Exception, java.lang.RuntimeException».
Ссылка на приложение «Console».

Log4j2:

Конфигурация параметров «doWarnException» и «warnExceptionExtend» аналогична предыдущей. Обратите внимание: тег должен быть «AlarmLog», атрибут «name» может быть произвольным.

Logback:

Конфигурация параметров «doWarnException» и «warnExceptionExtend» аналогична предыдущим. **Конфигурации log4j и logback**

В запросе представлены фрагменты конфигураций для систем логирования log4j, log4j2 и logback. Эти системы используются для настройки ведения журналов в приложениях на Java.

Конфигурационные файлы определяют параметры работы систем логирования: уровни логирования, формат вывода сообщений, обработчики (appender) и их свойства.

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

Конфигурация log4j определяет два обработчика: Console и AlarmLog. Обработчик Console выводит сообщения на консоль, а AlarmLog — в файл. Уровень логирования по умолчанию установлен как INFO. Для обработчика AlarmLog уровень логирования установлен как ERROR. Это означает, что все сообщения с уровнем логирования ниже ERROR будут записываться в файл AlarmLog.

Конфигурация logback также определяет два обработчика: Console и AlarmLog. Они имеют аналогичные функции и настройки, как и в конфигурации log4j.

Асинхронные конфигурации log4j и log4j2 добавляют обработчики AsyncConsole и AsyncAlarmLog для асинхронного вывода сообщений. В конфигурации log4j эти обработчики используют классы AsyncAppender, а в log4j2 — Async. Конфигурация logback: настройка уровня журнала

Конфигурация logback

<appender name="Console" class="ch.qos.logback.core.ConsoleAppender">
    <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
        <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
    </encoder>
</appender>

<appender name="AlarmLog" class="com.future94.alarm.log.core.enhance.logback.AlarmLogLogbackAsyncAppender">
    <warnExceptionExtend>false</warnExceptionExtend>
    <doWarnException>java.lang.Exception,java.lang.RuntimeException</doWarnException>
    <appender-ref ref="Console"/>
</appender>

<appender name="AsyncConsole" class="ch.qos.logback.classic.AsyncAppender">
    <discardingThreshold>0</discardingThreshold>
    <appender-ref ref="Console"/>
</appender>


<appender name="AsyncAlarmLog" class="ch.qos.logback.classic.AsyncAppender">
    <discardingThreshold>0</discardingThreshold>
    <appender-ref ref="AlarmLog"/>
</appender>


<root level="INFO">
    <appender-ref ref="AsyncConsole" />
    <appender-ref ref="AsyncAlarmLog" level="ERROR" />
</root>

Предоставление различных способов получения информации об исключениях в журнале

3.3.1 Системная глобальная конфигурация

spring.alarm-log.do-warn-exception: получает информацию о полном пути класса исключений в журнале, тип — List.

spring.alarm-log.warn-exception-extend: получает информацию об исключении в журнале, чтобы определить, запускать ли наследование. Например, do-warn-exception — java.lang.Throwable, warn-exception-extend — true, тогда все подклассы java.lang.Throwable (например, java.lang.Exception, java.lang.RuntimeException, java.io.IOException и т. д.) будут вызывать предупреждающие события.

<bean id="alarmLogConfigContext" class="com.future94.alarm.log.common.context.AlarmLogContext">
    <property name="warnExceptionExtend" value="true" />
    <property name="doWarnExceptionList">
        <list>
            <value>java.lang.Exception</value>
            <value>java.lang.RuntimeException</value>
        </list>
    </property>
</bean>

3.3.2 Наследование и реализация указанного класса

com.future94.alarm.log.common.exception.AlarmLogException: этот класс наследуется от класса java.lang.Exception и расширяет AlarmLogException. Если в событии журнала возникает это исключение, оно вызывает предупреждающее событие.

com.future94.alarm.log.common.exception.AlarmLogRuntimeException: этот класс наследует класс java.lang.RuntimeException и расширяет AlarmLogException. Если в событии журнала возникает это исключение, оно вызывает предупреждающее событие.

com.future94.alarm.log.common.exception.AlarmLogDoWarnException: реализует интерфейс AlarmLogDoWarnException. Если в событии журнала возникает такое исключение, оно также вызывает предупреждающее событие. Обратите внимание: в настоящее время этот интерфейс должен быть подклассом java.lang.Throwable. Поскольку Java поддерживает только одиночное наследование, при наследовании AlarmLogException может быть неудобно использовать реализацию этого интерфейса.

3.3.3 Настройка журнала

log4j: doWarnException и warnExceptionExtend имеют то же значение, что и выше.

<appender name="AlarmLog" class="com.future94.alarm.log.core.enhance.log4j.AlarmLogLog4jAsyncAppender">
    <param name="doWarnException" value="false"/>
    <param name="warnExceptionExtend" value="java.lang.Exception,java.lang.RuntimeException"/>
    <appender-ref ref="Console"/>
</appender>

log4j2: doWarnException и warnExceptionExtend имеют то же значение, что и выше. Обратите внимание, что тег должен быть AlarmLog, а атрибут name можно указать произвольно.

<AlarmLog name="AlarmLog">
    <warnExceptionExtend>false</warnExceptionExtend>
    <doWarnException>java.lang.Exception,java.lang.RuntimeException</doWarnException>
</AlarmLog>

logback: doWarnException и warnExceptionExtend имеют то же значение, что и выше.

<appender name="AlarmLog" class="com.future94.alarm.log.core.enhance.logback.AlarmLogLogbackAsyncAppender">
    <warnExceptionExtend>false</warnExceptionExtend>
    <doWarnException>java.lang.Exception,java.lang.RuntimeException</doWarnException>
    <appender-ref ref="Console"/>
</appender>

3.3.4 Использование аннотации @Alarm

Необходимо ввести следующую зависимость:

<dependency>
    <groupId>com.future94</groupId>
    <artifactId>alarm-log-aspect</artifactId>
    <version>${latest.version}</version>
</dependency>

и запустить aop, чтобы гарантировать сканирование пакета com.future94.alarm.log.aspect. Текст запроса:

base-package="com.future94.alarm.log" /> <aop:aspectj-autoproxy /> <mvc:annotation-driven /> <aop:aspectj-autoprooxy proxy-target-class="true" /> <aop:config proxy-target-class="true"/>


- doWarnException、warnExceptionExtend配置意义与上面一致。
- 注解加载类上时,注解设置作用域为当前类,只对当前类生效。
- 注解加载方法上时,注кек 设置作用域为当前方法,只对当前方法生效。
```java
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Alarm {

    Class<? extends Throwable>[] doWarnException() default {Throwable.class};

    boolean warnExceptionExtend() default false;
}

Пример:

  • test1 только при выбросе Exception будет срабатывать.
  • test2 будет срабатывать при выбросе TestAspectException или Exception.
@RestController
@Alarm(doWarnException = Exception.class, warnExceptionExtend = false)
public class TestController {

    @GetMapping("/test1")
    public void test1() {
        logger.error("test4", new TestAspectException());
    }

    @GetMapping("/test2")
    @Alarm(doWarnException = TestAspectException.class, warnExceptionExtend = false)
    public void test2() {
        logger.error("test2", new TestAspectException());
    }
}

3.4 Предоставление различных способов мониторинга уведомлений

Различные способы могут быть использованы одновременно, необходимо добавить соответствующие bean в AlarmLogWarnServiceFactory.

<bean id="factory" class="com.future94.alarm.log.warn.common.factory.AlarmLogWarnServiceFactory">
    <constructor-arg>
        <list>
            <ref bean="mailWarnService" />
            <ref bean="dingtalkWarnService" />
            <ref bean="workWeixinWarnService" />
        </list>
    </constructor-arg>
</bean>

3.4.1 Электронная почта

<bean id="mailWarnService" class="com.future94.alarm.log.warn.mail.MailWarnService">
        <constructor-arg index="0" value="${alarmLog.warn.mail.smtpHost}"/>
        <constructor-arg index="1" value="${alarmLog.warn.mail.smtpPort}"/>
        <!--多个用逗号分割-->
        <constructor-arg index="2" value="${alarmLog.warn.mail.to}"/>
        <constructor-arg index="3" value="${alarmLog.warn.mail.from}"/>
        <constructor-arg index="4" value="${alarmLog.warn.mail.username}"/>
        <constructor-arg index="5" value="${alarmLog.warn.mail.password}"/>
</bean>

<bean id="factory" class="com.future94.alarm.log.warn.common.factory.AlarmLogWarnServiceFactory">
    <constructor-arg>
        <list>
            <ref bean="mailWarnService" />
        </list>
    </constructor-arg>
</bean>

3.4.2 Корпоративный WeChat

<bean id="workWeixinWarnService" class="com.future94.alarm.log.warn.workweixin.WorkWeixinWarnService">
    <!--多个用逗号分割-->
    <constructor-arg index="0" value="${alarmLog.warn.workweixin.to}"/>
    <constructor-arg index="1" value="${alarmLog.warn.workweixin.applicationId}"/>
    <constructor-arg index="2" value="${alarmLog.warn.workweixin.corpid}"/>
    <constructor-arg index="3" value="${alarmLog.warn.workweixin.corpsecret}"/>
</bean>

<bean id="factory" class="com.future94.alarm.log.warn.common.factory.AlarmLogWarnServiceFactory">
    <constructor-arg>
        <list>
            <ref bean="workWeixinWarnService" />
        </list>
    </constructor-arg>
</bean>

3.4.3 Группа DingTalk

<bean id="dingtalkWarnService" class="com.future94.alarm.log.warn.dingtalk.DingtalkWarnService">
        <constructor-arg index="0" value="${alarmLog.warn.dingtalk.token}"/>
        <constructor-arg index="1" value="${alarmLog.warn.dingtalk.secret}"/>
    </bean>

<bean id="factory" class="com.future94.alarm.log.warn.common.factory.AlarmLogWarnServiceFactory">
    <constructor-arg>
        <list>
            <ref bean="dingtalkWarnService" />
        </list>
    </constructor-arg>
</bean>

3.5 Настройка повторной попытки отправки сообщения об ошибке

  • maxRetryTimes : максимальное количество попыток
  • retrySleepMillis : интервал ожидания между каждой попыткой, итоговый эффект равен [retrySleepMillis * ( 1 << maxRetryTimes )]
<bean id="alarmLogConfigContext" class="com.future94.alarm.log.common.context.AlarmLogContext">
    <property name="maxRetryTimes" value="1" />
    <property name="retrySleepMillis" value="3000" />
</bean>

4. Пользовательское содержимое сообщения

4.1 Пользовательское содержание сообщения

  • Реализовать интерфейс com.future94.alarm.log.common.context.AlarmMessageContext.
  • Наследовать класс com.future94.alarm.log.common.context.DefaultAlarmMessageContext. 4.2. Идентификация фреймворка

4.2.1 SpringBoot

@Компонент
public class CustomAlarmMessageContext1 реализует AlarmMessageContext {

    @Override
    public String workWeixinContent(AlarmInfoContext context, Throwable throwable, AlarmLogSimpleConfig config) {
        // TODO отправить контент
        return null;
    }

    @Override
    public String dingtalkContent(AlarmInfoContext context, Throwable throwable, AlarmLogSimpleConfig config) {
        // TODO отправить контент
        return null;
    }

    @Override
    public AlarmMailContent mailContent(AlarmInfoContext context, Throwable throwable, AlarmLogSimpleConfig config) {
        // TODO отправить контент
        return null;
    }
}

4.2.2 SpringMVC

Необходимо внедрить в AlarmLogContext следующим образом:

@Component
public class CustomAlarmMessageContext1 implements AlarmMessageContext, InitializingBean {

    @Override
    public String workWeixinContent(AlarmInfoContext context, Throwable throwable, AlarmLogSimpleConfig config) {
        // TODO отправить контент
        return null;
    }

    @Override
    public String dingtalkContent(AlarmInfoContext context, Throwable throwable, AlarmLogSimpleConfig config) {
        // TODO отправить контент
        return null;
    }

    @Override
    public AlarmMailContent mailContent(AlarmInfoContext context, Throwable throwable, AlarmLogSimpleConfig config) {
        // TODO отправить контент
        return null;
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        AlarmLogContext.setAlarmMessageContext(this);
    }
}

Или настроить в XML:

<bean id="context1" class="com.future94.alarm.log.examples.spring.mvc.log4j.bean.CustomAlarmMessageContext1" />

<bean id="alarmLogConfigContext" class="com.future94.alarm.log.common.context.AlarmLogContext">
    <property name="alarmMessageContext" ref="context1"/>
</bean>

4.2.3 Не Spring

Просто внедрите пользовательский контент в AlarmLogContext:

AlarmLogContext.setAlarmMessageContext(new AlarmMessageContext());

5. Печать журнала

Если вы хотите печатать журнал и отправлять уведомления о предупреждениях в не-ошибках, вы можете использовать следующий вспомогательный класс:

AlarmLogHelper.getPrintLogInstance() по умолчанию не отправляет сообщения, но если вы хотите отправить сообщение о предупреждении, вы можете использовать AlarmLogHelper.getPrintLogInstance(true).

Например:

AlarmLogHelper.getPrintLogInstance().error("123");
AlarmLogHelper.getPrintLogInstance().error("123:{}", 456, new RuntimeException());
AlarmLogHelper.getPrintLogInstance(true).error("123");
AlarmLogHelper.getPrintLogInstance(true).error("123:{}", 456, new RuntimeException());

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/future94-alarm-log.git
git@api.gitlife.ru:oschina-mirror/future94-alarm-log.git
oschina-mirror
future94-alarm-log
future94-alarm-log
master