Skip to content

Latest commit

 

History

History
132 lines (87 loc) · 3.53 KB

Eye告警功能实现.md

File metadata and controls

132 lines (87 loc) · 3.53 KB

功能:

主要解决生产出现的问题,比如mycat宕机,假死,慢SQL,还可以分析出现异常的日志, 出现这些情况后 发邮件提醒

实现方法:

使用Log4j2中的SMTP Appender,发送HTML格式的邮件LOG,并加入了RegexFilter,满足指定条件的Log才发送邮件。

相关配置

pom.xml引入Java Mail和disruptor(log4j2异步用)。

	<dependency>
		<groupId>javax.mail</groupId>
		<artifactId>mail</artifactId>
		version>1.4</version>
	</dependency>

	<dependency>
		<groupId>com.lmax</groupId>
		<artifactId>disruptor</artifactId>
		<version>3.3.4</version>
	</dependency>	

log4j2.xml中配置下列信息

	<properties>
        ......
        <property name="from">[email protected]</property>
        <property name="smtpHost">smtp.163.com</property>
        <property name="smtpPort">25</property>
        <property name="smtpProtocol">smtp</property>
        <property name="smtpUser">me</property>
        <property name="smtpPassword">secret</property>
    </properties>
	<appenders>
        ......
		<SMTP name="Mail" 
			subject="Error Log" 
			to="[email protected],[email protected]"
			cc="[email protected],[email protected]" 	
			from="${from}" 
			smtpUsername="${smtpUser}" 	
			smtpPassword="${smtpPassword}"
		    smtpHost="${smtpHost}" 
			smtpPort="${smtpPort}" 
			bufferSize="1" 
			smtpProtocol="${smtpProtocol}" 
			smtpDebug="false">
			<!-- 消息过滤器 -->
	     	<RegexFilter regex=".* test .*" onMatch="ACCEPT" 	onMismatch="DENY"/>
		</SMTP>
	</appenders>
	<loggers>
		......
		<Root level="error">
  			<AppenderRef ref="Mail" />
		</Root>
	</loggers>

测试代码

package org.mycat.web;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


public class Test {

	private static final Logger LOG = LoggerFactory.getLogger(Test.class);
	
	public static void main(String[] args) {
		LOG.error(" test ");
		LOG.error("Mail");
	}

}

测试结果: 第一句Log满足条件发送。第2句不发送。

Log4j2异步功能 在启动时加入以下参数

-DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector

Log4j2动态配置

方案1:

配置monitorInterval属性,最小5秒。每隔指定时间,扫描配置文件,发生变更,则生效。

	<configuration status="OFF"  monitorInterval="1800">  

画面配置参数后,手工修改配置文件并保存。Log4j会自动更新,也可以手动更新。

手工修改配置文件,可能会比较复杂。一种是以XML方式修改。另一种是把设定参数写在property中,以文本方式修改此行数据。也可使用模板技术修改。

例:

    <property name="to">[email protected]</property>

方案2:个人推荐 使用System Property作为参数值。

    <property name="to">${sys:mailto}</property>

画面修改后,设置SystemProperty,并手工更新配置。

	System.setProperty("mailto", "[email protected]");
	((LoggerContext) LogManager.getContext(false)).reconfigure();

方案3: 如需有大量的配置需要设定,维护。建议使用程序生成配置。复杂性较大,不在此次对应内。

定期监测事件

现有解决方案(适用于检查Mycat死机,假死):

定期触发一次监测事件请求。 接受到请求后,再每个DB,开一个线程监测,如该线程发生超时timeout,则发生邮件报警。