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" > < ;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