diff options
| author | wangkuan <[email protected]> | 2024-02-07 15:55:46 +0800 |
|---|---|---|
| committer | wangkuan <[email protected]> | 2024-02-07 15:55:46 +0800 |
| commit | e212210312ad5b8a5ff2edd022ac860a711a9312 (patch) | |
| tree | bc875c54408c7f264381ed23c72e740651b492a9 | |
| parent | f55325e4060b98daf10eb005b93178cde4b7bbdb (diff) | |
[feature][core]增加filter与processor的metrics输出,统一日志输出
8 files changed, 110 insertions, 58 deletions
diff --git a/groot-core/src/main/java/com/geedgenetworks/core/filter/AviatorFilter.java b/groot-core/src/main/java/com/geedgenetworks/core/filter/AviatorFilter.java index 0da93b7..dae6f94 100644 --- a/groot-core/src/main/java/com/geedgenetworks/core/filter/AviatorFilter.java +++ b/groot-core/src/main/java/com/geedgenetworks/core/filter/AviatorFilter.java @@ -15,11 +15,11 @@ public class AviatorFilter implements Filter { return singleOutputStreamOperator .filter(new FilterFunction(FilterConfig)) .setParallelism(FilterConfig.getParallelism()) - .name("Filter"); + .name(FilterConfig.getName()); } else { return singleOutputStreamOperator .filter(new FilterFunction(FilterConfig)) - .name("Filter"); + .name(FilterConfig.getName()); } } } diff --git a/groot-core/src/main/java/com/geedgenetworks/core/filter/FilterFunction.java b/groot-core/src/main/java/com/geedgenetworks/core/filter/FilterFunction.java index deac4b5..144d138 100644 --- a/groot-core/src/main/java/com/geedgenetworks/core/filter/FilterFunction.java +++ b/groot-core/src/main/java/com/geedgenetworks/core/filter/FilterFunction.java @@ -11,14 +11,18 @@ import com.googlecode.aviator.exception.ExpressionRuntimeException; import lombok.extern.slf4j.Slf4j; import org.apache.flink.api.common.functions.RichFilterFunction; import org.apache.flink.configuration.Configuration; +import org.apache.flink.metrics.Counter; import java.util.Map; @Slf4j public class FilterFunction extends RichFilterFunction<Event> { private final com.geedgenetworks.core.pojo.FilterConfig FilterConfig; - private static Expression compiledExp; private static String expression; + private transient Counter droppedEvents; + private transient Counter errorEvents; + private transient Counter outEvents; + private transient Counter inEvents; public FilterFunction(FilterConfig FilterConfig) { this.FilterConfig = FilterConfig; } @@ -32,11 +36,15 @@ public class FilterFunction extends RichFilterFunction<Event> { instance.setOption(Options.OPTIMIZE_LEVEL, AviatorEvaluator.EVAL); instance.setFunctionMissing(null); compiledExp = instance.compile(expression, true); - + this.errorEvents = getRuntimeContext().getMetricGroup().counter("error_events"); + this.droppedEvents = getRuntimeContext().getMetricGroup().counter("dropped_events"); + this.inEvents = getRuntimeContext().getMetricGroup().counter("in_events"); + this.outEvents = getRuntimeContext().getMetricGroup().counter("out_events"); } @Override public boolean filter(Event value) { + inEvents.inc(); boolean isFilter ; try { @@ -51,9 +59,17 @@ public class FilterFunction extends RichFilterFunction<Event> { } catch (ExpressionRuntimeException e){ isFilter = false; log.error("Invalid filter ! expression=" +expression); + errorEvents.inc(); } catch (RuntimeException ignored) { isFilter = false; + errorEvents.inc(); + } + if(isFilter){ + outEvents.inc(); + } + else { + droppedEvents.inc(); } return isFilter; } diff --git a/groot-core/src/main/java/com/geedgenetworks/core/processor/projection/ProjectionProcessFunction.java b/groot-core/src/main/java/com/geedgenetworks/core/processor/projection/ProjectionProcessFunction.java index 686e5b9..8cd889c 100644 --- a/groot-core/src/main/java/com/geedgenetworks/core/processor/projection/ProjectionProcessFunction.java +++ b/groot-core/src/main/java/com/geedgenetworks/core/processor/projection/ProjectionProcessFunction.java @@ -19,17 +19,25 @@ import com.googlecode.aviator.Options; import com.googlecode.aviator.exception.ExpressionRuntimeException; import lombok.extern.slf4j.Slf4j; import org.apache.flink.configuration.Configuration; +import org.apache.flink.metrics.Counter; import org.apache.flink.streaming.api.functions.ProcessFunction; import org.apache.flink.util.Collector; + import java.lang.reflect.Method; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; + @Slf4j public class ProjectionProcessFunction extends ProcessFunction<Event, Event> { private final ProjectionConfig projectionConfig; - private LinkedList<UdfEntity> functions ; + private LinkedList<UdfEntity> functions; + private transient Counter droppedEvents; + private transient Counter errorEvents; + private transient Counter outEvents; + private transient Counter inEvents; + public ProjectionProcessFunction(ProjectionConfig projectionConfig) { this.projectionConfig = projectionConfig; @@ -45,9 +53,9 @@ public class ProjectionProcessFunction extends ProcessFunction<Event, Event> { } Configuration configuration = (Configuration) getRuntimeContext().getExecutionConfig().getGlobalJobParameters(); List<String> udfClassNameLists = JSON.parseObject(configuration.toMap().get(Constants.SYSPROP_UDF_PLUGIN_CONFIG), List.class); - Map<String,String> udfClassReflect =getClassReflect(udfClassNameLists); + Map<String, String> udfClassReflect = getClassReflect(udfClassNameLists); CommonConfig commonConfig = JSON.parseObject(configuration.toMap().get(Constants.SYSPROP_GROOTSTREAM_CONFIG), CommonConfig.class); - KnowledgeBaseScheduler.startSchedulerForKnowledgeBase(Integer.parseInt(commonConfig.getPropertiesConfig().getOrDefault("scheduler.knowledge_base.update.interval.minutes","5"))); + KnowledgeBaseScheduler.startSchedulerForKnowledgeBase(Integer.parseInt(commonConfig.getPropertiesConfig().getOrDefault("scheduler.knowledge_base.update.interval.minutes", "5"))); for (UDFContext udfContext : udfContexts) { Expression filterExpression = null; UdfEntity udfEntity = new UdfEntity(); @@ -73,29 +81,37 @@ public class ProjectionProcessFunction extends ProcessFunction<Event, Event> { throw new GrootStreamRuntimeException(CommonErrorCode.UNSUPPORTED_OPERATION, "Unsupported UDF: " + udfContext.getFunction()); } + } + this.errorEvents = getRuntimeContext().getMetricGroup().counter("error_events"); + this.droppedEvents = getRuntimeContext().getMetricGroup().counter("dropped_events"); + this.inEvents = getRuntimeContext().getMetricGroup().counter("in_events"); + this.outEvents = getRuntimeContext().getMetricGroup().counter("out_events"); } catch (Exception e) { - throw new GrootStreamRuntimeException(CommonErrorCode.UNSUPPORTED_OPERATION, "Initialization UDF failed!",e); + throw new GrootStreamRuntimeException(CommonErrorCode.UNSUPPORTED_OPERATION, "Initialization UDF failed!", e); } } @Override public void processElement(Event event, Context ctx, Collector<Event> out) { - for(UdfEntity udfEntity: functions){ + inEvents.inc(); + for (UdfEntity udfEntity : functions) { try { if (event.isDropped()) { break; } else { - boolean result = udfEntity.getFilterExpression() != null ? filterExecute(udfEntity.getFilterExpression(),udfEntity.getFilterExpression().newEnv("event", event.getExtractedFields())) : true; + boolean result = udfEntity.getFilterExpression() != null ? filterExecute(udfEntity.getFilterExpression(), udfEntity.getFilterExpression().newEnv("event", event.getExtractedFields())) : true; if (result) { udfEntity.getUdfFunction().evaluate(event); } } } catch (ExpressionRuntimeException ignore) { - log.error("Function "+udfEntity.getName()+" Invalid filter ! "); - } catch (Exception e){ - log.error("Function "+udfEntity.getName()+" execute exception !", e); + log.error("Function " + udfEntity.getName() + " Invalid filter ! "); + errorEvents.inc(); + } catch (Exception e) { + log.error("Function " + udfEntity.getName() + " execute exception !", e); + errorEvents.inc(); } } @@ -113,8 +129,14 @@ public class ProjectionProcessFunction extends ProcessFunction<Event, Event> { ColumnUtil.columnRemover( event.getExtractedFields(), projectionConfig.getRemove_fields())); } - if (!event.isDropped()) {out.collect(event);} + if (!event.isDropped()) { + out.collect(event); + outEvents.inc(); + } else { + droppedEvents.inc(); + } } + public static Map<String, String> getClassReflect(List<String> plugins) { Map<String, String> classReflect = new HashMap<>(); @@ -135,14 +157,13 @@ public class ProjectionProcessFunction extends ProcessFunction<Event, Event> { return classReflect; } - public static Boolean filterExecute(Expression expression,Map<String, Object> map) { + public static Boolean filterExecute(Expression expression, Map<String, Object> map) { - boolean result ; + boolean result; Object object = expression.execute(map); - if(object != null){ + if (object != null) { result = (Boolean) object; - } - else { + } else { throw new ExpressionRuntimeException(); } return result; @@ -151,7 +172,7 @@ public class ProjectionProcessFunction extends ProcessFunction<Event, Event> { @Override public void close() throws Exception { - for(UdfEntity udfEntity: functions){ + for (UdfEntity udfEntity : functions) { udfEntity.getUdfFunction().close(); } @@ -159,4 +180,24 @@ public class ProjectionProcessFunction extends ProcessFunction<Event, Event> { super.close(); } + public static String convertToCamelCase(String input) { + StringBuilder result = new StringBuilder(); + + // 分割单词 + String[] words = input.toLowerCase().split("_"); + + for (int i = 0; i < words.length; i++) { + String word = words[i]; + + // 首字母大写(除了第一个单词) + if (i != 0) { + char firstChar = Character.toUpperCase(word.charAt(0)); + word = firstChar + word.substring(1); + } + + result.append(word); + } + + return result.toString(); + } } diff --git a/groot-core/src/main/java/com/geedgenetworks/core/udf/knowlegdebase/KnowledgeBaseScheduler.java b/groot-core/src/main/java/com/geedgenetworks/core/udf/knowlegdebase/KnowledgeBaseScheduler.java index cd9ad95..2047bb7 100644 --- a/groot-core/src/main/java/com/geedgenetworks/core/udf/knowlegdebase/KnowledgeBaseScheduler.java +++ b/groot-core/src/main/java/com/geedgenetworks/core/udf/knowlegdebase/KnowledgeBaseScheduler.java @@ -1,6 +1,5 @@ package com.geedgenetworks.core.udf.knowlegdebase; -import com.esotericsoftware.minlog.Log; import com.geedgenetworks.core.utils.SchedulerUtils; import lombok.extern.slf4j.Slf4j; import org.quartz.*; @@ -36,7 +35,7 @@ public class KnowledgeBaseScheduler { // 将定时任务和触发器绑定到调度器 scheduler.scheduleJob(jobDetail, trigger); // 启动调度器 - Log.warn("Start scheduler task !"); + log.warn("Start scheduler task !"); SchedulerUtils.startScheduler(); methodCalled =true; @@ -49,12 +48,12 @@ public class KnowledgeBaseScheduler { Scheduler scheduler = SchedulerUtils.getScheduler(); if(scheduler.checkExists(JobKey.jobKey(JOB_NAME))){ - Log.warn("Delete scheduler update job "+JOB_NAME); + log.warn("Delete scheduler update job "+JOB_NAME); scheduler.deleteJob(JobKey.jobKey(JOB_NAME)); } if(scheduler.getCurrentlyExecutingJobs().isEmpty()){ - Log.warn("Shutdown scheduler task !"); + log.warn("Shutdown scheduler task !"); SchedulerUtils.shutdownScheduler(); } // 启动调度器 diff --git a/groot-core/src/main/java/com/geedgenetworks/core/udf/knowlegdebase/KnowledgeBaseUpdateJob.java b/groot-core/src/main/java/com/geedgenetworks/core/udf/knowlegdebase/KnowledgeBaseUpdateJob.java index 4c10e22..84a7be4 100644 --- a/groot-core/src/main/java/com/geedgenetworks/core/udf/knowlegdebase/KnowledgeBaseUpdateJob.java +++ b/groot-core/src/main/java/com/geedgenetworks/core/udf/knowlegdebase/KnowledgeBaseUpdateJob.java @@ -1,6 +1,5 @@ package com.geedgenetworks.core.udf.knowlegdebase; -import com.esotericsoftware.minlog.Log; import com.geedgenetworks.common.config.KnowledgeBaseConfig; import com.geedgenetworks.core.pojo.KnowledgeBaseConfigWithHandler; import com.geedgenetworks.core.udf.knowlegdebase.handler.AbstractKnowledgeBaseHandler; @@ -25,7 +24,7 @@ public class KnowledgeBaseUpdateJob implements Job { try { knowledgeBaseConfigWithHandler.getAbstractKnowledgeBaseHandler().updateKnowledgeBase(); } catch (Exception e) { - Log.error(e.getMessage()); + log.error(e.getMessage()); } } @@ -42,9 +41,9 @@ public class KnowledgeBaseUpdateJob implements Job { try { isSuccess = abstractKnowledgeBaseHandler.initKnowledgeBase(knowledgeBaseConfig); KnowLedgeBaseEntityMap.put(knowledgeBaseConfig.getName(), knowledgeBaseConfigWithHandler); - Log.warn("initKnowledgeBase "+knowledgeBaseConfig.getName() + "Success"); + log.warn("initKnowledgeBase "+knowledgeBaseConfig.getName() + "Success"); } catch (Exception e) { - Log.error("initKnowledgeBase "+knowledgeBaseConfig.getName() + "Error" + e.getMessage()); + log.error("initKnowledgeBase "+knowledgeBaseConfig.getName() + "Error" + e.getMessage()); } } else { isSuccess = true; @@ -60,13 +59,13 @@ public class KnowledgeBaseUpdateJob implements Job { @Override public void execute(JobExecutionContext jobExecutionContext) { - Log.warn("Start scheduler knowledge_base update job !"); + log.warn("Start scheduler knowledge_base update job !"); if (!KnowLedgeBaseEntityMap.isEmpty()) { for (Map.Entry<String, KnowledgeBaseConfigWithHandler> entry : KnowLedgeBaseEntityMap.entrySet()) { try { updateKnowledgeBase(entry.getValue()); } catch (Exception e) { - Log.error(e.getMessage()); + log.error(e.getMessage()); } } } diff --git a/groot-core/src/main/java/com/geedgenetworks/core/udf/knowlegdebase/handler/AbstractKnowledgeBaseHandler.java b/groot-core/src/main/java/com/geedgenetworks/core/udf/knowlegdebase/handler/AbstractKnowledgeBaseHandler.java index 97207a3..96eeb11 100644 --- a/groot-core/src/main/java/com/geedgenetworks/core/udf/knowlegdebase/handler/AbstractKnowledgeBaseHandler.java +++ b/groot-core/src/main/java/com/geedgenetworks/core/udf/knowlegdebase/handler/AbstractKnowledgeBaseHandler.java @@ -2,7 +2,6 @@ package com.geedgenetworks.core.udf.knowlegdebase.handler; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONArray; -import com.esotericsoftware.minlog.Log; import com.geedgenetworks.common.config.KnowledgeBaseConfig; import com.geedgenetworks.core.pojo.KnowLedgeBaseFileMeta; import com.geedgenetworks.core.utils.HttpClientPoolUtil; @@ -36,7 +35,7 @@ public abstract class AbstractKnowledgeBaseHandler { result.append(String.format("%02x", b)); } } catch (NoSuchAlgorithmException e) { - Log.error("calculateSHA256 error: " + e.getMessage()); + log.error("calculateSHA256 error: " + e.getMessage()); } return result.toString(); } @@ -50,10 +49,10 @@ public abstract class AbstractKnowledgeBaseHandler { HttpClientPoolUtil httpClientPoolUtil = HttpClientPoolUtil.getInstance(); inputStream = httpClientPoolUtil.httpGetByte(fileUrl); long end = System.currentTimeMillis(); - Log.info( + log.info( "download file " + fileUrl + " finished, speed " + (end - start) + " ms"); } catch (Exception e) { - Log.error("download file " + fileUrl + " error: " + e.getMessage()); + log.error("download file " + fileUrl + " error: " + e.getMessage()); } } return inputStream; @@ -80,11 +79,11 @@ public abstract class AbstractKnowledgeBaseHandler { case "hdfs": break; default: - Log.error("get file Metadata error: fs_type not suppoort !"); + log.error("get file Metadata error: fs_type not suppoort !"); break; } } catch (Exception e) { - Log.error("get file Metadata error! path = " + path + " " + e.getMessage()); + log.error("get file Metadata error! path = " + path + " " + e.getMessage()); } return knowLedgeBaseFileMetaList; @@ -107,17 +106,17 @@ public abstract class AbstractKnowledgeBaseHandler { knowLedgeBaseFileMetaList.removeIf(knowLedgeBaseFileMeta -> !"latest".equals(knowLedgeBaseFileMeta.getVersion())); break; case "local": - Log.error("get file Metadata error: fs_type local not suppoort !"); + log.error("get file Metadata error: fs_type local not suppoort !"); break; case "hdfs": - Log.error("get file Metadata error: fs_type hdfs not suppoort !"); + log.error("get file Metadata error: fs_type hdfs not suppoort !"); break; default: - Log.error("get file Metadata error: fs_type not suppoort !"); + log.error("get file Metadata error: fs_type not suppoort !"); break; } } catch (Exception e) { - Log.error("get file Metadata error! path = " + path + " " + e.getMessage()); + log.error("get file Metadata error! path = " + path + " " + e.getMessage()); return null; } @@ -125,7 +124,7 @@ public abstract class AbstractKnowledgeBaseHandler { return knowLedgeBaseFileMetaList.get(0); } else { - Log.error("file Metadata is null ! path = " + path + "?kb_id=" + kbId); + log.error("file Metadata is null ! path = " + path + "?kb_id=" + kbId); return null; } } diff --git a/groot-core/src/main/java/com/geedgenetworks/core/udf/knowlegdebase/handler/AsnKnowledgeBaseHandler.java b/groot-core/src/main/java/com/geedgenetworks/core/udf/knowlegdebase/handler/AsnKnowledgeBaseHandler.java index 8bd5704..6d5860c 100644 --- a/groot-core/src/main/java/com/geedgenetworks/core/udf/knowlegdebase/handler/AsnKnowledgeBaseHandler.java +++ b/groot-core/src/main/java/com/geedgenetworks/core/udf/knowlegdebase/handler/AsnKnowledgeBaseHandler.java @@ -1,7 +1,6 @@ package com.geedgenetworks.core.udf.knowlegdebase.handler; -import com.esotericsoftware.minlog.Log; import com.geedgenetworks.common.config.KnowledgeBaseConfig; import com.geedgenetworks.core.pojo.KnowLedgeBaseFileMeta; @@ -46,14 +45,14 @@ public class AsnKnowledgeBaseHandler extends AbstractKnowledgeBaseHandler { if (ifNeedUpdate(entry.getValue())) { boolean result = buildKnowledgeBase(entry.getValue().getKnowledgeConfig()); if(result) { - Log.warn("AsnKnowledgeBase " + entry.getKey() + " update success!"); + log.warn("AsnKnowledgeBase " + entry.getKey() + " update success!"); } else { - Log.warn("AsnKnowledgeBase " + entry.getKey() + " update error!"); + log.warn("AsnKnowledgeBase " + entry.getKey() + " update error!"); } } } catch (Exception e) { - Log.error("updateKnowledgeBase " + entry.getKey() + " error " + e.getMessage()); + log.error("updateKnowledgeBase " + entry.getKey() + " error " + e.getMessage()); } } @@ -66,7 +65,7 @@ public class AsnKnowledgeBaseHandler extends AbstractKnowledgeBaseHandler { result = kbNameWithKbConfigAndFileMetas.get(kbName).getIpLookupV2().asnLookup(ip); } } catch (Exception e) { - Log.error("AsnKnowledgeBaseHandler lookUp Error ip = " + ip +" kbName =" + kbName + " error " + e.getMessage()); + log.error("AsnKnowledgeBaseHandler lookUp Error ip = " + ip +" kbName =" + kbName + " error " + e.getMessage()); } return result; } @@ -91,7 +90,7 @@ public class AsnKnowledgeBaseHandler extends AbstractKnowledgeBaseHandler { if (metadata != null) { knowLedgeBaseFileMetas.add(getMetadata(knowledgeBaseConfig.getFsType(), knowledgeBaseConfig.getFsPath(), kbId)); } else { - Log.error("get metadate error !"); + log.error("get metadate error !"); return false; } } @@ -108,11 +107,11 @@ public class AsnKnowledgeBaseHandler extends AbstractKnowledgeBaseHandler { break; } } else { - Log.error("check file sha256 error "); + log.error("check file sha256 error "); return false; } } catch (Exception e) { - Log.error("buildKnowledgeBase error " + e.getMessage()); + log.error("buildKnowledgeBase error " + e.getMessage()); return false; } } diff --git a/groot-core/src/main/java/com/geedgenetworks/core/udf/knowlegdebase/handler/GeoIpKnowledgeBaseHandler.java b/groot-core/src/main/java/com/geedgenetworks/core/udf/knowlegdebase/handler/GeoIpKnowledgeBaseHandler.java index 8667282..a441369 100644 --- a/groot-core/src/main/java/com/geedgenetworks/core/udf/knowlegdebase/handler/GeoIpKnowledgeBaseHandler.java +++ b/groot-core/src/main/java/com/geedgenetworks/core/udf/knowlegdebase/handler/GeoIpKnowledgeBaseHandler.java @@ -1,7 +1,6 @@ package com.geedgenetworks.core.udf.knowlegdebase.handler; -import com.esotericsoftware.minlog.Log; import com.geedgenetworks.common.config.KnowledgeBaseConfig; import com.geedgenetworks.core.pojo.KnowLedgeBaseFileMeta; import com.geedgenetworks.core.pojo.KnowledgeBaseInfoForIpLookUp; @@ -45,14 +44,14 @@ public class GeoIpKnowledgeBaseHandler extends AbstractKnowledgeBaseHandler { if (ifNeedUpdate(entry.getValue())) { boolean result = buildKnowledgeBase(entry.getValue().getKnowledgeConfig()); if(result) { - Log.warn("GeoIpKnowledgeBase " + entry.getKey() + " update success!"); + log.warn("GeoIpKnowledgeBase " + entry.getKey() + " update success!"); } else { - Log.warn("GeoIpKnowledgeBase " + entry.getKey() + " update error!"); + log.warn("GeoIpKnowledgeBase " + entry.getKey() + " update error!"); } } } catch (Exception e) { - Log.error("updateKnowledgeBase " + entry.getKey() + " error " + e.getMessage()); + log.error("updateKnowledgeBase " + entry.getKey() + " error " + e.getMessage()); } } } @@ -77,7 +76,7 @@ public class GeoIpKnowledgeBaseHandler extends AbstractKnowledgeBaseHandler { if (metadata != null) { knowLedgeBaseFileMetas.add(getMetadata(knowledgeBaseConfig.getFsType(), knowledgeBaseConfig.getFsPath(), kbId)); } else { - Log.error("get metadate error !"); + log.error("get metadate error !"); return false; } } @@ -94,11 +93,11 @@ public class GeoIpKnowledgeBaseHandler extends AbstractKnowledgeBaseHandler { break; } } else { - Log.error("check file sha256 error "); + log.error("check file sha256 error "); return false; } } catch (Exception e) { - Log.error("updateKnowledgeBase error " + e.getMessage()); + log.error("updateKnowledgeBase error " + e.getMessage()); return false; } } @@ -144,7 +143,7 @@ public class GeoIpKnowledgeBaseHandler extends AbstractKnowledgeBaseHandler { break; } } catch (Exception e) { - Log.error("GeoIpKnowledgeBaseHandler lookUp Error ip = "+ ip + "kbName =" + kbName + " error " + e.getMessage()); + log.error("GeoIpKnowledgeBaseHandler lookUp Error ip = "+ ip + "kbName =" + kbName + " error " + e.getMessage()); } return result; } @@ -156,7 +155,7 @@ public class GeoIpKnowledgeBaseHandler extends AbstractKnowledgeBaseHandler { response = kbNameWithKbConfigAndFileMetas.get(kbName).getIpLookupV2().infoLookup(ip); } catch (Exception e){ - Log.error("GeoIpKnowledgeBaseHandler lookUpObject Error ip = "+ ip + "kbName =" + kbName + " error " + e.getMessage()); + log.error("GeoIpKnowledgeBaseHandler lookUpObject Error ip = "+ ip + "kbName =" + kbName + " error " + e.getMessage()); } return response; } |
