# alarm-log
**Repository Path**: future94/alarm-log
## Basic Information
- **Project Name**: alarm-log
- **Description**: 日志监控报警,支持log4j、log4j2、logback等主流框架,支持SpringBoot、SpringMVC等框架,支持发送到钉钉、企业微信、邮箱等。
- **Primary Language**: Java
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 38
- **Forks**: 11
- **Created**: 2021-08-12
- **Last Updated**: 2025-04-25
## Categories & Tags
**Categories**: logging
**Tags**: log, Java
## README
- github: https://github.com/future94/alarm-log
- gitee : https://gitee.com/future94/alarm-log
## 1. 日志监控报警
**核心功能**:
- 监控日志中抛出的指定异常或者方法与类中抛出的指定异常,发送到钉钉、企业微信、邮箱等。
- 支持log4j、log4j2、logback等主流框架。
- 支持SpringBoot、SpringMVC等框架。
## 2. SpringBoot
详情查看`alarm-log-examples-spring-boot`包下代码
### 2.1 集成
#### 引入如下依赖
```xml
com.future94
alarm-log-spring-boot-starter
${latest.version}
```
### 2.2 引入日志监控
#### 2.2.1 同步方式
- **log4j** : 配置项说明见[2.3.3 日志配置中设置](#233-日志配置中设置)
```xml
```
- **log4j2** : 配置项说明见[2.3.3 日志配置中设置](#233-日志配置中设置)
```xml
false
java.lang.Exception,java.lang.RuntimeException
```
- **logback** : 配置项说明见[2.3.3 日志配置中设置](#233-日志配置中设置)
```xml
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
false
java.lang.Exception,java.lang.RuntimeException
true
```
#### 2.2.2 异步方式
- **log4j** : 配置项说明见[2.3.3 日志配置中设置](#233-日志配置中设置)
```xml
```
- **log4j2** : 配置项说明见[2.3.3 日志配置中设置](#233-日志配置中设置)
```xml
false
java.lang.Exception,java.lang.RuntimeException
```
- **logback** : 配置项说明见[2.3.3 日志配置中设置](#233-日志配置中设置)
```xml
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
false
java.lang.Exception,java.lang.RuntimeException
0
0
```
### 2.3 提供多种方式获取指定的日志异常信息
#### 2.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等)都会触发警告事件。
```yaml
spring:
alarm-log:
warn-exception-extend: false
do-warn-exception:
- java.lang.Throwable
- java.lang.Exception
```
#### 2.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是单继承,目前项目中不方便继承AlarmLog异常时,可以使用实现此接口的方式。
#### 2.3.3 日志配置中设置
- **log4j** : doWarnException、warnExceptionExtend配置意义与上面一致。
```xml
```
- **log4j2** : doWarnException、warnExceptionExtend配置意义与上面一致。注意:标签必须为AlarmLog,name属性可以随意。
```xml
false
java.lang.Exception,java.lang.RuntimeException
```
- **logback** : doWarnException、warnExceptionExtend配置意义与上面一致。
```xml
false
java.lang.Exception,java.lang.RuntimeException
```
#### 2.3.4 使用@Alarm注解
- 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时都会触发。
```java
@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 test1() {
logger.error("test2", new TestAspectException());
}
}
```
### 2.4 提供多种监控通知方式
多种方式可以同时使用,设置其enabled为true即可。
#### 2.4.1 邮件
```yaml
spring:
alarm-log:
warn:
mail:
enabled: true
smtpHost: xxx
smtpPort: xxx
# 邮箱,多个用逗号分开
to: future94@qq.com,xxx
from: xxx
username: xxx
password: xxx
```
#### 2.4.2 企业微信
```yaml
spring:
alarm-log:
warn:
workweixin:
enabled: true
# 企业ID,多个用逗号分开
to: WeiLai,xxx
applicationId: xxx
corpid: xxx
corpsecret: xxx
```
#### 2.4.3 钉钉群
```yaml
spring:
alarm-log:
warn:
dingtalk:
enabled: true
token: xxx
secret: xxx
```
### 2.5 配置警告消息发送异常重试
- maxRetryTimes : 最大重试次数
- retrySleepMillis : 每次重试等待间隔,最终效果【retrySleepMillis * ( 1 << maxRetryTimes )】
```yaml
spring:
alarm-log:
max-retry-times: 1
retry-sleep-millis: 3000
```
## 3. SpringMvc
具体示例可以查看`alarm-log-examples-spring-mv`包
### 3.1 集成
#### 引入核心包依赖
```xml
com.future94
alarm-log-core
${latest.version}
```
### 3.2 引入日志监控
#### 3.2.1 同步方式
- **log4j** : 配置项说明见[3.3.3 日志配置中设置](#333-日志配置中设置)
```xml
```
- **log4j2** : 配置项说明见[3.3.3 日志配置中设置](#333-日志配置中设置)
```xml
false
java.lang.Exception,java.lang.RuntimeException
```
- **logback** : 配置项说明见[3.3.3 日志配置中设置](#333-日志配置中设置)
```xml
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
false
java.lang.Exception,java.lang.RuntimeException
true
```
#### 3.2.2 异步方式
- **log4j** : 配置项说明见[3.3.3 日志配置中设置](#333-日志配置中设置)
```xml
```
- **log4j2** : 配置项说明见[3.3.3 日志配置中设置](#333-日志配置中设置)
```xml
false
java.lang.Exception,java.lang.RuntimeException
```
- **logback** : 配置项说明见[3.3.3 日志配置中设置](#333-日志配置中设置)
```xml
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
false
java.lang.Exception,java.lang.RuntimeException
0
0
```
### 3.3 提供多种方式获取指定的日志异常信息
#### 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等)都会触发警告事件。
```xml
java.lang.Exception
java.lang.RuntimeException
```
#### 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是单继承,目前项目中不方便继承AlarmLog异常时,可以使用实现此接口的方式。
#### 3.3.3 日志配置中设置
- **log4j** : doWarnException、warnExceptionExtend配置意义与上面一致。
```xml
```
- **log4j2** : doWarnException、warnExceptionExtend配置意义与上面一致。注意:标签必须为AlarmLog,name属性可以随意。
```xml
false
java.lang.Exception,java.lang.RuntimeException
```
- **logback** : doWarnException、warnExceptionExtend配置意义与上面一致。
```xml
false
java.lang.Exception,java.lang.RuntimeException
```
#### 3.3.4 使用@Alarm注解
需要引入如下依赖
```xml
com.future94
alarm-log-aspect
${latest.version}
```
并启动aop,保证可以扫描到`com.future94.alarm.log.aspect`包
```xml
```
- 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时都会触发。
```java
@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 test1() {
logger.error("test2", new TestAspectException());
}
}
```
### 3.4 提供多种监控通知方式
多种方式可以同时使用,将其对应的bean添加到AlarmLogWarnServiceFactory即可。
```xml
```
#### 3.4.1 邮件
```xml
```
#### 3.4.2 企业微信
```xml
```
#### 3.4.3 钉钉群
```xml
```
### 3.5 配置警告消息发送异常重试
- maxRetryTimes : 最大重试次数
- retrySleepMillis : 每次重试等待间隔,最终效果【retrySleepMillis * ( 1 << maxRetryTimes )】
```xml
```
## 4. 自定义发送信息内容
### 4.1 自定义发送内容
- 实现`com.future94.alarm.log.common.context.AlarmMessageContext`接口
- 继承`com.future94.alarm.log.common.context.DefaultAlarmMessageContext`类
如果你想自定义所有报警发送的内容,你可以实现`AlarmMessageContext`接口,如果你只想自定义指定渠道的内容,你可以继承`DefaultAlarmMessageContext`类.
### 4.2 框架识别
#### 4.2.1 SpringBoot
```java
@Component
public class CustomAlarmMessageContext1 implements AlarmMessageContext {
@Override
public String workWeixinContent(AlarmInfoContext context, Throwable throwable, AlarmLogSimpleConfig config) {
// TODO send content
return null;
}
@Override
public String dingtalkContent(AlarmInfoContext context, Throwable throwable, AlarmLogSimpleConfig config) {
// TODO send content
return null;
}
@Override
public AlarmMailContent mailContent(AlarmInfoContext context, Throwable throwable, AlarmLogSimpleConfig config) {
// TODO send content
return null;
}
}
```
#### 4.2.2 SpringMVC
需要注入到AlarmLogContext中,像下面这样。
```java
@Component
public class CustomAlarmMessageContext1 implements AlarmMessageContext, InitializingBean {
@Override
public String workWeixinContent(AlarmInfoContext context, Throwable throwable, AlarmLogSimpleConfig config) {
// TODO send content
return null;
}
@Override
public String dingtalkContent(AlarmInfoContext context, Throwable throwable, AlarmLogSimpleConfig config) {
// TODO send content
return null;
}
@Override
public AlarmMailContent mailContent(AlarmInfoContext context, Throwable throwable, AlarmLogSimpleConfig config) {
// TODO send content
return null;
}
@Override
public void afterPropertiesSet() throws Exception {
AlarmLogContext.setAlarmMessageContext(this);
}
}
```
或者在xml中配置。
```xml
```
#### 4.2.3 非Spring
将自定义内容注入到AlarmLogContext中即可。
```java
AlarmLogContext.setAlarmMessageContext(new AlarmMessageContext());
```
## 5. 打印日志
如果在非error日志时也想打印日志并且发送警告通知,可以使用下面的帮助类。
`AlarmLogHelper.getPrintLogInstance()`,默认不发送消息,如果发送报警消息,可以使用`AlarmLogHelper.getPrintLogInstance(true)`。
eg:
```java
AlarmLogHelper.getPrintLogInstance().error("123");
AlarmLogHelper.getPrintLogInstance().error("123:{}", 456, new RuntimeException());
AlarmLogHelper.getPrintLogInstance(true).error("123");
AlarmLogHelper.getPrintLogInstance(true).error("123:{}", 456, new RuntimeException());
```