動(dòng)手寫(xiě)個(gè)java快速開(kāi)發(fā)框架-(1)系統(tǒng)日志

在任何一個(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付燥。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市愈犹,隨后出現(xiàn)的幾起案子键科,更是在濱河造成了極大的恐慌,老刑警劉巖漩怎,帶你破解...
    沈念sama閱讀 221,820評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件勋颖,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡勋锤,警方通過(guò)查閱死者的電腦和手機(jī)饭玲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)怪得,“玉大人咱枉,你說(shuō)我怎么就攤上這事⊥搅担” “怎么了蚕断?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,324評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)入挣。 經(jīng)常有香客問(wèn)我亿乳,道長(zhǎng),這世上最難降的妖魔是什么径筏? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,714評(píng)論 1 297
  • 正文 為了忘掉前任葛假,我火速辦了婚禮,結(jié)果婚禮上滋恬,老公的妹妹穿的比我還像新娘聊训。我一直安慰自己,他們只是感情好恢氯,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布带斑。 她就那樣靜靜地躺著,像睡著了一般勋拟。 火紅的嫁衣襯著肌膚如雪勋磕。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,328評(píng)論 1 310
  • 那天敢靡,我揣著相機(jī)與錄音,去河邊找鬼啸胧。 笑死赶站,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的吓揪。 我是一名探鬼主播亲怠,決...
    沈念sama閱讀 40,897評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼柠辞!你這毒婦竟也來(lái)了团秽?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,804評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤叭首,失蹤者是張志新(化名)和其女友劉穎习勤,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體焙格,經(jīng)...
    沈念sama閱讀 46,345評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡图毕,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了眷唉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片予颤。...
    茶點(diǎn)故事閱讀 40,561評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡囤官,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蛤虐,到底是詐尸還是另有隱情党饮,我是刑警寧澤,帶...
    沈念sama閱讀 36,238評(píng)論 5 350
  • 正文 年R本政府宣布驳庭,位于F島的核電站刑顺,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏饲常。R本人自食惡果不足惜蹲堂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評(píng)論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望贝淤。 院中可真熱鬧柒竞,春花似錦、人聲如沸霹娄。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,417評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)犬耻。三九已至踩晶,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間枕磁,已是汗流浹背渡蜻。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,528評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留计济,地道東北人茸苇。 一個(gè)月前我還...
    沈念sama閱讀 48,983評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像沦寂,于是被迫代替她去往敵國(guó)和親学密。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容