# 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[] 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[] 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()); ```