要件の背景
プロジェクトが基本的に完了した最近のプロジェクトでは、顧客はすべてのビジネスオペレーションのログをデータベースに記録し、ログにいくつかの重要なビジネス情報(トランザクション注文番号など)を抽出することを提案しました。
建設期間を確保するために、情報を確認した後、AOP +カスタムアノテーションを使用してこの要件を完了することにしました。
準備
カスタムアノテーションに依存する必要があるJARパッケージには、aspectjrt-xxx.jar、aspectjweaver-xxx.jar、xxxがバージョン番号を表します。
カスタムアノテーション
ログ関連コンテンツを保存するために、プロジェクトの下に個別のログパッケージが作成されます
**。common.log.annotation //カスタムアノテーションストレージ場所**。common.log.aop // aopツールストレージ場所
注釈パッケージの下に新しいカスタムアノテーションクラスを作成します。
パッケージ**。common.log.annotation; Import Java.lang.Annotation.ElementType; Import Java.lang.Annotation.Retention; Import Java.lang.Annotation.RetentionPolicy; Import Java.lang.Annotation.Target; xxxoperatelog { / ***操作タイプ説明* @return* / string operateTypedesc()default ""; / ***操作タイプ* @return*/ long operateType()default -1; / ***モジュールエンコード* @return*/ string mousecode()default "m30"; / ***モジュール名* @return*/ string mousename()default "xx module"; / *** business type* @return*/ string busstype()default ""; / ***ビジネスタイプ説明* @return*/ string busstypedesc()default "";}AOPパッケージの下に新しいxxxoperatelogaopを作成します
パッケージ**。common.log.aop; import **; // omit @astef @componentpublic class xxxoperatelogaop {@autowired systemlogservice systemlogservice; httpservletrequest request = null; logger logger = loggerfactory.getLogger(xxxoperatelogaop.class); threadlocal <long> time = new threadlocal <long>(); //操作ログを生成するために使用される一意のID。 // AOPエントリポイントを宣言して、xxxoperatelogを使用するすべての方法は@pointcut(**。common.log.annotation.xxxoperatelog) ")public void log(){system.out.println(" i a a a entry Point "); } / *** @log* @param joinpoint* / @before( "log()")befodexec(joinpoint joinpoint){time.set(system.currenttimemillis());情報(JoinPoint); //ログレコードの一意の識別番号を設定しますtag.set(uuid.randomuid()。toString()); request =((servletrequestattributes)requestcontextholder.getRequestattributes())。getRequest(); } @after( "log()")public void afterexec(joinpoint joinpoint){methodignature ms =(methodignature)joinpoint.getSignature();メソッドメソッド= ms.getMethod(); logger.debug( "tag as" + tag.get() + "method" + method.getname() + "run consumption" +(system.currenttimemillis() - time.get() + "ms"); } //ターゲットメソッドを実行するプロセスでは、このメソッドが実行され、ロギングは@around( "log()")のパブリックオブジェクトをここで実装できます。 try {object [] orgs = pjp.getargs(); SystemLog ValueReturn = null; for(int i = 0; i <orgs.length; i ++){if(orgs [i] instanceof systemlog){valuereturn =(systemlog)orgs [i]; }} if(valureturn == null){valureTurn = new SystemLog(); } if(valuereturn!= null && request!= null){methodignature ms =(methodignature)pjp.getsignature();メソッドメソッド= ms.getMethod(); //アノテーションの操作ログ情報を取得xxxoperatelog log = method.getAnnotation(xxxoperatelog.class);文字列businessType = log.busStype(); string businessdesc = log.busstypedesc(); Hashmap requestmap = servletutils.getParameterToHashmap(request); //パラメーターからビジネスタイプを探しますif(businessType.equals( "")){object objbusinessType = requestMap.get( "Business_type"); businessType = objbusinessType == null? "":objbusinessType.toString(); } //実行結果オブジェクトのアプリケーションフォームからビジネスタイプを見つけましたapply = request.getAttribute( "apply"); if(apply!= null){jsonobject obj = jsonfactory.tojsonabstractentity(apply); if(obj!= null){valureturn.setotherdesc( "apply number:"+obj.getString( "apply_no")); if(businessType.equals( "")){BusinessType = obj.getString( "Business_Type"); }}} //メソッドの実行プロセスパラメーターからビジネスタイプを見つける(通常は手動で設定)if(businessType.equals( "")){businessType =(string)request.getAttribute( "Business_type"); businessType = BusinessType == null? "":businessType; } if(!businessType.equals( "")&& businessdesc.equals( "")){businessDesc = xxxsysconstant.business_type.getName(businessType); } ValuerEturn.setBusStype(xxxsysconstant.business_type.getNumber(BusinessType)); ValuerEturn.setBusStypedESC(BusinessDESC); ValuerEturn.setMoudLecode(log.moudlecode()); ValuerEturn.SetMoudLename(log.MoudLename()); valureturn.setoperateresult(xxxsysconstant.yesorno.yes); ValuerEturn.setoperateType(log.operateType()); ValuerEturn.setInputuserid(((usercontext)webutils.getSessionAttribute(request、 "xxxusercontext"))。getsysuser()。getId()); valureturn.setoperateTypedesc(log.operateTypedesc()); ValuerEturn.setRequestip(getRemoteHost(リクエスト)); ValuerEturn.setRequesturl(request.getRequesturi()); ValuerEturn.SetserVerip(request.getLocalAddr()); valureturn.setuids(tag.get()); //操作ログSystemLogService.SavesystemLog(ValuerEturn)を保存します。 } else {logger.info( "ログ情報を記録しない"); } //操作結果を保存} catch(例外e){e.printstacktrace(); } return; } //例外log @afterthrowing(pointcut = "log()"、throwing = "e")public void doafterthrowing(joinpoint joinpoint、throwable e){try {info(joinpoint); object [] orgs = joinpoint.getargs(); SystemLog ValueReturn = null; for(int i = 0; i <orgs.length; i ++){if(orgs [i] instanceof systemlog){valuereturn =(systemlog)orgs [i]; }} if(valureturn == null){valureTurn = new SystemLog(); } if(valuereturn!= null && request!= null){methodignature ms =(methodignature)joinpoint.getSignature();メソッドメソッド= ms.getMethod(); xxxoperatelog log = method.getannotation(xxxoperatelog.class);文字列businessType = log.busStype(); string businessdesc = log.busstypedesc(); if(businessType.equals( "")){object objbusinessType = servletutils.getParameterToHashmap(request).get( "Business_type"); businessType = objbusinessType == null? "":objbusinessType.toString(); businessDesc = xxxsysconstant.business_type.getName(BusinessType); } ValuerEturn.setBusStype(xxxsysconstant.business_type.getNumber(BusinessType)); ValuerEturn.setBusStypedESC(BusinessDESC); ValuerEturn.setMoudLecode(log.moudlecode()); ValuerEturn.SetMoudLename(log.MoudLename()); ValuerEturn.setoperateType(log.operateType()); valureturn.setoperateTypedesc(log.operateTypedesc()); ValuerEturn.setInputuserid(((usercontext)webutils.getSessionAttribute(request、 "xxxusercontext"))。getsysuser()。getId()); valureturn.setoperateresult(xxxsysconstant.yesorno.no);文字列errmes = e.getMessage(); if(errmes!= null && errmes.length()> 800){errmes = errmes.substring(0、800); } valuereturn.setErrormessage(errmes); ValuerEturn.setRequestip(getRemoteHost(リクエスト)); ValuerEturn.setRequesturl(request.getRequesturi()); ValuerEturn.SetserVerip(request.getLocalAddr()); valureturn.setuids(tag.get()); SystemLogService.SavesSystemLog(Valuereturn); } else {logger.info( "ログ情報は記録されていません"); }} catch(例外e1){e1.printstacktrace(); }} private void info(joinpoint joinpoint){ logger.debug("----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Object[] os = joinpoint.getargs(); debug( "); logger.debug( "sourcelocation:/t" + joinpoint.getSourcelocation()); logger.debug("---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- request.getheader( "proxy-client-ip"); = request.getRemoteaddr(); return ip.equals( "0:0:0:0:0:0:0:1")? "127.0.0.1"}}構成ファイルspring-mvc.xmlを変更し、次の構成を追加します
<! - AOPインターセプトをオンにします - > <aop:aspectj-autoproxy proxy-target-class = "true" /> <mvc:annotation-driven /> <! - spring説明beanの範囲を定義します - > <コンテキスト:Component-scan base-package = "**。common.log"> expression = "org.springframework.stereotype.controller"/> </context:component-scan>
上記の構成は、Spring-MVC.xmlまたはSpring-Context.xmlの同じXMLファイルに配置する必要があることに注意してください。
注釈の使用
@xxxoperatelog(busstype = xxxsysconstant.business_type.yyyy、busstypedesc = "business type description"、operateType = xxxsysconstant.logoperateTyte.query、query、operateTypedESC = "operation説明") 「/**/**/QueryXXXX4Datagrid.json」、method = requestmethod.post)public void queryxxxxxx4datagrid(httpservletrequest request、httpservletresponse arg1、モデルモデル、ライター){ logger.info( "========================================================================================== writter){logger.info( "====================================================================================================================================== logger.info( "======================== htttpservletResponse arg1、モデルモデル、ライターライター){logger.info(" ===================== httpservletResponse arg1、モデル、ライター){ logger.info( "=================== htttpservletResponse arg1、モデルモデル、ライターライター){ogger.info(" ================== = httpservletResponse arg1、モデルライター){ logger.info( "================= httpservletresponse arg1、モデルモデル、上記のSpringMVCカスタムアノテーション、AOPを使用してロギングを実現する方法は、私があなたと共有するすべてのコンテンツです。参照を提供できることを願っています。wulin.comをもっとサポートできることを願っています。