1: Classe de entidade de log
classe pública syslog { / *** / ID inteiro privado; / ** Descrição do log*/ String privada Descrição; / ** Método de execução*/ Método de String Private; /** Tipo de log 0: log de operação; 1: log de exceção*/ Inteiro privado Logtype; / ** Endereço IP solicitado pelo cliente*/ String privada RequestiP; / ** Código de exceção*/ String privada ExceptionCode; / ** Detalhes da exceção*/ Private String ExceptionDetail; / ** Parâmetros de solicitação*/ params privado string; / ** Operador*/ String privada Createby; / ** Tempo de operação*/ String privada criada; public integer getId () {return id; } public void SetId (ID inteiro) {this.id = id; } public string getDescription () {return description; } public void SetDescription (String description) {this.Description = Descrição; } public String getMethod () {Método de retorno; } public void setMethod (método da string) {this.method = método; } public integer getLogtype () {return logtype; } public void setLogType (Integer LogType) {this.logtype = logType; } public String getRequestip () {return requestIPIP; } public void setRequestip (string requestIP) {this.requestip = requestIP; } public string getExceptionCode () {return ExceptionCode; } public void setExceptionCode (String ExceptionCode) {this.ExceptionCode = ExceptionCode; } public string getExceptionDetail () {return ExceptionDetail; } public void setExceptionDetail (String ExceptionDetail) {this.ExceptionDetail = ExceptionDetail; } public string getParams () {return params; } public void setParams (String params) {this.params = params; } public string getCreateBy () {return createby; } public void setCreateBy (String createby) {this.Createby = Createby; } public string getCreatedate () {return criatedate; } public void setCreatedate (string criado) {this.createdate = criatedate; }}2: O frasco exigido por Maven
<Depencency> <PuerpId> org.aspectj </frugiD> <stifactId> aspecto </artifactId> <versão> 1.7.4 </version> </dependency> <pendence> <puperid> org.aspectj </groupid> <tutifactId> ascestjweaver </stifactId> <versão> 1.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7. <groupId>cglib</groupId> <artifactId>cglib</artifactId> <version>2.1_3</version> </dependency><dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>4.2.5.RELEASE</version></dependency>
O projeto é obrigado a usar o JDK1.7
3: SpringServlet-mvc.xml
<!-Proxy-Target-Class = "True" Force o uso do proxy do CGLIB. Se false, a primavera selecionará automaticamente-> <AOP: AspectJ-AutopProxy Proxy-Target-Class = "true"/>
Adicionar proxy-alget-class = "true" é interceptar os métodos no controlador.
4: Defina a seção, escrevo principalmente pré-notações e notificações de exceção aqui
Abaixo está a anotação personalizada
importar java.lang.annotation.*; @Target ({ElementType.Parameter, ElementType.method}) @retention (retentionPolicy.Runtime) @Documented public @Interface Log {/ ** o tipo de operação a ser executado, como: Operação **/ public String Operação () Defulidade "; / ** A operação específica a ser executada, como: Adicionar usuário **/ public String OperaçãoName () padrão "";}Corte de rosto
importar java.lang.reflect.method; importar java.text.simpledEformat; importar java.util.arrays; importar java.util.date; importar javax.annoTation.ResEstcestce; import javax.serv.httlet.htTetLeTrexest; org.aspectj.lang.joinpoint; importar org.aspectj.lang.proedingJoinpoint; importar org.aspectj.lang.annotation.after; importar org.aspectj.lang.annotation.AfterReturning; importação; org.aspectj.lang.annotation.aspect; importar org.aspectj.lang.annotation.be antes; importar org.aspectj.lang.annotation.pointcut; importar org.slf4j.logger; importação org.slf4j.loggerFactory; importação org.springfringFreeTyPrete.Slf4j.LoggerFactory; importação; org.springframework.web.context.request.requestContextholder; importar org.springframework.web.context.request.servletRequestattributes; import com.gtcity.user.model.syslog; import.gtity.ermmm.ermmm.ermmm.ermmm.ermmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmM.ermMelem.sysLog; com.gtcity.user.service.sysLogservice;/** * @author panliang * @Version Time de criação: 2017-3-31 * @DESC CLUT PONTE-CUT * */ @aspecto @componentPublic SystemLogAspect {// INJUST Service para salvar os logs para o database @DataRess @STROTTRID Logger final estático privado) = LoggerFactory.getLogger (classe SystemLogaspect. Class); // Ponto tangente da camada do controlador // O primeiro * representa todos os tipos de valor de retorno // o segundo * representa todas as classes // o terceiro * representa todos os métodos da classe // o último ... representa todos os parâmetros. @PointCut ("Execution ( * com.gtcity.web.controller .. *. * (..))") public void controleraspect () {} /** * * @author: panliang * @time: 2017-3-31 2:22:16 pm * @param junção junção * Operações*/ @Before ("controleraspect ()") public void não (juntpoint Junção) {/* System.out.println ("=================================================================================; HttpServletRequest Request = (servletRequestattributes) requestContextholder.getRequestattributes ()). GetRequest (); user.set User Class.Forname (TargetsName); Method.getAnnotation (log.class) .OperationType (); Start =============); System.out.println ("Revester:" User.getUserName ()); LOG.SETMETHOD (JUNCETONENTE. LOG.SETPARAMS (NULL); System.out.println ("======= Controlador Pré-notificação End ======"); 2017-3-31 14:24:36 * @param juntpoint point-cut * @description: a notificação de exceção é usada para interceptar e registrar o log de exceção */ @afterwrlowing (Pointcut = "controleraspect ()", throwing = "e") public void DoAfterWrowing (junção junção, () e), throwing = "e") public void DoAfterWrowing (junção de junção, e), e), o "e" e "). RequestCoteCholder.GetRequestTtributes ()). GetRequest (); ip = request.getRemoTeaddr (); junção.getSignature (). clazzs = método.getparameterTypes (); output =========*/ System.out.println ("================ Notificação de exceção Start ================================================================================================================================== ============================================================================================= ============================================================================================= ============================================================================================= System.out.println ("Informações de exceção:" + e.getMessage ()); System.It.println ("Requester:" User.getUserName ()); LOG.SETEXCECTIONCODE (E.GETCLASS (). GetName ()); Log.SetParams (params); System.out.println ("======== Notificação de exceção END =========);} Catch (Exceção ex) {// Registre a exceção local Logger.error (" == Exceção de notificação de exceção =====); logger.error ("Informações da exceção: {}", ex.getmessage ();); Log ============ Logger.error ("Método de exceção: {} Código de exceção: {} Informações de exceção: {} parâmetros: {}", junção.getTarget (). getClass ().5: No controlador
/** * Encontre a senha com base no nome do usuário para determinar se o nome do usuário e a senha estão corretos * @author panliang * @param request * @param resposta * @throws ioexception */ @requestMapp ("/skippage.do") @log (operaçãoType = "Selecione", operação o nome do user ")/) @login se não é adicionado; Skippage (httpServletRequest Solicy, httpServletResponse Response) lança ioexception {modelAndView result = null; string userName = request.getParameter ("email"); string senha = solicitação.getParameter ("senha"); int = shinSuserSertice.Login (SUCESSTEME, username); ModelAndView ("Redirect: /login/dispacher_main.do");} else if (flag == 2) {// O nome de usuário não existe resultado = new ModelAndView ("Redirect: /Login/Login.do? ErrorCode = 1");} mais {// senha está incorreta ModelAndView ("Redirect: /login/login.do? ErrorCode = 2");} Retorno Result;}Para quem deseja saber sobre as outras três notificações, consulte esta postagem do blog: clique para abrir o link
Dessa forma, quando o usuário acessar o plano de fundo, haverá registros se é um banco de dados de acesso normal ou bug.
O método de anotação AOP acima para implementar o gerenciamento global de logs é todo o conteúdo que compartilhei com você. Espero que você possa lhe dar uma referência e espero que você possa apoiar mais o wulin.com.