1、架构设计
废话不多说,先上一张图。

如上异常行为的设计图所示,这种设计方案有几个好处:
- 侵入性较低,各模块功能比较独立。
- 没有因为需要判断异常行为,导致系统的性能有明显降低。
- 实现比较容易,日志记录可以借用log4j的API,分析需要自己写线程。
- 集成容易,在代码编写时,可以直接调用日志方法。如果不需要分析了,修改一下日志方法即可。
2、实现方式
2.1日志记录的实现方式
参考博客:http://www.cnblogs.com/ITtangtang/p/3926665.html
简单的说就是使用log4j的日志功能,写一个自己想要的日志,例如我想取得一个用户登录的日志,需要记录异常时间、应用系统ID、用户登录ID、用户登录IP,记录使用“[”开头,“]”结尾,分割符为“|||”,日志文件中,一行为一个日志,需要日志配置如下:
# extProfile
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.conversionPattern=[%d{yyyy-MM-dd HH\:mm\:ss,SSS}|||%m]%n
#日志级别是INFO,标签是extProfile
log4j.logger.extProfile=INFO,extProfile
#输出到指定文件extProfile.log中
log4j.additivity.extProfile=false
log4j.appender.extProfile=org.apache.log4j.RollingFileAppender
#输出到resin根目录的logs文件夹,log4j会自动生成目录和文件
log4j.appender.extProfile.File=logs/event/extProfile.log
#超过20M就重新创建一个文件
log4j.appender.extProfile.MaxFileSize=20480KB
log4j.appender.extProfile.MaxBackupIndex=10
log4j.appender.extProfile.layout=org.apache.log4j.PatternLayout
log4j.appender.extProfile.layout.ConversionPattern={eventTime:%d{yyyy-MM-dd HH\:mm\:ss,SSS},%m}%n
具体的日志配置参数说明,查看传送门:
JAVA代码中使用原则如下:
public class Serious {
private static Logger logger = LoggerFactory.getLogger("extProfile");
public static void main(String[] agrs) {
int i = 0;
while (true) {
logger.info("10000231|||测试日志|||asdfjkj");
i++;
if (i> 1_000_000) break;
}
}
}
最后的结果如下图所示:

2.2异常分析组件的实现
2.3异常分析汇聚
此功能请各位自行研发,后期我再贴出代码说明。
3、结束语
这是一个简单的日志异常行为分析系统,有很多特殊情况没有考虑到,例如日志过大,或者分布式系统。但是有古话很对,这句就是“没有最优秀的,只有最合适的”。
网友评论