核心功能:
详情查看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级别的日志,如果level是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"/>
</appender>
<appender name="AsyncConsole" class="org.apache.log4j.AsyncAppender">
<appender-ref ref="Console"/>
</appender>
<appender name="AsyncAlarmLog" class="org.apache.log4j.AsyncAppender">
<appender-ref ref="AlarmLog"/>
</appender>
<root>
<priority value="info" />
<appender-ref ref="AsyncConsole"/>
<appender-ref ref="AsyncAlarmLog"/>
</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>
<!--异步输出到控制台-->
<Async name="AsyncConsole">
<AppenderRef ref="Console"/>
</Async>
<!--异步-->
<Async name="AsyncAlarmLog">
<AppenderRef ref="AlarmLog"/>
</Async>
</appenders>
<!--然后定义logger,只有定义了logger并引入的appender,appender才会生效-->
<loggers>
<root level="INFO">
<appender-ref ref="AsyncConsole"/>
<!-- AlarmLog 处理有打印INFO级别的日志,如果level是INFO级别会循环调用,抛出 ERROR Recursive call to appender ALARM_LOG,所以最好将ALARM_LOG 的级别设置为ERROR -->
<appender-ref ref="AsyncAlarmLog" 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>
<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>
</configuration>
spring:
alarm-log:
warn-exception-extend: false
do-warn-exception:
- java.lang.Throwable
- java.lang.Exception
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异常时,可以使用实现此接口的方式。
<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>
<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>
@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 test1() {
logger.error("test2", new TestAspectException());
}
}
多种方式可以同时使用,设置其enabled为true即可。
spring:
alarm-log:
warn:
mail:
enabled: true
smtpHost: xxx
smtpPort: xxx
# 邮箱,多个用逗号分开
to: future94@qq.com,xxx
from: xxx
username: xxx
password: xxx
spring:
alarm-log:
warn:
workweixin:
enabled: true
# 企业ID,多个用逗号分开
to: WeiLai,xxx
applicationId: xxx
corpid: xxx
corpsecret: xxx
spring:
alarm-log:
warn:
dingtalk:
enabled: true
token: xxx
secret: xxx
spring:
alarm-log:
max-retry-times: 1
retry-sleep-millis: 3000
具体示例可以查看alarm-log-examples-spring-mv
包
<dependency>
<groupId>com.future94</groupId>
<artifactId>alarm-log-core</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级别的日志,如果level是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"/>
</appender>
<appender name="AsyncConsole" class="org.apache.log4j.AsyncAppender">
<appender-ref ref="Console"/>
</appender>
<appender name="AsyncAlarmLog" class="org.apache.log4j.AsyncAppender">
<appender-ref ref="AlarmLog"/>
</appender>
<root>
<priority value="info" />
<appender-ref ref="AsyncConsole"/>
<appender-ref ref="AsyncAlarmLog"/>
</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>
<!--异步输出到控制台-->
<Async name="AsyncConsole">
<AppenderRef ref="Console"/>
</Async>
<!--异步-->
<Async name="AsyncAlarmLog">
<AppenderRef ref="AlarmLog"/>
</Async>
</appenders>
<!--然后定义logger,只有定义了logger并引入的appender,appender才会生效-->
<loggers>
<root level="INFO">
<appender-ref ref="AsyncConsole"/>
<!-- AlarmLog 处理有打印INFO级别的日志,如果level是INFO级别会循环调用,抛出 ERROR Recursive call to appender ALARM_LOG,所以最好将ALARM_LOG 的级别设置为ERROR -->
<appender-ref ref="AsyncAlarmLog" 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>
<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>
</configuration>
<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>
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异常时,可以使用实现此接口的方式。
<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>
<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>
需要引入如下依赖
<dependency>
<groupId>com.future94</groupId>
<artifactId>alarm-log-aspect</artifactId>
<version>${latest.version}</version>
</dependency>
并启动aop,保证可以扫描到com.future94.alarm.log.aspect
包
<context:component-scan base-package="com.future94.alarm.log" />
<aop:aspectj-autoproxy />
<mvc:annotation-driven />
<aop:aspectj-autoproxy proxy-target-class="true" />
<aop:config proxy-target-class="true"/>
@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 test1() {
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
类如果你想自定义所有报警发送的内容,你可以实现AlarmMessageContext
接口,如果你只想自定义指定渠道的内容,你可以继承DefaultAlarmMessageContext
类.
@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;
}
}
需要注入到AlarmLogContext中,像下面这样。
@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中配置。
<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());
如果在非error日志时也想打印日志并且发送警告通知,可以使用下面的帮助类。
AlarmLogHelper.getPrintLogInstance()
,默认不发送消息,如果发送报警消息,可以使用AlarmLogHelper.getPrintLogInstance(true)
。
eg:
AlarmLogHelper.getPrintLogInstance().error("123");
AlarmLogHelper.getPrintLogInstance().error("123:{}", 456, new RuntimeException());
AlarmLogHelper.getPrintLogInstance(true).error("123");
AlarmLogHelper.getPrintLogInstance(true).error("123:{}", 456, new RuntimeException());
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。
1. 开源生态
2. 协作、人、软件
3. 评估模型