Основные функции:
Подробности смотрите в пакете alarm-log-examples-spring-boot
.
<dependency>
<groupId>com.future94</groupId>
<artifactId>alarm-log-spring-boot-starter</artifactId>
<version>${latest.version}</version>
</dependency>
<!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>
<?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>
<?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>
<!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>
<AlarmLog name="AlarmLog">
<warnExceptionExtend>false</warnExceptionExtend>
<doWarnException>java.lang.Exception, java.lang.RuntimeException</doWarnException>
</AlarmLog>
<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;
}
Пример:
@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());
}
}
Различные способы могут быть использованы одновременно, необходимо добавить соответствующие 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>
<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>
<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>
<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>
<bean id="alarmLogConfigContext" class="com.future94.alarm.log.common.context.AlarmLogContext">
<property name="maxRetryTimes" value="1" />
<property name="retrySleepMillis" value="3000" />
</bean>
com.future94.alarm.log.common.context.AlarmMessageContext
.com.future94.alarm.log.common.context.DefaultAlarmMessageContext
. 4.2. Идентификация фреймворка
@Компонент
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;
}
}
Необходимо внедрить в 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>
Просто внедрите пользовательский контент в AlarmLogContext:
AlarmLogContext.setAlarmMessageContext(new AlarmMessageContext());
Если вы хотите печатать журнал и отправлять уведомления о предупреждениях в не-ошибках, вы можете использовать следующий вспомогательный класс:
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 )