在任何一個(gè)開(kāi)發(fā)框架中都會(huì)涉及到日志模塊瓮增,在MkFramework中同樣也有日志模塊,只是日志模塊沒(méi)有那么復(fù)雜比較簡(jiǎn)單哩俭,下面就來(lái)介紹下框架中日志模塊如何實(shí)現(xiàn)的绷跑。
框架中日志主要使用slf4j和logback進(jìn)行文件日志記錄,后續(xù)也會(huì)講到如何在基本不改動(dòng)代碼的情況下將日志記錄到數(shù)據(jù)庫(kù)中凡资。日常的info砸捏、error這些日志的記錄方式和大家常見(jiàn)的用法一樣,今天在框架中增加的系統(tǒng)日志是切面日志的功能隙赁,通過(guò)注解來(lái)實(shí)現(xiàn)系統(tǒng)日志的記錄垦藏,框架中的系統(tǒng)日志記錄的數(shù)據(jù)結(jié)構(gòu)大家可以根據(jù)自己公司的要求進(jìn)行定制,不局限在我這里列出的鸳谜。
下面說(shuō)下實(shí)現(xiàn)的效果膝藕,就是在需要記錄系統(tǒng)日志的方法前面加上注解@SysLog就可以自動(dòng)記錄這個(gè)方法的入?yún)ⅰ⒎椒ê臅r(shí)咐扭、操作用戶芭挽,如果是針對(duì)網(wǎng)絡(luò)接口的方法還可以記錄請(qǐng)求ip地址、url等相關(guān)信息蝗肪,具體記錄哪些都是由開(kāi)發(fā)者自己決定袜爪,可以根據(jù)框架的現(xiàn)有代碼進(jìn)行定制修改。
@SysLog("測(cè)試")
@PostMapping("/test")
public String testController(@RequestBody Map req){
return "hello";
}
加了注解之后會(huì)自動(dòng)記錄到文件或數(shù)據(jù)庫(kù)中薛闪,具體記錄到哪里根據(jù)代碼實(shí)現(xiàn)和配置來(lái)決定辛馆,本篇介紹下記錄到文件中的方案。
自動(dòng)記錄的日志信息如下:
2018-09-06 17:09:10.455 c.m.c.service.impl.SysLogServiceImpl : {id=null, username='null', operation='測(cè)試', method='com.monkey01.modules.module1.controller.TestController.testController()', url='http://localhost:8090/mk/test', params='{"test":"1234"}', time=22, ip='0:0:0:0:0:0:0:1', createDate=Thu Sep 06 17:09:10 CST 2018}
是不是很方便豁延,用來(lái)查問(wèn)題的關(guān)鍵信息都可以根據(jù)你的要求寫(xiě)到日志昙篙,不用在在logger后面加一堆信息了,在要記錄日志的方法前面加上一個(gè)@SysLog注解就可以自動(dòng)記錄這些日志信息了诱咏,是不是很方便苔可,下面看看如何來(lái)實(shí)現(xiàn)的。
首先定義SysLog注解,因?yàn)槭黔h(huán)繞注解定義的類型是METHOD袋狞,只能適用于函數(shù)方法焚辅。
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface SysLog {
String value() default "";
}
定義好了注解映屋,下面就要開(kāi)始定義處理注解的類,這里為了進(jìn)行全局處理我們定義了切面類同蜻。這里就不介紹具體如何進(jìn)行自定義注解了棚点,想了解的同學(xué)可以看下我之前的一篇文章Java自定義注解詳解+實(shí)例。我將在切面類中記錄日志的主要操作都寫(xiě)了注釋湾蔓,具體實(shí)現(xiàn)看注釋就很容易理解了瘫析。
@Aspect
@Component
public class SysLogAspect {
@Autowired
private SysLogService sysLogService;
@Pointcut("@annotation(com.monkey01.common.annotation.SysLog)")
public void logPointCut() {
}
@Around("logPointCut()")
public Object around(ProceedingJoinPoint point) throws Throwable {
long beginTime = System.currentTimeMillis();
//執(zhí)行方法
Object result = point.proceed();
//執(zhí)行時(shí)長(zhǎng)(毫秒)
long time = System.currentTimeMillis() - beginTime;
//保存日志
saveSysLog(point, time);
return result;
}
private void saveSysLog(ProceedingJoinPoint joinPoint, long time) {
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Method method = signature.getMethod();
SysLogDO sysLog = new SysLogDO();
SysLog syslog = method.getAnnotation(SysLog.class);
if(syslog != null){
//記錄注解上的描述,在實(shí)際使用過(guò)程中可以將具體的業(yè)務(wù)描述信息寫(xiě)在里面卵蛉,這樣查詢?nèi)罩颈容^方便
sysLog.setOperation(syslog.value());
}
//獲取請(qǐng)求的方法名
String className = joinPoint.getTarget().getClass().getName();
String methodName = signature.getName();
sysLog.setMethod(className + "." + methodName + "()");
//獲取請(qǐng)求的參數(shù)并轉(zhuǎn)換成json字符串方便查看
Object[] args = joinPoint.getArgs();
try{
String params = new Gson().toJson(args[0]);
sysLog.setParams(params);
}catch (Exception e){
}
//如果是針對(duì)網(wǎng)絡(luò)請(qǐng)求的系統(tǒng)日志可以獲取request
HttpServletRequest request = HttpContextUtils.getHttpServletRequest();
//設(shè)置IP地址
sysLog.setIp(IPUtils.getIpAddr(request));
//設(shè)置請(qǐng)求URL
sysLog.setUrl(request.getRequestURL().toString());
sysLog.setTime(time);
sysLog.setCreateDate(new Date());
//保存系統(tǒng)日志
sysLogService.saveSysLog(sysLog);
}
}
從代碼中大家可以發(fā)現(xiàn)還需要定義SysLog的實(shí)體類颁股、SysLogService處理類,這里就不貼具體代碼了具體代碼參看github上源碼傻丝,SysLog實(shí)體類中主要是定義了需要系統(tǒng)日志記錄的關(guān)鍵信息甘有,這里大家可以自己根據(jù)需要定制。在SysLogService中主要是對(duì)日志處理進(jìn)行了抽象葡缰,第一版是只記錄到文件亏掀,后續(xù)的版本會(huì)支持記錄到數(shù)據(jù)庫(kù)或者文件數(shù)據(jù)庫(kù)同時(shí)記錄。大家可以通過(guò)TestController里的測(cè)試接口進(jìn)行測(cè)試泛释,看看在控制臺(tái)和日志文件里是不是按照你的需要自動(dòng)記錄了系統(tǒng)日志滤愕。
這篇比較簡(jiǎn)單先讓大家熱熱身后面會(huì)講到很多大家在實(shí)際項(xiàng)目中用到的數(shù)據(jù)庫(kù)操作、接口安全防護(hù)怜校、異常統(tǒng)一處理等等间影。
為了方便大家根據(jù)自己的進(jìn)度看代碼,我將每篇文章對(duì)應(yīng)的可執(zhí)行工程都單獨(dú)打了tag發(fā)布到github上茄茁,例如本篇是篇1魂贬,那么對(duì)應(yīng)的tag是v0.1-SysLog , 大家可以點(diǎn)擊直接下載,也可以通過(guò)git clone –b v0.1-SysLog https://github.com/feiweiwei/MkFramework4java.git
進(jìn)行下載裙顽,歡迎大家對(duì)項(xiàng)目star或fork付燥。