Springboot AOP + logback + Unified exception handling print log

Source: Internet
Author: User
Tags modifier

New Logback.xml under 1.src/resources path
    • Console color Log Printing
    • Info log and Exception log separate file storage
    • Automatically generate logs daily
    • Combined with Myibatis for convenient log printing (debug mode)
<?xml version= "1.0" encoding= "UTF-8"? ><configuration debug= "false" > <!--defines the storage address of the log file can be in Logback    The configuration uses a relative path--<property name= "Log_home" value= "Logs"/> <!--color Log--<!--color log dependent rendering class-- <conversionrule conversionword= "CLR" converterclass= "Org.springframework.boot.logging.logback.ColorConverter" /> <conversionrule conversionword= "Wex" converterclass= " Org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter "/> <conversionrule Conversionword= "WEx" converterclass= "org.springframework.boot.logging.logback.ExtendedWhitespaceThrowab Leproxyconverter "/> <!--color log format--<property name=" Console_log_pattern "value=" ${console_ LOG_PATTERN:-%CLR (%d{yyyy-mm-dd HH:mm:ss. SSS}) {faint}%clr (${log_level_pattern:-%5p})%clr (${pid:-}) {Magenta}%clr (---) {faint}%clr ([%15.15t]) {faint}%clr (% -40.40logger{39}) {cyan}%clr (:) {faint}%m%n${log_exception_conversion_word:-%wex}} "/> <!--console output set--<appender name=" console "class=" Ch.qos.logback.core.ConsoleAppender "> <encoder> <pattern>${CONSOLE_LOG_PATTERN}</pattern> <charset>utf8</ch Arset> </encoder> </appender> <!--generate log files per day-<appender name= "file" class= "Ch . Qos.logback.core.rolling.RollingFileAppender "> <rollingpolicy class=" Ch.qos.logback.core.rolling.TimeBasedRollingPolicy "> <!--log file output file name--<filenamepattern&            gt;${log_home}/category-server-log.%d{yyyy-mm-dd}.log</filenamepattern> <!--log file retention days-- <MaxHistory>30</MaxHistory> </rollingPolicy> <encoder class= "Ch.qos.logback.classic.enc oder.            Patternlayoutencoder "> <!--formatted output:%d for date,%thread for thread name,%-5level: Level shows 5 character width from left%msg: Log message,%n is line break-- <pattern>%d{yyyy-mm-dd HH:mm:ss. SSS} [%thread]%-5level%logger{50}-%msg%n</pattern> </encoder> <!--The maximum size of the log file <triggeringpolicy cl        ass= "Ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy" > <MaxFileSize>10MB</MaxFileSize> </triggeringPolicy>--> <filter class= "Ch.qos.logback.classic.filter.LevelFilter" > &lt ;level>warn</level> <onMatch>DENY</onMatch> <onmismatch>neutral</onmis match> </filter> <filter class= "Ch.qos.logback.classic.filter.LevelFilter" > <le Vel>error</level> <onMatch>DENY</onMatch> <onmismatch>neutral</onmisma Tch> </filter> </appender> <!--error log Appender-<appender name= "Error_file" CLA ss= "Ch.qos.logback.core.rolling.RollingFileAppender" > <rollingpolicy class= "  Ch.qos.logback.core.rolling.TimeBasedRollingPolicy ">          <!--roll-by-day daily-<!--Log.dir in Maven profile-<FileNamePattern>            ${log_home}/category-server-error-log.%d{yyyy-mm-dd}.log</filenamepattern> <!--log maximum history 60 days-- <maxHistory>60</maxHistory> </rollingPolicy> <filter class= "Ch.qos.logback.clas            Sic.filter.ThresholdFilter "> <level>WARN</level> </filter> <encoder> <pattern>%d{yyyy-mm-dd HH:mm:ss. SSS} [%thread]%-5level%logger{50}-%msg%n</pattern> </encoder> </appender> <!--myibat is log configure--> <logger name= "Com.apache.ibatis" level= "TRACE"/> <logger name= "Java.sql.Connection" level= "Debug"/> <logger name= "java.sql.Statement" level= "Debug"/> <logger name= "Java.sql.PreparedStatem Ent "level=" DEBUG "/> <!--log output level--<root level=" INFO "> <appender-rEF ref= "CONSOLE"/> <appender-ref ref= "FILE"/> <appender-ref ref= "Error_file"/> </roo T></configuration>
2. Define a log entity for easy maintenance and subsequent extensions
Package Com.wdcloud.categoryserver.log;import com.wdcloud.categoryserver.common.entity.user;/** * @describe: Log print entity    * @author: Zhuchunwang * @date: 2018/5/29 17:40 * @version: 1.0 */public class Logentity {private long ID;    /** * Request Address */private String URL;    /** * Request IP */private String IP;    /** * Request method */private String HttpMethod;    /** * Request Class, Method */Private String Classmethod;    /** * Method Parameters */private String args;    /** * Request parameter */private String reqparams;    /** * Response parameter */private String respparams;    /** * Response time */private long spendtime;    /** * Log type (Web, service) */private String logtype;    /** * User Information */private user user;    Public long GetId () {return id;    } public void SetId (long id) {this.id = ID;    } public String GetUrl () {return URL;    } public void SetUrl (String url) {this.url = URL; } public String GetiP () {return IP;    } public void SetIp (String IP) {this.ip = IP;    } public String Gethttpmethod () {return httpmethod;    } public void Sethttpmethod (String httpmethod) {this.httpmethod = HttpMethod;    } public String Getclassmethod () {return classmethod;    } public void Setclassmethod (String classmethod) {this.classmethod = Classmethod;    } public String Getargs () {return args;    } public void Setargs (String args) {This.args = args;    } public String Getreqparams () {return reqparams;    } public void Setreqparams (String reqparams) {this.reqparams = Reqparams;    } public String Getrespparams () {return respparams;    } public void Setrespparams (String respparams) {this.respparams = Respparams;    } public Long Getspendtime () {return spendtime;    } public void Setspendtime (long spendtime) {this.spendtime = Spendtime; } public String Getlogtype () {return logtype;    } public void Setlogtype (String logtype) {this.logtype = LogType;    Public user GetUser () {return user;    public void SetUser (user user) {this.user = user; }}
3. Define the facets of a controller
Package Com.wdcloud.categoryserver.log;import Com.fasterxml.jackson.core.jsonprocessingexception;import Com.fasterxml.jackson.databind.objectmapper;import com.wdcloud.categoryserver.common.constant.AppConstants; Import Com.wdcloud.categoryserver.utils.apputil;import Com.wdcloud.categoryserver.utils.jsonutil;import Org.aspectj.lang.joinpoint;import Org.aspectj.lang.annotation.*;import Org.slf4j.logger;import Org.slf4j.loggerfactory;import Org.springframework.core.annotation.order;import Org.springframework.stereotype.component;import Org.springframework.web.context.request.RequestContextHolder; Import Org.springframework.web.context.request.servletrequestattributes;import javax.servlet.http.httpservletrequest;/** * @describe: Implement log tangent of controller * @author: Zhuchunwang * @date: 2018/5/29 17:40 * @version: 1.0 */@Aspect @component@order (1) public class Controllerlogaspect {private Logger Logger = loggerfactory.ge    Tlogger (This.getclass ()); threadlocal<long> startTime = new ThreadlocaL<> ();    threadlocal<logentity> weblogthreadlocal = new threadlocal<> ();     /** * defines a pointcut.     * Explanation: * <p> * ~ the first * represents any modifier and any return value.     * ~ the second * ANY package name * ~ The third * represents an arbitrary method. * ~ Fourth * defined in a Web package or a child package * ~ Fifth * Any method * ~.     Match any number of parameters.    */@Pointcut ("Execution (* com.wdcloud.categoryserver.business.*.controller.*.* (..))") public void Serviceaspect () {} @Before ("Serviceaspect ()") public void Dobefore (Joinpoint joinpoint) {//        Receive request, record request content Starttime.set (System.currenttimemillis ());        Servletrequestattributes attributes = (servletrequestattributes) requestcontextholder.getrequestattributes ();        HttpServletRequest request = Attributes.getrequest ();        Weblogthreadlocal.set (New logentity ());        Weblogthreadlocal.get (). Sethttpmethod (Request.getmethod ()); Weblogthreadlocal.get (). Setclassmethod (Joinpoint.getsignature (). Getdeclaringtypename () + "." +        Joinpoint.getsignature (). GetName ()); WebLogthreadlocal.get (). SetUrl (Request.getrequesturl (). toString ());        Weblogthreadlocal.get (). SetIp (Request.getremoteaddr ());        Weblogthreadlocal.get (). Setargs (Apputil.getargs (joinpoint));        Weblogthreadlocal.get (). Setlogtype (Appconstants.log_type_http);        Weblogthreadlocal.get (). Setreqparams (Jsonutil.objecttojson (Request.getparametermap ()));    Weblogthreadlocal.get (). SetUser (Apputil.getuser (request)); /** * Exception notification is used to intercept service Layer Log Exception Log * * @param * @param */@AfterReturning (returning = "Result", poi Ntcut = "Serviceaspect ()") public void doafterreturning (Object result) {//Finished processing the request, return content Objectmapper Mappe        R = new Objectmapper ();        try {weblogthreadlocal.get (). Setrespparams (mapper.writevalueasstring (result));        } catch (Jsonprocessingexception e) {logger.error (Apputil.getexceptiondetail (e));   } weblogthreadlocal.get (). Setspendtime (System.currenttimemillis ()-starttime.get ());     try {logger.info (">>>" +mapper.writevalueasstring (Weblogthreadlocal.get ()));        } catch (Jsonprocessingexception e) {logger.error (Apputil.getexceptiondetail (e)); }    }}
4. Define a service plane for Dubbo invocation
Package Com.wdcloud.categoryserver.log;import Com.fasterxml.jackson.core.jsonprocessingexception;import Com.fasterxml.jackson.databind.objectmapper;import com.wdcloud.categoryserver.common.constant.AppConstants; Import Com.wdcloud.categoryserver.utils.apputil;import Com.wdcloud.categoryserver.utils.jsonutil;import Org.aspectj.lang.joinpoint;import Org.aspectj.lang.annotation.afterreturning;import Org.aspectj.lang.annotation.aspect;import Org.aspectj.lang.annotation.before;import Org.aspectj.lang.annotation.pointcut;import Org.slf4j.logger;import Org.slf4j.loggerfactory;import Org.springframework.core.annotation.order;import Org.springframework.stereotype.component;import Org.springframework.web.context.request.requestcontextholder;import Org.springframework.web.context.request.servletrequestattributes;import javax.servlet.http.httpservletrequest;/ * * @describe: Implement log cut for Controller * @author: Zhuchunwang * @date: 2018/5/29 17:40 * @version: 1.0 */@Aspect @component@orde R (1) public class SerVicelogaspect {private Logger Logger = Loggerfactory.getlogger (This.getclass ());    threadlocal<long> startTime = new threadlocal<> ();    threadlocal<logentity> weblogthreadlocal = new threadlocal<> ();     /** * defines a pointcut.     * Explanation: * <p> * ~ the first * represents any modifier and any return value.     * ~ the second * ANY package name * ~ The third * represents an arbitrary method. * ~ Fourth * defined in a Web package or a child package * ~ Fifth * Any method * ~.     Match any number of parameters.    */@Pointcut ("Execution (* com.wdcloud.categoryserver.front.*.service.*.* (..))") public void Serviceaspect () {} @Before ("Serviceaspect ()") public void Dobefore (Joinpoint joinpoint) {//        Receive request, record request content Starttime.set (System.currenttimemillis ());        Weblogthreadlocal.set (New logentity ()); Weblogthreadlocal.get (). Setclassmethod (Joinpoint.getsignature (). Getdeclaringtypename () + "." +        Joinpoint.getsignature (). GetName ());        Weblogthreadlocal.get (). Setargs (Apputil.getargs (joinpoint)); Weblogthreadlocal.get (). Setlogtype (appconstants.LOG_TYPE_DUBBO); /** * Exception notification is used to intercept service Layer Log Exception Log * * @param * @param */@AfterReturning (returning = "Result", poi Ntcut = "Serviceaspect ()") public void doafterreturning (Object result) {//Finished processing the request, return content Objectmapper Mappe        R = new Objectmapper ();        try {weblogthreadlocal.get (). Setrespparams (mapper.writevalueasstring (result));        } catch (Jsonprocessingexception e) {logger.error (Apputil.getexceptiondetail (e));        } weblogthreadlocal.get (). Setspendtime (System.currenttimemillis ()-starttime.get ());        try {logger.info (">>>" +mapper.writevalueasstring (Weblogthreadlocal.get ()));        } catch (Jsonprocessingexception e) {logger.error (Apputil.getexceptiondetail (e)); }    }}
5. Unified exception Handling
Package Com.wdcloud.categoryserver.common.exception;import Com.wdcloud.categoryserver.common.constant.appconstants;import Com.wdcloud.categoryserver.common.constant.codeconstants;import Com.wdcloud.categoryserver.common.entity.baseview;import Com.wdcloud.categoryserver.log.logentity;import Com.wdcloud.categoryserver.utils.apputil;import Com.wdcloud.categoryserver.utils.jsonutil;import Org.slf4j.logger;import Org.slf4j.loggerfactory;import Org.springframework.http.converter.httpmessagenotreadableexception;import Org.springframework.web.httpmediatypenotsupportedexception;import Org.springframework.web.bind.missingservletrequestparameterexception;import Org.springframework.web.bind.annotation.controlleradvice;import Org.springframework.web.bind.annotation.exceptionhandler;import Org.springframework.web.bind.annotation.responsebody;import Org.springframework.web.bind.annotation.restcontroller;import Org.springframework.web.multipart.multipartexception;import Org.springframework.web.multipaRt.support.missingservletrequestpartexception;import javax.servlet.http.httpservletrequest;/** * @describe: Global exception handling * @author: Zhuchunwang * @date: 2018/5/29 17:40 * @version: 1.0 */@ControllerAdvice (annotations = {Restcontroller.class}) p    Ublic class Globalexceptionhandler {private Logger Logger = Loggerfactory.getlogger (This.getclass ()); /** * Default Unknown exception * @param request * @param e * @return * @throws Exception */@ExceptionHandler (val UE = Exception.class) @ResponseBody public Baseview Defaulterrorhandler (httpservletrequest request, Exception e) thr oWS Exception {Baseview Baseview = new Baseview (codeconstants.system_exception,codeconstants.system_exception_msg)        ;        Printlog (Request,e,baseview);    return baseview; }/** * Parameter exception * @param request * @param e * @return * @throws Exception */@ExceptionHandler ( Value = {Httpmessagenotreadableexception.class, missingservletrequestpartexception.class, MissingSerVletrequestparameterexception.class, Multipartexception.class}) @ResponseBody public Baseview Httpmessagenotreadabl Eexceptionerrorhandler (HttpServletRequest request, Exception e) throws Exception {Baseview Baseview = new Baseview        (CODECONSTANTS.PARAMETER_ERROR,CODECONSTANTS.PARAMETER_ERROR_MSG);        Printlog (Request,e,baseview);    return baseview; }/** * ContentType exception * @param request * @param e * @return * @throws Exception */@Exceptio Nhandler (value = {Httpmediatypenotsupportedexception.class}) @ResponseBody public Baseview httpmediatypenotsupported Exceptionhandler (HttpServletRequest request, Exception e) throws Exception {Baseview Baseview = new Baseview (Code        CONSTANTS.CONTENTTYPE_ERROR,CODECONSTANTS.CONTENTTYPE_ERROR_MSG);        Printlog (Request,e,baseview);    return baseview; /** * Exception Information Print log * @param request * @param e * @param baseview */private void Printlog (Httpserv LetrequeSt Request,exception E,baseview Baseview) {logger.error (Apputil.getexceptiondetail (e));        Logentity logentity = new logentity ();        Logentity.sethttpmethod (Request.getmethod ());        Logentity.seturl (Request.getrequesturl (). toString ());        Logentity.setip (Request.getremoteaddr ());        Logentity.setargs (Apputil.getrequestbody (request));        Logentity.setlogtype (appconstants.log_type_http);        Logentity.setreqparams (Jsonutil.objecttojson (Request.getparametermap ()));        Logentity.setrespparams (Jsonutil.objecttojson (Baseview));    Logger.error (">>>" +jsonutil.objecttojson (logentity)); }}

Springboot AOP + logback + Unified exception handling print log

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.