/* Ċ Ġ* ĠTencent Ġis Ġplease d Ġto Ġsupport Ġthe Ġopen Ġsource Ġcommunity Ġby Ġmaking ĠB K - CI Ġ èĵĿ é² ¸ æĮģ ç»Ń éĽĨ æĪĲ å¹³åı° Ġavailable . Ċ Ġ* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 9 ĠTH L ĠA 2 9 ĠLimited , Ġa ĠTencent Ġcompany . Ġ ĠAll Ġrights Ġreserved . Ċ Ġ* Ċ Ġ* ĠB K - CI Ġ èĵĿ é² ¸ æĮģ ç»Ń éĽĨ æĪĲ å¹³åı° Ġis Ġlicensed Ġunder Ġthe ĠMIT Ġlicense . Ċ Ġ* Ċ Ġ* ĠA Ġcopy Ġof Ġthe ĠMIT ĠLicense Ġis Ġincluded Ġin Ġthis Ġfile . Ċ Ġ* Ċ Ġ* Ċ Ġ* ĠTerms Ġof Ġthe ĠMIT ĠLicense : Ċ Ġ* Ġ------------------------------------------------ --- Ċ Ġ* ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy Ġof Ġthis Ġsoftware Ġand Ġassociated Ċ Ġ* Ġdocumentation Ġfiles Ġ( the Ġ" Software "), Ġto Ġdeal Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ġwithout Ġlimitation Ġthe Ċ Ġ* Ġrights Ġto Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ġand / or Ġsell Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ċ Ġ* Ġpermit Ġpersons Ġto Ġwhom Ġthe ĠSoftware Ġis Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ġ* Ċ Ġ* ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ġall Ġcopies Ġor Ġsubstantial Ġportions Ġof Ċ Ġ* Ġthe ĠSoftware . Ċ Ġ* Ċ Ġ* ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR ĠIMPLIED , ĠINCLUDING ĠBUT ĠNOT Ċ Ġ* ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF ĠMERCHANTABILITY , ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNONINFRINGEMENT . ĠIN Ċ Ġ* ĠNO ĠEVENT ĠSHALL ĠTHE ĠAUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER ĠLIABILITY , Ċ Ġ* ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE Ċ Ġ* ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN ĠTHE ĠSOFTWARE . Ċ Ġ*/ Ċ Ċ package Ġcom . tencent . devops . worker . common . logger Ċ Ċ import Ġcom . tencent . devops . common . log . pojo . Task Build Log Property Ċ import Ġcom . tencent . devops . common . log . pojo . enums . Log Storage Mode Ċ import Ġcom . tencent . devops . common . log . pojo . enums . Log Type Ċ import Ġcom . tencent . devops . common . log . pojo . message . Log Message Ċ import Ġcom . tencent . devops . common . service . utils . Common Utils Ċ import Ġcom . tencent . devops . log . meta . Ansi Ċ import Ġcom . tencent . devops . process . pojo . Build Variables Ċ import Ġcom . tencent . devops . process . utils . PIPELINE _ START _ USER _ ID Ċ import Ġcom . tencent . devops . worker . common . LOG _ DEBUG _ FLAG Ċ import Ġcom . tencent . devops . worker . common . LOG _ ERROR _ FLAG Ċ import Ġcom . tencent . devops . worker . common . LOG _ FILE _ LENGTH _ LIMIT Ċ import Ġcom . tencent . devops . worker . common . LOG _ MESSAGE _ LENGTH _ LIMIT Ċ import Ġcom . tencent . devops . worker . common . LOG _ SUB TAG _ FIN ISH _ FLAG Ċ import Ġcom . tencent . devops . worker . common . LOG _ SUB TAG _ FLAG Ċ import Ġcom . tencent . devops . worker . common . LOG _ TASK _ LINE _ LIMIT Ċ import Ġcom . tencent . devops . worker . common . LOG _ UPLOAD _ BUFFER _ SIZE Ċ import Ġcom . tencent . devops . worker . common . LOG _ WARN _ FLAG Ċ import Ġcom . tencent . devops . worker . common . api . Api Factory Ċ import Ġcom . tencent . devops . worker . common . api . archive . pojo . TokenType Ċ import Ġcom . tencent . devops . worker . common . api . log . Log SDK Api Ċ import Ġcom . tencent . devops . worker . common . env . Agent Env Ċ import Ġcom . tencent . devops . worker . common . service . Repo Service Factory Ċ import Ġcom . tencent . devops . worker . common . utils . Archive Utils Ċ import Ġcom . tencent . devops . worker . common . utils . FileUtils Ċ import Ġcom . tencent . devops . common . util . Http Retry Utils Ċ import Ġcom . tencent . devops . worker . common . service . Sensitive Value Service Ċ import Ġcom . tencent . devops . worker . common . utils . Workspace Utils Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġjava . io . File Ċ import Ġjava . sql . Date Ċ import Ġjava . text . SimpleDateFormat Ċ import Ġjava . util . concurrent . Callable Ċ import Ġjava . util . concurrent . Executors Ċ import Ġjava . util . concurrent . Future Ċ import Ġjava . util . concurrent . Linked BlockingQueue Ċ import Ġjava . util . concurrent . TimeUnit Ċ import Ġjava . util . concurrent . atomic . Atomic Boolean Ċ import Ġjava . util . concurrent . locks . Re entrant Lock Ċ Ċ @ Suppress (" Magic Number ", Ġ" Too Many Functions ", Ġ" Complex Method ") Ċ object ĠLogger Service Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġlog Resource Api Ġ= ĠApi Factory . create ( Log SDK Api :: class ) ĊĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠLoggerFactory . getLogger ( Logger Service :: class . java ) ĊĠĠĠ Ġprivate Ġvar Ġfuture : ĠFuture < Boolean >? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġrunning Ġ= ĠAtomic Boolean ( true ) ĊĠĠĠ Ġprivate Ġvar Ġcurrent Task Line No Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġval Ġsdf Ġ= ĠSimpleDateFormat (" yyyy - MM - dd ĠHH : mm : ss : SS S ") ĊĠĠĠ Ġprivate Ġconst Ġval ĠS ENS ITIVE _ MIX ER Ġ= Ġ" ****** " ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ æŀĦå»º æĹ¥å¿Ĺ å¤ĦçĲĨ çļĦ å¼ĤæŃ¥ çº¿ç¨ĭ æ±ł ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval ĠexecutorService Ġ= ĠExec utors . new Single Thread Executor () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ ç¼ĵ åĨ² åĮº å¤ĦçĲĨ çļĦ å¼ĤæŃ¥ çº¿ç¨ĭ æ±ł ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġflush Executor Ġ= ĠExec utors . new Single Thread Executor () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ æĹ¥å¿Ĺ ä¸Ĭ æĬ¥ ç¼ĵ åĨ² éĺŁåĪĹ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġupload Queue Ġ= ĠLinked BlockingQueue < Log Message >( 2 0 0 0 ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġæ¯ı ä¸ª æıĴä»¶ çļĦ æĹ¥å¿Ĺ åŃĺåĤ¨ å±ŀæĢ§ æĺłå°Ħ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġelement Id 2 Log Property Ġ= Ġmutable Map Of < String , ĠTask Build Log Property >() ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġå½ĵåīį æī§è¡Į æıĴä»¶ çļĦ åĲĦ ç±» æŀĦå»º ä¿¡æģ¯ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġelement Id Ġ= Ġ"" ĊĠĠĠ Ġvar Ġelement Name Ġ= Ġ"" ĊĠĠĠ Ġvar Ġjob Id Ġ= Ġ"" ĊĠĠĠ Ġvar Ġexecute Count Ġ= Ġ 1 ĊĠĠĠ Ġvar Ġbuild Variables : ĠBuild Variables ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġpipeline Log Dir : ĠFile ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġval Ġlock Ġ= ĠRe entrant Lock () ĊĊĠĠĠ Ġprivate Ġval Ġlog Messages Ġ= ĠArrayList < Log Message >() ĊĊĠĠĠ Ġprivate Ġval Ġlogger Thread Ġ= ĠCallable Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġlast Save Time : ĠLong Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( running . get ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠlogMessage Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupload Queue . poll ( 3 , ĠTimeUnit . SECONDS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠInterruptedException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn (" Logger Ġservice Ġpoll Ġthread Ġinterrupted ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlock . lock () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( log Message Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Messages . add ( log Message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlock . unlock () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġlog Messages . size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnow Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ ç¼ĵ åĨ² å¤§äºİ 2 0 0 æĿ¡ æĪĸ ä¸Ĭ æ¬¡ ä¿ĿåŃĺ æĹ¶éĹ´ è¶ħè¿ĩ 3 ç§Ĵ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( size Ġ>= ĠLOG _ UPLOAD _ BUFFER _ SIZE Ġ|| Ġ( size Ġ> Ġ 0 Ġ&& Ġ( now Ġ- Ġlast Save Time Ġ> Ġ 3 Ġ* Ġ 1 0 0 0 ))) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflush () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Save Time Ġ= Ġnow ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Task Line No Ġ+= Ġsize ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( log Messages . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflush () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ignored : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn (" Fail Ġto Ġsend Ġthe Ġlogger ", Ġignored ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlogger . info (" Finish Ġthe Ġsending Ġthread Ġ- Ġ(${ upload Queue . size }) ") ĊĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠFlush Thread Ġ: ĠCallable < Int > Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcall (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" Start Ġto Ġflush Ġthe Ġlogger ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlock . lock () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġlog Messages . size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( size Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Multi Log () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Messages . clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" Finish Ġflush Ġthe Ġlog Ġ- Ġ$ size ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlock . unlock () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsize ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstart () Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . info (" Start Ġthe Ġlog Ġservice ") ĊĠĠĠĠĠĠĠ Ġfuture Ġ= ĠexecutorService . submit ( logger Thread ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġflush (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . info (" Start Ġto Ġflush Ġthe Ġlog Ġservice ") ĊĠĠĠĠĠĠĠ Ġval Ġfuture Ġ= Ġflush Executor . submit ( Flush Thread ()) ĊĠĠĠĠĠĠĠ Ġreturn Ġfuture . get () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" Nested Block Depth ") ĊĠĠĠ Ġfun Ġstop () Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" Start Ġto Ġstop Ġthe Ġlog Ġservice ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this . running . get ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . running . set ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( future Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfuture !!. get () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠæĬ Ĭ æ²¡ å®ĮæĪĲ çļĦ æĹ¥å¿Ĺ æīĵ å®Į ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( upload Queue . size Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupload Queue . drain To ( log Messages ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( log Messages . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflush () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" Finish Ġstopping Ġthe Ġlog Ġservice ") ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ignored : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" Fail Ġto Ġstop Ġlog Ġservice Ġfor Ġbuild ", Ġignored ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġfinish Task () Ġ= Ġfinish Log ( element Id , Ġjob Id , Ġexecute Count ) ĊĊĠĠĠ Ġfun Ġadd Normal Line ( message : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġsub Tag : ĠString ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġreal Message Ġ= Ġmessage ĊĊĠĠĠĠĠĠĠ Ġ// Ġ# 2 3 4 2 Ġ å¤ĦçĲĨ æıĴä»¶ åĨħ æĹ¥å¿Ĺ çļĦ åīį ç¼Ģ æłĩçŃ¾ ï¼Į è¿Ľè¡Į æĹ¥å¿Ĺ åĪĨ çº§ ĊĠĠĠĠĠĠĠ Ġif Ġ( message . contains ( LOG _ SUB TAG _ FLAG )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprefix Ġ= Ġmessage . substring Before ( LOG _ SUB TAG _ FLAG ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġmessage . substring After ( LOG _ SUB TAG _ FLAG ). split ( LOG _ SUB TAG _ FLAG ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( list . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsub Tag Ġ= Ġlist . first () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreal Message Ġ= Ġlist . last () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( real Message . startsWith ( LOG _ SUB TAG _ FIN ISH _ FLAG )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinish Log ( element Id , Ġjob Id , Ġexecute Count , Ġsub Tag ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreal Message Ġ= Ġreal Message . remove Prefix ( LOG _ SUB TAG _ FIN ISH _ FLAG ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreal Message Ġ= Ġprefix Ġ+ Ġreal Message ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġlog Type Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreal Message . startsWith ( LOG _ DEBUG _ FLAG ) Ġ-> ĠLog Type . DEBUG ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreal Message . startsWith ( LOG _ ERROR _ FLAG ) Ġ-> ĠLog Type . ERROR ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreal Message . startsWith ( LOG _ WARN _ FLAG ) Ġ-> ĠLog Type . WARN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠLog Type . LOG ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġ# 4 2 7 3 Ġ æķ ı æĦŁ ä¿¡æģ¯ è¿ĩæ»¤ ï¼Į éģįåİĨ æīĢæľī æķ ı æĦŁ ä¿¡æģ¯ æĺ¯åĲ¦ åŃĺåľ¨ æĹ¥å¿Ĺ ä¸Ń ĊĠĠĠĠĠĠĠ Ġreal Message Ġ= Ġfix Sensitive Content ( real Message ) ĊĊĠĠĠĠĠĠĠ Ġval ĠlogMessage Ġ= ĠLog Message ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Ġ= Ġreal Message , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtimestamp Ġ= ĠSystem . currentTimeMillis (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtag Ġ= Ġelement Id , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsub Tag Ġ= Ġsub Tag , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjob Id Ġ= Ġjob Id , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog Type Ġ= Ġlog Type , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Count Ġ= Ġexecute Count ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġlogger . info ( log Message . toString ()) ĊĊĠĠĠĠĠĠĠ Ġ// Ġ# 3 7 7 2 Ġå¦Ĥæŀľ å·²ç»ı è¿Ľåħ¥ Job æī§è¡Į ä»»åĬ¡ ï¼Į åĪĻ åı¯ä»¥ åģļ æĹ¥å¿Ĺ æľ¬åľ° èĲ½ çĽĺ ĊĠĠĠĠĠĠĠ Ġif Ġ( element Id . isNotBlank () Ġ&& Ġpipeline Log Dir Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsave Local Log ( log Message ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Task Line No Ġ<= ĠLOG _ TASK _ LINE _ LIMIT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġä¸Ĭ æĬ¥ åīį åģļ éķ¿åº¦ çŃī åĨħå®¹ éĻĲåĪ¶ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfix Upload Message ( log Message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . upload Queue . put ( log Message ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( element Id 2 Log Property [ element Id ]?. log Storage Mode Ġ!= ĠLog Storage Mode . LOCAL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" The Ġnumber Ġof ĠTask [$ element Id ] Ġlog Ġlines Ġexceeds Ġthe Ġlimit , Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" the Ġlog Ġfile Ġwill Ġbe Ġarchived ." ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . upload Queue . put ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlogMessage . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Ġ= Ġ" Print ed Ġlogs Ġcannot Ġexceed Ġ 1 Ġmillion Ġlines . Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Please Ġdownload Ġlogs Ġto Ġview ." ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement Id 2 Log Property [ element Id ]?. log Storage Mode Ġ= ĠLog Storage Mode . LOCAL ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ignored : ĠInterruptedException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" åĨĻåħ¥ Ġ$ log Type Ġ æĹ¥å¿Ĺ è¡Į å¤±è´¥ ï¼ļ ", Ġignored ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfix Sensitive Content ( message : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġreal Message Ġ= Ġmessage ĊĠĠĠĠĠĠĠ ĠS ensitive Value Service . sensitive String Set . forEach Ġ{ Ġsensitive Str Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( real Message . contains ( sensitive Str )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreal Message Ġ= Ġreal Message . replace ( sensitive Str , ĠS ENS ITIVE _ MIX ER ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġreal Message ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Warn Line ( message : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġ ä¿® å¤į æį¢ è¡Į åĲİ æĹłæ³ķ éĢļè¿ĩ åīį ç¼Ģ æ¸²æŁĵ é¢ľèī² çļĦéĹ®é¢ĺ ĊĠĠĠĠĠĠĠ Ġval Ġmsg Ġ= Ġ"$ LOG _ WARN _ FLAG $ message " ĊĠĠĠĠĠĠĠ Ġadd Normal Line ( msg . replace ("\ n ", Ġ"\ n $ LOG _ WARN _ FLAG ")) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Error Line ( message : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġ ä¿® å¤į æį¢ è¡Į åĲİ æĹłæ³ķ éĢļè¿ĩ åīį ç¼Ģ æ¸²æŁĵ é¢ľèī² çļĦéĹ®é¢ĺ ĊĠĠĠĠĠĠĠ Ġval Ġmsg Ġ= Ġ"$ LOG _ ERROR _ FLAG $ message " ĊĠĠĠĠĠĠĠ Ġadd Normal Line ( msg . replace ("\ n ", Ġ"\ n $ LOG _ ERROR _ FLAG ")) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Debug Line ( message : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġ ä¿® å¤į æį¢ è¡Į åĲİ æĹłæ³ķ éĢļè¿ĩ åīį ç¼Ģ æ¸²æŁĵ é¢ľèī² çļĦéĹ®é¢ĺ ĊĠĠĠĠĠĠĠ Ġval Ġmsg Ġ= Ġ"$ LOG _ DEBUG _ FLAG $ message " ĊĠĠĠĠĠĠĠ Ġadd Normal Line ( msg . replace ("\ n ", Ġ"\ n $ LOG _ DEBUG _ FLAG ")) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Fold Start Line ( fold Name : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠlogMessage Ġ= ĠLog Message ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Ġ= Ġ" ## [ group ]$ fold Name ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtimestamp Ġ= ĠSystem . currentTimeMillis (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtag Ġ= Ġelement Id , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjob Id Ġ= Ġjob Id , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog Type Ġ= ĠLog Type . LOG , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Count Ġ= Ġexecute Count ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġadd Log ( log Message ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Fold End Line ( fold Name : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠlogMessage Ġ= ĠLog Message ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Ġ= Ġ" ## [ end group ]$ fold Name ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtimestamp Ġ= ĠSystem . currentTimeMillis (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtag Ġ= Ġelement Id , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjob Id Ġ= Ġjob Id , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog Type Ġ= ĠLog Type . LOG , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Count Ġ= Ġexecute Count ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġadd Log ( log Message ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġarchive Log Files () Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . info (" Start Ġto Ġarchive Ġlog Ġfiles Ġwith ĠLog Mode [ ${ Agent Env . getLog Mode ()} ]") ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpire Seconds Ġ= Ġbuild Variables !!. timeout M ills Ġ/ Ġ 1 0 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtoken Ġ= ĠRepo Service Factory . getInstance (). get Repo Token ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠuserId Ġ= Ġbuild Variables !!. variables [ PIPELINE _ START _ USER _ ID ] Ġ?: Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠprojectId Ġ= Ġbuild Variables !!. projectId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrepo Name Ġ= Ġ" log ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath Ġ= Ġ"/", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= ĠTokenType . UPLOAD , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpire Seconds Ġ= Ġexpire Seconds ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġarchived Count Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġå°Ĩ æīĢæľī æĹ¥å¿Ĺ åŃĺåĤ¨ çĬ¶æĢģ ä¸º LOCAL çļĦ æıĴä»¶ è¿Ľè¡Į æĸĩä»¶ å½Ĵ æ¡£ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelement Id 2 Log Property . forEach Ġ{ Ġ( element Id , Ġproperty ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġå¦Ĥæŀľ ä¸įæĺ¯ LOCAL çĬ¶æĢģ çĽ´æİ¥ è·³ è¿ĩ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( property . log Storage Mode Ġ!= ĠLog Storage Mode . LOCAL ) Ġreturn @ forEach ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġå¦Ĥæŀľ æĹ¥å¿Ĺ æĸĩä»¶ è¿ĩ å¤§ ï¼Į åĪĻ åıĸæ¶Ī å½Ĵ æ¡£ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( property . log File . length () Ġ> ĠLOG _ FILE _ LENGTH _ LIMIT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Cancel Ġarch iving Ġtask [$ element Id ] Ġbuild Ġlog Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" file (${ property . log File . absolute Path }), Ġlength (${ property . log File . length () })" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ forEach ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! property . log File . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Cancel Ġarch iving Ġtask [$ element Id ] Ġbuild Ġlog Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" file (${ property . log File . absolute Path }) Ġwhich Ġnot Ġexists " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ forEach ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ å¼Ģå§ĭ å½Ĵ æ¡£ ç¬¦åĲĪ å½Ĵ æ¡£ æĿ¡ä»¶ çļĦ æĹ¥å¿Ĺ æĸĩä»¶ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" Archive Ġtask [$ element Id ] Ġbuild Ġlog Ġfile (${ property . log File . absolute Path }) ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHttp Retry Utils . retry ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġretry Time Ġ= Ġ 5 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġretry Period M ills Ġ= Ġ 1 0 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠArchive Utils . archive LogFile ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile Ġ= Ġproperty . log File , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdest FullPath Ġ= Ġproperty . child Path , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Variables Ġ= Ġbuild Variables !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoken Ġ= Ġtoken ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproperty . log Storage Mode Ġ= ĠLog Storage Mode . ARCH IVED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ignore : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" archive LogFile | Ġretry Ġfail Ġwith Ġmessage : Ġ", Ġignore ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarchived Count ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" Finished Ġarch iving Ġlog Ġ$ arch ived Count Ġfiles ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ åĲĮæŃ¥ æīĢæľī åŃĺåĤ¨ çĬ¶æĢģ åĪ° log æľįåĬ¡ ç«¯ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog Resource Api . update Storage Mode ( element Id 2 Log Property . values . toList (), Ġexecute Count ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" Finished Ġupdate Ġmode Ġto Ġlog Ġservice .") ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ignored : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn (" Fail Ġto Ġarchive Ġlog Ġfiles ", Ġignored ) ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" Remove Ġtemp Ġlog Ġfiles Ġin Ġ[$ pipeline Log Dir ]. ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFileUtils . delete Re cursively On Exit ( pipeline Log Dir !! ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadd Log ( message : ĠLog Message ) Ġ= Ġupload Queue . put ( message ) ĊĊĠĠĠ Ġprivate Ġfun Ġsend Multi Log () Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" Start Ġto Ġsave Ġthe Ġlog Ġ- Ġ${ log Messages . size }") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġå¦Ĥæŀľ agent åĲ¯åĬ¨ æĹ¶ æĹ¥å¿Ĺ æ¨¡å¼ı ä¸º æľ¬åľ° ä¿ĿåŃĺ ï¼Į åĪĻ ä¸į åģļ ä¸Ĭ æĬ¥ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Log Storage Mode . LOCAL Ġ== ĠAgent Env . getLog Mode ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠéĢļè¿ĩ ä¸Ĭ æĬ¥ çļĦ ç»ĵæŀľ æĦŁ çŁ¥ æĺ¯åĲ¦ éľĢè¦ģ è°ĥæķ´ æ¨¡å¼ı ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġlog Resource Api . add Log Multi Line ( log Messages ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġå½ĵ log æľįåĬ¡ è¿ĶåĽŀ æĭ Ĵ ç»Ŀ è¯·æ±Ĥ æĪĸèĢħ å¹¶ åıĳ éĩı è¶ħ éĻĲåĪ¶ æĹ¶ ï¼Į èĩªåĬ¨ åĪĩæį¢ æ¨¡å¼ı ä¸º æľ¬åľ° ä¿ĿåŃĺ å¹¶ å½Ĵ æ¡£ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . status Ġ== Ġ 5 0 3 Ġ|| Ġresult . status Ġ== Ġ 5 0 9 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn (" Log Ġservice Ġstorage Ġis Ġunable ï¼ļ ${ result . message }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisable Log Upload () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . isNot Ok () Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" Fail Ġto Ġsend Ġthe Ġmulti Ġlogs ï¼ļ ${ result . message }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ignored : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn (" Fail Ġto Ġsend Ġthe Ġlogs (${ log Messages . size })", Ġignored ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsave Local Log ( log Message : ĠLog Message ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ å¿ħè¦ģ çļĦ æľ¬åľ° ä¿ĿåŃĺ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġlog Property Ġ= Ġelement Id 2 Log Property [ element Id ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( null Ġ== Ġlog Property ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Property Ġ= ĠWorkspace Utils . get Build Log Property ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline Log Dir Ġ= Ġpipeline Log Dir !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline Id Ġ= Ġbuild Variables ?. pipeline Id !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Id Ġ= Ġbuild Variables ?. build Id !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement Id Ġ= Ġelement Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Count Ġ= Ġexecute Count , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Storage Mode Ġ= ĠAgent Env . getLog Mode () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" Create Ġnew Ġbuild Ġlog Ġfile (${ log Property . log File . absolute Path }) ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement Id 2 Log Property [ element Id ] Ġ= Ġlog Property ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠdateTime Ġ= Ġsdf . format ( Date ( log Message . timestamp )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog Property . log File . append Text ("$ dateTime Ġ: Ġ${ log Message . message }\ n ") ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ignored : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn (" Fail Ġto Ġsave Ġthe Ġlogs ($ log Message )", Ġignored ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfinish Log ( ĊĠĠĠĠĠĠĠ Ġtag : ĠString ?, ĊĠĠĠĠĠĠĠ Ġjob Id : ĠString ?, ĊĠĠĠĠĠĠĠ Ġexecute Count : ĠInt ?, ĊĠĠĠĠĠĠĠ Ġsub Tag : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Task Line No Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" Start Ġto Ġfinish Ġthe Ġlog , Ġproperty : Ġ${ element Id 2 Log Property [ tag ]} ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġlog Resource Api . finish Log ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtag Ġ= Ġtag , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjob Id Ġ= Ġjob Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Count Ġ= Ġexecute Count , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsub Tag Ġ= Ġsub Tag , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Mode Ġ= Ġelement Id 2 Log Property [ tag ]?. log Storage Mode ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result . isNot Ok ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" Fail Ġto Ġsend Ġthe Ġlog Ġstatus Ġ ï¼ļ ${ result . message }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ignored : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn (" Fail Ġto Ġfinish Ġthe Ġlogs ", Ġignored ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfix Upload Message ( log Message : ĠLog Message ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġ åŃĹç¬¦ æķ° è¶ħè¿ĩ 3 2 7 6 6 æĹ¶ analyzer ç´¢å¼ķ åĪĨæŀĲ å°Ĩ å¤± æķĪ ï¼Į åĲĮæĹ¶ ä¸º ä¿Ŀ æĬ¤ ç³»ç»Ł ç¨ ³ å®ļ æĢ§ ï¼Į èĭ¥ éħįç½® åĢ¼ ä¸ºç©º æĪĸ è´Ł æķ° åĪĻ éĻĲåĪ¶ ä¸º 3 2 KB ĊĠĠĠĠĠĠĠ Ġif Ġ( log Message . message . length Ġ> ĠLOG _ MESSAGE _ LENGTH _ LIMIT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlogMessage . message Ġ= ĠAn si (). bold (). fg Yellow () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. a ("[ Length Ġexceeds Ġlimit ]") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. reset (). toString () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠlogMessage . message Ġ= ĠCommon Utils . intercept String In Length ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstring Ġ= ĠlogMessage . message , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlength Ġ= ĠLOG _ MESSAGE _ LENGTH _ LIMIT ĊĠĠĠĠĠĠĠ Ġ) Ġ?: Ġ"" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdisable Log Upload () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġå°Ĩ å·² æľī ä»»åĬ¡ çļĦ æĹ¥å¿Ĺ æ¨¡å¼ı éĥ½ è®¾ ä¸º æľ¬åľ° ä¿ĿåŃĺ ĊĠĠĠĠĠĠĠ Ġelement Id 2 Log Property . forEach Ġ{ Ġ( element Id , Ġproperty ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn (" Set ĠTask [$ element Id ] Ġlog Mode Ġto Ġ${ Log Storage Mode . LOCAL . name }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproperty . log Storage Mode Ġ= ĠLog Storage Mode . LOCAL ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġå°Ĩ åħ¨å±Ģ æĹ¥å¿Ĺ æ¨¡å¼ı è®¾ ä¸º æľ¬åľ° ä¿ĿåŃĺ ĊĠĠĠĠĠĠĠ Ġlogger . warn (" Set ĠAgent Env Ġlog Mode Ġto Ġ${ Log Storage Mode . LOCAL . name }") ĊĠĠĠĠĠĠĠ ĠAgent Env . set Log Mode ( Log Storage Mode . LOCAL ) ĊĠĠĠ Ġ} Ċ } Ċ