@ -17,6 +17,9 @@ import org.springframework.cloud.commons.util.InetUtils;
import org.springframework.core.env.Environment ;
import java.text.SimpleDateFormat ;
import java.util.Arrays ;
import java.util.regex.Matcher ;
import java.util.regex.Pattern ;
/ * *
* desc : 发送日志消息
@ -25,150 +28,276 @@ import java.text.SimpleDateFormat;
* @author : jianjun liu
* /
public class LogMsgSendFilter extends LevelFilter {
private static final Logger logger = LoggerFactory . getLogger ( LogMsgSendFilter . class ) ;
private DingdingMsgSender msgSender = new DingdingMsgSender ( ) ;
private String webHook ;
private String secret ;
private String appName ;
private String activeEnv ;
private String serverIp ;
@Override
public FilterReply decide ( ILoggingEvent event ) {
//如果日志级别等于设置的日志级别 则发送消息
if ( event . getLevel ( ) . isGreaterOrEqual ( Level . ERROR ) ) {
try {
StringBuilder stringBuilder = new StringBuilder ( ) ;
stringBuilder . append ( "【日志告警】\n" ) ;
stringBuilder . append ( "\n" ) ;
stringBuilder . append ( "告警级别:" + event . getLevel ( ) ) ;
stringBuilder . append ( "\n" ) ;
if ( StringUtils . isNotBlank ( appName ) ) {
stringBuilder . append ( "服务名称:" + appName ) ;
stringBuilder . append ( "\n" ) ;
}
getServerInfo ( ) ;
if ( StringUtils . isNotBlank ( activeEnv ) ) {
stringBuilder . append ( "告警环境:" + EnvEnum . getEnum ( activeEnv ) . getName ( ) ) ;
stringBuilder . append ( "\n" ) ;
}
if ( StringUtils . isNotBlank ( serverIp ) ) {
stringBuilder . append ( "IP地址:" + serverIp ) ;
stringBuilder . append ( "\n" ) ;
}
stringBuilder . append ( "故障时间:" + formatLongTime2Str ( event . getTimeStamp ( ) ) ) ;
stringBuilder . append ( "\n" ) ;
stringBuilder . append ( "TraceId:" + Thread . currentThread ( ) . getName ( ) ) ;
stringBuilder . append ( "\n" ) ;
stringBuilder . append ( "告警信息:" + event . getFormattedMessage ( ) ) ;
stringBuilder . append ( "\n" ) ;
IThrowableProxy throwableProxy = event . getThrowableProxy ( ) ;
//异常信息处理 暂时处理一级的5行数据
apendStackInfo ( stringBuilder , throwableProxy ) ;
DingTalkTextMsg msg = new DingTalkTextMsg ( ) ;
msg . setContent ( stringBuilder . toString ( ) ) ;
if ( StringUtils . isNotBlank ( webHook ) ) {
msg . setWebHook ( webHook ) ;
}
if ( StringUtils . isNotBlank ( secret ) ) {
msg . setSecret ( secret ) ;
}
boolean flag = msgSender . sendMsgAsync ( msg ) ;
if ( ! flag ) {
logger . warn ( "msgSender.sendMsg fail,param:{}" , stringBuilder . toString ( ) ) ;
}
} catch ( Exception e ) {
logger . warn ( "decide exception" , e ) ;
}
}
//交给其他filter继续向下处理
return super . decide ( event ) ;
}
/ * *
* desc : 获取服务 ip及profile信息
* /
private void getServerInfo ( ) {
try {
if ( serverIp = = null ) {
InetUtils inetUtils = SpringContextUtils . getBean ( InetUtils . class ) ;
serverIp = inetUtils . findFirstNonLoopbackHostInfo ( ) . getIpAddress ( ) ;
}
} catch ( Exception e ) {
logger . warn ( "getServerInfo get bean InetUtils exception" , e ) ;
return ;
}
try {
if ( activeEnv = = null ) {
Environment environment = SpringContextUtils . getBean ( Environment . class ) ;
String [ ] activeProfiles = environment . getActiveProfiles ( ) ;
if ( activeProfiles ! = null & & activeProfiles . length > 0 ) {
logger . info ( "activeProfiles:{}" , activeProfiles ) ;
activeEnv = activeProfiles [ 0 ] ;
}
}
} catch ( Exception e ) {
logger . warn ( "getServerInfo get bean Environment exception" , e ) ;
}
}
private void apendStackInfo ( StringBuilder stringBuilder , IThrowableProxy throwableProxy ) {
int defaultRowLine = 5 ;
if ( throwableProxy ! = null ) {
stringBuilder . append ( "异常信息:" )
. append ( throwableProxy . getClassName ( ) )
. append ( " : " )
. append ( throwableProxy . getMessage ( ) )
. append ( "\n" ) ;
StackTraceElementProxy [ ] stackTraceElementProxyArray = throwableProxy . getStackTraceElementProxyArray ( ) ;
StackTraceElementProxy stackTraceElementProxy = null ;
if ( stackTraceElementProxyArray . length < defaultRowLine ) {
defaultRowLine = stackTraceElementProxyArray . length ;
}
for ( int i = 0 ; i < defaultRowLine ; i + + ) {
stackTraceElementProxy = stackTraceElementProxyArray [ i ] ;
StackTraceElement stackTraceElement = stackTraceElementProxy . getStackTraceElement ( ) ;
stringBuilder . append ( "\t\tat " ) ;
stringBuilder . append ( stackTraceElement . getClassName ( ) ) ;
stringBuilder . append ( "." ) ;
stringBuilder . append ( stackTraceElement . getMethodName ( ) ) ;
stringBuilder . append ( "(" ) ;
stringBuilder . append ( stackTraceElement . getFileName ( ) ) ;
stringBuilder . append ( ":" ) ;
stringBuilder . append ( stackTraceElement . getLineNumber ( ) ) ;
stringBuilder . append ( ")" ) ;
stringBuilder . append ( "\n" ) ;
}
}
}
private String formatLongTime2Str ( long timestamp ) {
SimpleDateFormat dateFormat = new SimpleDateFormat ( "yyyy-MM-dd HH:mm:ss.SSS" ) ;
return dateFormat . format ( timestamp ) ;
}
public void setActiveEnv ( String activeEnv ) {
this . activeEnv = activeEnv ;
}
public void setAppName ( String appName ) {
this . appName = appName ;
}
public void setWebHook ( String webHook ) {
this . webHook = webHook ;
}
public void setSecret ( String secret ) {
this . secret = secret ;
}
private static final Logger logger = LoggerFactory . getLogger ( LogMsgSendFilter . class ) ;
private DingdingMsgSender msgSender = new DingdingMsgSender ( ) ;
private String webHook ;
private String secret ;
private String appName ;
private String activeEnv ;
private String serverIp ;
private String baseProjectPackage = "com.epmet" ;
@Override
public FilterReply decide ( ILoggingEvent event ) {
//如果日志级别等于设置的日志级别 则发送消息
if ( event . getLevel ( ) . isGreaterOrEqual ( Level . ERROR ) ) {
try {
StringBuilder stringBuilder = new StringBuilder ( ) ;
stringBuilder . append ( "【日志告警】\n" ) ;
stringBuilder . append ( "\n" ) ;
stringBuilder . append ( "告警级别:" + event . getLevel ( ) ) ;
stringBuilder . append ( "\n" ) ;
if ( StringUtils . isNotBlank ( appName ) ) {
stringBuilder . append ( "服务名称:" + appName ) ;
stringBuilder . append ( "\n" ) ;
}
getServerInfo ( ) ;
if ( StringUtils . isNotBlank ( activeEnv ) ) {
stringBuilder . append ( "告警环境:" + EnvEnum . getEnum ( activeEnv ) . getName ( ) ) ;
stringBuilder . append ( "\n" ) ;
}
if ( StringUtils . isNotBlank ( serverIp ) ) {
stringBuilder . append ( "IP地址:" + serverIp ) ;
stringBuilder . append ( "\n" ) ;
}
stringBuilder . append ( "故障时间:" + formatLongTime2Str ( event . getTimeStamp ( ) ) ) ;
stringBuilder . append ( "\n" ) ;
stringBuilder . append ( "TraceId:" + Thread . currentThread ( ) . getName ( ) ) ;
stringBuilder . append ( "\n" ) ;
String formattedMessage = event . getFormattedMessage ( ) ;
IThrowableProxy throwableProxy = event . getThrowableProxy ( ) ;
if ( throwableProxy = = null & & formattedMessage . length ( ) > 1000 ) {
formattedMessage = formattedMessage . substring ( 0 , getCharacterPosition ( formattedMessage , baseProjectPackage , 5 ) ) ;
}
stringBuilder . append ( "告警信息:" + formattedMessage ) ;
stringBuilder . append ( "\n" ) ;
//异常信息处理 暂时处理一级的5行数据
apendStackInfo ( stringBuilder , throwableProxy ) ;
DingTalkTextMsg msg = new DingTalkTextMsg ( ) ;
msg . setContent ( stringBuilder . toString ( ) ) ;
if ( StringUtils . isNotBlank ( webHook ) ) {
msg . setWebHook ( webHook ) ;
}
if ( StringUtils . isNotBlank ( secret ) ) {
msg . setSecret ( secret ) ;
}
boolean flag = msgSender . sendMsgAsync ( msg ) ;
if ( ! flag ) {
logger . warn ( "msgSender.sendMsg fail,param:{}" , stringBuilder . toString ( ) ) ;
}
} catch ( Exception e ) {
logger . warn ( "decide exception" , e ) ;
}
}
//交给其他filter继续向下处理
return super . decide ( event ) ;
}
/ * *
* desc : 获取服务 ip及profile信息
* /
private void getServerInfo ( ) {
try {
if ( serverIp = = null ) {
InetUtils inetUtils = SpringContextUtils . getBean ( InetUtils . class ) ;
serverIp = inetUtils . findFirstNonLoopbackHostInfo ( ) . getIpAddress ( ) ;
}
} catch ( Exception e ) {
logger . warn ( "getServerInfo get bean InetUtils exception" , e ) ;
return ;
}
try {
if ( activeEnv = = null ) {
Environment environment = SpringContextUtils . getBean ( Environment . class ) ;
String [ ] activeProfiles = environment . getActiveProfiles ( ) ;
if ( activeProfiles ! = null & & activeProfiles . length > 0 ) {
logger . info ( "activeProfiles:{}" , activeProfiles ) ;
activeEnv = activeProfiles [ 0 ] ;
}
}
} catch ( Exception e ) {
logger . warn ( "getServerInfo get bean Environment exception" , e ) ;
}
}
private void apendStackInfo ( StringBuilder stringBuilder , IThrowableProxy throwableProxy ) {
int defaultRowLine = 5 ;
if ( throwableProxy ! = null ) {
stringBuilder . append ( "异常信息:" )
. append ( throwableProxy . getClassName ( ) )
. append ( " : " )
. append ( throwableProxy . getMessage ( ) )
. append ( "\n" ) ;
StackTraceElementProxy [ ] stackTraceElementProxyArray = throwableProxy . getStackTraceElementProxyArray ( ) ;
StackTraceElementProxy stackTraceElementProxy = null ;
if ( stackTraceElementProxyArray . length < defaultRowLine ) {
defaultRowLine = stackTraceElementProxyArray . length ;
}
for ( int i = 0 ; i < defaultRowLine ; i + + ) {
stackTraceElementProxy = stackTraceElementProxyArray [ i ] ;
StackTraceElement stackTraceElement = stackTraceElementProxy . getStackTraceElement ( ) ;
stringBuilder . append ( "\t\tat " ) ;
stringBuilder . append ( stackTraceElement . getClassName ( ) ) ;
stringBuilder . append ( "." ) ;
stringBuilder . append ( stackTraceElement . getMethodName ( ) ) ;
stringBuilder . append ( "(" ) ;
stringBuilder . append ( stackTraceElement . getFileName ( ) ) ;
stringBuilder . append ( ":" ) ;
stringBuilder . append ( stackTraceElement . getLineNumber ( ) ) ;
stringBuilder . append ( ")" ) ;
stringBuilder . append ( "\n" ) ;
}
}
}
public static void main ( String [ ] args ) {
String msg = "<<<<<<<<异常响应<<<<<<<<:事务流水号:na1597027822634, 执行时长:59ms, 响应数据:{\"code\":8102,\"internalMsg\":\"验证码错误\",\"msg\":\"验证码错误\"}, 异常信息:验证码错误, 堆栈信息:com.epmet.commons.tools.exception.RenException: \n" +
" at com.epmet.service.impl.VolunteerInfoServiceImpl.authenticate(VolunteerInfoServiceImpl.java:91)\n" +
" at com.epmet.service.impl.VolunteerInfoServiceImpl$$FastClassBySpringCGLIB$$7babb2e8.invoke(<generated>)\n" +
" at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)\n" +
" at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:750)\n" +
" at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)\n" +
" at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:295)\n" +
" at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:98)\n" +
" at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)\n" +
" at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:689)\n" +
" at com.epmet.service.impl.VolunteerInfoServiceImpl$$EnhancerBySpringCGLIB$$f78b4778.authenticate(<generated>)\n" +
" at com.epmet.controller.ResiVolunteerController.authenticate(ResiVolunteerController.java:59)\n" +
" at com.epmet.controller.ResiVolunteerController$$FastClassBySpringCGLIB$$e023fb55.invoke(<generated>)\n" +
" at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)\n" +
" at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:750)\n" +
" at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)\n" +
" at org.springframework.aop.framework.adapter.MethodBeforeAdviceInterceptor.invoke(MethodBeforeAdviceInterceptor.java:56)\n" +
" at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)\n" +
" at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:88)\n" +
" at com.epmet.commons.tools.aspect.BaseRequestLogAspect.proceed(BaseRequestLogAspect.java:66)\n" +
" at com.epmet.aspect.RequestLogAspect.proceed(RequestLogAspect.java:26)\n" +
" at sun.reflect.GeneratedMethodAccessor195.invoke(Unknown Source)\n" +
" at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\n" +
" at java.lang.reflect.Method.invoke(Method.java:498)\n" +
" at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:644)\n" +
" at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:633)\n" +
" at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70)\n" +
" at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)\n" +
" at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:93)\n" +
" at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)\n" +
" at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:689)\n" +
" at com.epmet.controller.ResiVolunteerController$$EnhancerBySpringCGLIB$$1c0751c0.authenticate(<generated>)\n" +
" at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\n" +
" at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)\n" +
" at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\n" +
" at java.lang.reflect.Method.invoke(Method.java:498)\n" +
" at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190)\n" +
" at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138)\n" +
" at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:105)\n" +
" at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:893)\n" +
" at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:798)\n" +
" at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\n" +
" at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040)\n" +
" at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943)\n" +
" at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)\n" +
" at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909)\n" +
" at javax.servlet.http.HttpServlet.service(HttpServlet.java:660)\n" +
" at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)\n" +
" at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)\n" +
" at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)\n" +
" at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)\n" +
" at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)\n" +
" at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)\n" +
" at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)\n" +
" at org.springframework.boot.actuate.web.trace.servlet.HttpTraceFilter.doFilterInternal(HttpTraceFilter.java:88)\n" +
" at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n" +
" at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)\n" +
" at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)\n" +
" at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\n" +
" at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n" +
" at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)\n" +
" at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)\n" +
" at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\n" +
" at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n" +
" at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)\n" +
" at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)\n" +
" at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:94)\n" +
" at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n" +
" at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)\n" +
" at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)\n" +
" at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.filterAndRecordMetrics(WebMvcMetricsFilter.java:114)\n" +
" at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:104)\n" +
" at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n" +
" at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)\n" +
" at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)\n" +
" at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\n" +
" at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\n" +
" at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)\n" +
" at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)\n" +
" at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)\n" +
" at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)\n" +
" at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:526)\n" +
" at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)\n" +
" at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)\n" +
" at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\n" +
" at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)\n" +
" at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:367)\n" +
" at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)\n" +
" at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:860)\n" +
" at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1591)\n" +
" at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)\n" +
" at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)\n" +
" at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)\n" +
" at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)\n" +
" at java.lang.Thread.run(Thread.java:745)" ;
String substring = msg . substring ( 0 , getCharacterPosition ( msg , "com.epme1t" , 5 ) ) ;
System . out . println ( substring ) ;
}
public static int getCharacterPosition ( String string , String findStr , int time ) {
Matcher slashMatcher = null ;
try {
slashMatcher = Pattern . compile ( findStr ) . matcher ( string ) ;
int mIdx = 0 ;
while ( slashMatcher . find ( ) ) {
mIdx + + ;
if ( mIdx = = time ) {
break ;
}
}
return slashMatcher . start ( ) ;
} catch ( Exception e ) {
logger . warn ( "getCharacterPosition no matche" ) ;
return 0 ;
}
}
private String formatLongTime2Str ( long timestamp ) {
SimpleDateFormat dateFormat = new SimpleDateFormat ( "yyyy-MM-dd HH:mm:ss.SSS" ) ;
return dateFormat . format ( timestamp ) ;
}
public void setActiveEnv ( String activeEnv ) {
this . activeEnv = activeEnv ;
}
public void setAppName ( String appName ) {
this . appName = appName ;
}
public void setWebHook ( String webHook ) {
this . webHook = webHook ;
}
public void setSecret ( String secret ) {
this . secret = secret ;
}
}