From 92c1b13ce1a700fd52bcf2c0cf19ab6709934f06 Mon Sep 17 00:00:00 2001 From: liyunfeng Date: Wed, 9 Mar 2022 23:40:20 +0800 Subject: [PATCH] =?UTF-8?q?properties=E5=8F=8D=E5=B0=84=E8=AF=BB=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client/pom.xml | 14 +- .../jlog/client/TracerClientStarter.java | 37 ++--- clientdemo/src/main/resources/jLog.properties | 1 - .../jlog/common/constant/Constant.java | 5 + .../platform/jlog/common/tag/CollectMode.java | 59 ++++++-- .../platform/jlog/common/tag/TagConfig.java | 47 +++--- .../platform/jlog/common/tag/TagHandler.java | 35 +++-- .../jlog/common/utils/CollectionUtil.java | 86 ++++++++++- .../jlog/common/utils/ConfigUtil.java | 74 ++++++++- .../config/apollo/ApolloConfigurator.java | 20 +++ .../jd/platform/jlog/core/Configurator.java | 26 +++- .../jlog/core/ConfiguratorFactory.java | 19 ++- .../com/jd/platform/jlog/core/Constant.java | 4 +- .../platform/jlog/core/FileConfigurator.java | 73 +++++---- .../com/jd/platform/jlog/core/FileNode.java | 30 ++++ .../jd/platform/jlog/core/JcProperties.java | 139 +++++++++++++++++ .../com/jd/platform/jlog/core/NodeBak.java | 142 ++++++++++++++++++ .../com/jd/platform/jlog/core/ObjObj.java | 45 ++++++ .../com/jd/platform/jlog/core/Server.java | 32 ++++ .../platform/jlog/core/TagHandlerBuilder.java | 39 +++++ .../platform/jlog/etcd/EtcdConfigurator.java | 30 +++- .../jd/platform/jlog/etcd/EtcdListener.java | 24 +-- .../jlog/nacos/NacosConfigurator.java | 35 ++++- .../jd/platform/jlog/nacos/NacosConstant.java | 1 - .../com/jd/platform/jlog/nacos/NacosTest.java | 4 +- .../jd/platform/jlog/zk/ZkConfigurator.java | 44 +++--- .../com/jd/platform/jlog/zk/ZkListener.java | 17 ++- .../java/com/jd/platform/jlog/zk/ZkTest.java | 3 - {clientdemo => example}/pom.xml | 6 +- .../jlog/clientdemo/ExampleApplication.java | 4 +- .../appender/TracerLogbackAppender.java | 6 +- .../jlog/clientdemo/config/DemoConfig.java | 0 .../jlog/clientdemo/web/TestController.java | 31 +++- .../platform/jlog/clientdemo/web/TestReq.java | 0 .../src/main/resources/application.properties | 16 ++ .../src/main/resources/application.ymlbak | 0 .../src/main/resources/bakapplication.yml | 7 +- example/src/main/resources/bakjLog.properties | 6 + .../src/main/resources/logback-spring.xml | 0 .../com/jd/platform/jlog/test/Common.java | 4 +- .../jlog/test/EtcdConfiguratorTest.java | 91 +++++++++++ .../jlog/test/FileConfiguratorTest.java | 32 ++-- .../jlog/test/NacosConfiguratorTest.java | 87 +++++++++++ .../platform/jlog/test/TracerPacketTest.java | 4 +- .../jlog/test/ZKConfiguratorTest.java | 37 +++-- pom.xml | 2 +- 46 files changed, 1174 insertions(+), 244 deletions(-) delete mode 100644 clientdemo/src/main/resources/jLog.properties create mode 100644 config/config-core/src/main/java/com/jd/platform/jlog/core/FileNode.java create mode 100644 config/config-core/src/main/java/com/jd/platform/jlog/core/JcProperties.java create mode 100644 config/config-core/src/main/java/com/jd/platform/jlog/core/NodeBak.java create mode 100644 config/config-core/src/main/java/com/jd/platform/jlog/core/ObjObj.java create mode 100644 config/config-core/src/main/java/com/jd/platform/jlog/core/Server.java create mode 100644 config/config-core/src/main/java/com/jd/platform/jlog/core/TagHandlerBuilder.java rename {clientdemo => example}/pom.xml (96%) rename clientdemo/src/main/java/com/jd/platform/jlog/clientdemo/ClientDemoApplication.java => example/src/main/java/com/jd/platform/jlog/clientdemo/ExampleApplication.java (79%) rename {clientdemo => example}/src/main/java/com/jd/platform/jlog/clientdemo/appender/TracerLogbackAppender.java (98%) rename {clientdemo => example}/src/main/java/com/jd/platform/jlog/clientdemo/config/DemoConfig.java (100%) rename {clientdemo => example}/src/main/java/com/jd/platform/jlog/clientdemo/web/TestController.java (56%) rename {clientdemo => example}/src/main/java/com/jd/platform/jlog/clientdemo/web/TestReq.java (100%) create mode 100644 example/src/main/resources/application.properties rename {clientdemo => example}/src/main/resources/application.ymlbak (100%) rename clientdemo/src/main/resources/application.yml => example/src/main/resources/bakapplication.yml (73%) create mode 100644 example/src/main/resources/bakjLog.properties rename {clientdemo => example}/src/main/resources/logback-spring.xml (100%) rename {clientdemo => example}/src/test/java/com/jd/platform/jlog/test/Common.java (93%) create mode 100644 example/src/test/java/com/jd/platform/jlog/test/EtcdConfiguratorTest.java rename {clientdemo => example}/src/test/java/com/jd/platform/jlog/test/FileConfiguratorTest.java (63%) create mode 100644 example/src/test/java/com/jd/platform/jlog/test/NacosConfiguratorTest.java rename {clientdemo => example}/src/test/java/com/jd/platform/jlog/test/TracerPacketTest.java (95%) rename {clientdemo => example}/src/test/java/com/jd/platform/jlog/test/ZKConfiguratorTest.java (69%) diff --git a/client/pom.xml b/client/pom.xml index 26c0923..6de7c96 100644 --- a/client/pom.xml +++ b/client/pom.xml @@ -18,19 +18,17 @@ 1.4-SNAPSHOT - + + - - - + javax.servlet servlet-api diff --git a/client/src/main/java/com/jd/platform/jlog/client/TracerClientStarter.java b/client/src/main/java/com/jd/platform/jlog/client/TracerClientStarter.java index d252b50..1f72fb1 100644 --- a/client/src/main/java/com/jd/platform/jlog/client/TracerClientStarter.java +++ b/client/src/main/java/com/jd/platform/jlog/client/TracerClientStarter.java @@ -1,15 +1,13 @@ package com.jd.platform.jlog.client; +import com.alibaba.fastjson.JSON; import com.jd.platform.jlog.client.mdc.Mdc; import com.jd.platform.jlog.client.task.Monitor; -import com.jd.platform.jlog.client.udp.HttpSender; -import com.jd.platform.jlog.client.udp.UdpClient; -import com.jd.platform.jlog.client.udp.UdpSender; import com.jd.platform.jlog.common.tag.TagConfig; -import com.jd.platform.jlog.common.utils.FastJsonUtils; import com.jd.platform.jlog.core.Configurator; import com.jd.platform.jlog.core.ConfiguratorFactory; +import com.jd.platform.jlog.core.TagHandlerBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -82,45 +80,34 @@ public class TracerClientStarter { * 启动监听 */ public void startPipeline() { - // 校验和设置 - checkAndSetTagConfig(); - - // TagHandler.build(tagConfig); + // 初始化配置 + initJLogConfig(); Context.MDC = mdc; Monitor starter = new Monitor(); starter.start(); - UdpClient udpClient = new UdpClient(); + /* UdpClient udpClient = new UdpClient(); udpClient.start(); //开启发送 UdpSender.uploadToWorker(); //开启大对象http发送 - HttpSender.uploadToWorker(); + HttpSender.uploadToWorker();*/ } /** * 如果未赋值,从配置器获取,底层是Properties */ - private void checkAndSetTagConfig(){ + private void initJLogConfig(){ + LOGGER.info("从主配置获取的tagConfig:{}", JSON.toJSONString(tagConfig)); Configurator configurator = ConfiguratorFactory.getInstance(); - if(tagConfig != null){ - LOGGER.info("从主配置获取的tagConfig:{}", tagConfig.toString()); - configurator.addConfigListener("/application.yml"); - return; - } - String reqTag = configurator.getConfig("reqTags"); - String logTag = configurator.getConfig("logTags"); - String regex = configurator.getConfig("regex"); - String delimiter = configurator.getConfig("delimiter"); - String join = configurator.getConfig("join"); - tagConfig = TagConfig.Builder.aTagConfig().reqTags(FastJsonUtils.toList(reqTag, String.class)) - .logTags(FastJsonUtils.toList(logTag, String.class)) - .regex(regex).delimiter(delimiter).join(join).build(); - LOGGER.info("从配置器获取的tagConfig:{}", tagConfig.toString()); + TagHandlerBuilder.buildTagHandler(tagConfig, configurator); + configurator.addConfigListener("/application.properties"); + // configurator.addConfigListener("/application.yml"); + } } diff --git a/clientdemo/src/main/resources/jLog.properties b/clientdemo/src/main/resources/jLog.properties deleted file mode 100644 index 3dd4dd0..0000000 --- a/clientdemo/src/main/resources/jLog.properties +++ /dev/null @@ -1 +0,0 @@ -reqTags=["AAA","CCC"] \ No newline at end of file diff --git a/common/src/main/java/com/jd/platform/jlog/common/constant/Constant.java b/common/src/main/java/com/jd/platform/jlog/common/constant/Constant.java index 8673867..1c069f4 100644 --- a/common/src/main/java/com/jd/platform/jlog/common/constant/Constant.java +++ b/common/src/main/java/com/jd/platform/jlog/common/constant/Constant.java @@ -34,6 +34,11 @@ public class Constant { */ public static int TAG_NORMAL_KEY_MAX_LEN = 20; + /** + * 可供提取的日志最小长度 + */ + public static int EXTRACT_MIN_LEN = 5; + /** * 符合正则但不构成kv结构的普通日志,如「xx查询为空」 */ diff --git a/common/src/main/java/com/jd/platform/jlog/common/tag/CollectMode.java b/common/src/main/java/com/jd/platform/jlog/common/tag/CollectMode.java index 5e1646c..191ece5 100644 --- a/common/src/main/java/com/jd/platform/jlog/common/tag/CollectMode.java +++ b/common/src/main/java/com/jd/platform/jlog/common/tag/CollectMode.java @@ -10,6 +10,11 @@ package com.jd.platform.jlog.common.tag; public class CollectMode { + /** + * 挂起 不提取不压缩 + */ + public static final long SUSPEND = 0L; + /** * 提取req */ @@ -31,12 +36,12 @@ public class CollectMode { public static final long C_LOG = 1L << 4; /** - * 提取log + * 提取resp */ public static final long E_RESP = 1L << 5; /** - * 压缩log + * 压缩resp */ public static final long C_RESP = 1L << 6; @@ -44,30 +49,56 @@ public class CollectMode { /** ======================================= 下面是组合 ======================================= */ - /** - * 提取req,压缩req - */ - public static final long E_REQ_C_REQ = E_REQ | C_REQ; + /** - * 提取log,压缩log + * 提取req+log */ - public static final long E_LOG_C_LOG = E_LOG | C_LOG; + public static final long EXTRACT_REQ_LOG = E_REQ | E_LOG; /** - * 提取req+log,压缩req + * 提取req+resp */ - public static final long E_REQ_E_LOG_C_REQ = E_REQ | E_LOG | C_REQ; + public static final long EXTRACT_REQ_REQP = E_REQ | E_RESP; /** - * 提取req+log,压缩log + * 提取req+resp */ - public static final long E_REQ_E_LOG_C_LOG = E_REQ | E_LOG | C_LOG; + public static final long EXTRACT_REQ_RESP = E_REQ | E_RESP; /** - * 提取req+log,压缩req+log + * 提取req+log+resp */ - public static final long E_REQ_E_LOG_C_REQ_E_LOG = E_REQ | E_LOG | C_REQ | E_LOG; + public static final long EXTRACT_ALL = E_REQ | E_LOG | E_RESP; + /** + * 压缩req+log + */ + public static final long COMPRESS_REQ_LOG = C_REQ | C_LOG; + + /** + * 压缩req+resp + */ + public static final long COMPRESS_REQ_REQP = C_REQ | C_RESP; + + /** + * 压缩req+resp + */ + public static final long COMPRESS_REQ_C_RESP = C_REQ | C_RESP; + + /** + * 压缩req+log+resp + */ + public static final long COMPRESS_ALL = C_REQ | C_LOG | C_RESP; + + + public static void main(String[] args) { + System.out.println(isMatched(EXTRACT_REQ_LOG, EXTRACT_REQ_RESP)); + } + public static boolean isMatched(long indicator, long position) { + return (indicator & position) == position; + } + } + // curl --location --request POST 'http://10.96.98.110:8058/app/flow/getappraiselist' --header 'Content-Type: application/x-www-form-urlencoded' --data-urlencode 'token=DF9YcBVAaMiLCZtZEZCf6MunJX8I3jWGmQXwRzb-oQIszD1uAjEQgNG7fG1Gq5nx2I6nzBFygwSWn8ZIIKrV3h0hUb3ubUwlKYsuijCNNGE6WVVLCLOQ1uvoLTza6KrCDPJNJfn5RfgjQfgnw8vo7j6KqX-HC0dyCCu58bg974f1U-_CibQWrXlXC-FM8lWrqhZrvVYvCBcSQ7iSur8CAAD__w==' --data-urlencode 'cityID=55000116' --data-urlencode 'appVersion=2.0.28' --data-urlencode 'country=BR' \ No newline at end of file diff --git a/common/src/main/java/com/jd/platform/jlog/common/tag/TagConfig.java b/common/src/main/java/com/jd/platform/jlog/common/tag/TagConfig.java index c71d20a..c6e53a7 100644 --- a/common/src/main/java/com/jd/platform/jlog/common/tag/TagConfig.java +++ b/common/src/main/java/com/jd/platform/jlog/common/tag/TagConfig.java @@ -3,6 +3,9 @@ package com.jd.platform.jlog.common.tag; import java.io.Serializable; import java.util.List; +import static com.jd.platform.jlog.common.tag.CollectMode.COMPRESS_ALL; +import static com.jd.platform.jlog.common.tag.CollectMode.EXTRACT_ALL; + /** * @author tangbohu * @version 1.0.0 @@ -37,14 +40,14 @@ public class TagConfig implements Serializable { private String join = "="; /** - * 提取入参开关 + * 提取策略 */ - private Boolean extractReq = true; + private long extract = EXTRACT_ALL; /** - * 提取普通log开关 + * 压缩策略 */ - private Boolean extractLog = true; + private long compress = COMPRESS_ALL; public List getReqTags() { @@ -87,20 +90,20 @@ public class TagConfig implements Serializable { this.join = join; } - public Boolean getExtractReq() { - return extractReq; + public long getExtract() { + return extract; } - public void setExtractReq(Boolean extractReq) { - this.extractReq = extractReq; + public void setExtract(long extract) { + this.extract = extract; } - public Boolean getExtractLog() { - return extractLog; + public long getCompress() { + return compress; } - public void setExtractLog(Boolean extractLog) { - this.extractLog = extractLog; + public void setCompress(long compress) { + this.compress = compress; } public static final class Builder { @@ -109,8 +112,8 @@ public class TagConfig implements Serializable { private String regex; private String delimiter; private String join; - private Boolean extractReq; - private Boolean extractLog; + private long extract; + private long compress; public Builder() { } @@ -144,13 +147,13 @@ public class TagConfig implements Serializable { return this; } - public Builder extractReq(Boolean extractReq) { - this.extractReq = extractReq; + public Builder extract(long extract) { + this.extract = extract; return this; } - public Builder extractLog(Boolean extractLog) { - this.extractLog = extractLog; + public Builder compress(long compress) { + this.compress = compress; return this; } @@ -161,8 +164,8 @@ public class TagConfig implements Serializable { tagConfig.setRegex(regex); tagConfig.setDelimiter(delimiter); tagConfig.setJoin(join); - tagConfig.setExtractReq(extractReq); - tagConfig.setExtractLog(extractLog); + tagConfig.setExtract(extract); + tagConfig.setCompress(compress); return tagConfig; } } @@ -175,8 +178,8 @@ public class TagConfig implements Serializable { ", regex='" + regex + '\'' + ", delimiter='" + delimiter + '\'' + ", join='" + join + '\'' + - ", extractReq='" + extractReq + '\'' + - ", extractLog='" + extractLog + '\'' + + ", extract='" + extract + '\'' + + ", compress='" + compress + '\'' + '}'; } } diff --git a/common/src/main/java/com/jd/platform/jlog/common/tag/TagHandler.java b/common/src/main/java/com/jd/platform/jlog/common/tag/TagHandler.java index f037e63..831a7bf 100644 --- a/common/src/main/java/com/jd/platform/jlog/common/tag/TagHandler.java +++ b/common/src/main/java/com/jd/platform/jlog/common/tag/TagHandler.java @@ -12,8 +12,12 @@ import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; +import static com.jd.platform.jlog.common.constant.Constant.EXTRACT_MIN_LEN; import static com.jd.platform.jlog.common.constant.Constant.TAG_NORMAL_KEY; import static com.jd.platform.jlog.common.constant.Constant.TAG_NORMAL_KEY_MAX_LEN; +import static com.jd.platform.jlog.common.tag.CollectMode.*; +import static com.jd.platform.jlog.common.tag.CollectMode.E_LOG; +import static com.jd.platform.jlog.common.tag.CollectMode.E_REQ; import static com.jd.platform.jlog.common.utils.ConfigUtil.RANDOM; /** @@ -28,12 +32,8 @@ public class TagHandler { private Set reqTags; - private boolean extractReq; - private Set logTags; - private boolean extractLog; - private String delimiter = "|"; private int delimiterLen = delimiter.length(); @@ -42,22 +42,25 @@ public class TagHandler { private Pattern pattern; + private long extract; + + private long compress; + private static volatile TagHandler INSTANCE = null; /** * 构建标签处理器 * @param tagConfig 配置类 */ - public static void build(TagConfig tagConfig) { + public static void buildHandler(TagConfig tagConfig) { - if(!tagConfig.getExtractReq() && !tagConfig.getExtractLog()){ + if(tagConfig.getExtract() == SUSPEND && tagConfig.getCompress() == SUSPEND ){ return; } TagHandler handler = new TagHandler(); - - handler.extractReq = tagConfig.getExtractReq(); - handler.extractLog = tagConfig.getExtractLog(); + handler.extract = tagConfig.getExtract(); + handler.compress = tagConfig.getCompress(); handler.reqTags = new HashSet<>(tagConfig.getReqTags()); handler.logTags = new HashSet<>(tagConfig.getLogTags()); @@ -85,7 +88,9 @@ public class TagHandler { */ public static Map extractReqTag(Map params, @NotNull Map ext) { - if(INSTANCE == null || !INSTANCE.extractReq){ return null; } + if(INSTANCE == null || !isMatched(INSTANCE.extract, E_REQ)){ return null; } + + System.out.println("### INSTANCE.reqTags:"+JSON.toJSONString(INSTANCE.reqTags)); Map requestMap = new HashMap<>(INSTANCE.reqTags.size()); for (String tag : INSTANCE.reqTags) { @@ -99,7 +104,7 @@ public class TagHandler { requestMap.put(tag, params.get(tag)[0]); } } - + System.out.println("提取到了请求入参日志标签:"+JSON.toJSONString(requestMap)); return requestMap; } @@ -110,7 +115,7 @@ public class TagHandler { * @return tags */ public static Map extractLogTag(String content) { - if(INSTANCE == null || !INSTANCE.extractLog || content.length() < 1){ + if(INSTANCE == null || !isMatched(INSTANCE.extract, E_LOG) || content.length() < EXTRACT_MIN_LEN){ return null; } @@ -131,6 +136,7 @@ public class TagHandler { } } } + System.out.println("提取到了请求log日志标签:"+JSON.toJSONString(tagMap)); return tagMap; } @@ -142,7 +148,7 @@ public class TagHandler { */ public synchronized static void refresh(TagConfig tagConfig) { INSTANCE = null; - build(tagConfig); + buildHandler(tagConfig); } @@ -154,6 +160,9 @@ public class TagHandler { ", delimiter='" + delimiter + '\'' + ", delimiterLen=" + delimiterLen + ", join='" + join + '\'' + + ", pattern=" + pattern + + ", extract=" + extract + + ", compress=" + compress + '}'; } diff --git a/common/src/main/java/com/jd/platform/jlog/common/utils/CollectionUtil.java b/common/src/main/java/com/jd/platform/jlog/common/utils/CollectionUtil.java index 5890083..87af2f6 100644 --- a/common/src/main/java/com/jd/platform/jlog/common/utils/CollectionUtil.java +++ b/common/src/main/java/com/jd/platform/jlog/common/utils/CollectionUtil.java @@ -133,13 +133,87 @@ public class CollectionUtil { public static void main(String[] args) { - HashMap m1 = new HashMap<>(); - m1.put("t1",1); - m1.put("t2",2); + int fail = 0; + int count = 10000; + Set set = new HashSet<>(); + for (int i = 0; i < count; i++) { + int h = randomMac4Qemu().hashCode(); + int val = indexFor(h); + boolean r = set.add(val); + // System.out.println(val); + if(!r){ + fail++; + } + } - HashMap m2 = new HashMap<>(); - m2.put("t2",2); - m2.put("t3",3); + int fail2 = 0; + Set set2 = new HashSet<>(); + for (int i = 0; i < count; i++) { + int h = randomMac4Qemu().hashCode(); + Random rd = new Random(h); + int val = rd.nextInt(16385); + boolean r = set.add(val); + System.out.println(val); + if(!r){ + fail2++; + } + } + + System.out.println("11--》 "+fail); + System.out.println("22-》 "+ fail2); + } + static int indexFor(int h) { + return h & (16384-1); + } + public static String randomMac4Qemu() { + /* if(1==1){ + return getRandomIp(); + }*/ + Random random = new Random(); + String[] mac = { + /* String.format("%02x", 0x52), + String.format("%02x", 0x54), + String.format("%02x", 0x00),*/ + String.format("%02x", random.nextInt(0xff)), + String.format("%02x", random.nextInt(0xff)), + String.format("%02x", random.nextInt(0xff)) + }; + return String.join(":", mac); + } + + + public static String getRandomIp(){ + + //ip范围 + int[][] range = {{607649792,608174079},//36.56.0.0-36.63.255.255 + {1038614528,1039007743},//61.232.0.0-61.237.255.255 + {1783627776,1784676351},//106.80.0.0-106.95.255.255 + {2035023872,2035154943},//121.76.0.0-121.77.255.255 + {2078801920,2079064063},//123.232.0.0-123.235.255.255 + {-1950089216,-1948778497},//139.196.0.0-139.215.255.255 + {-1425539072,-1425014785},//171.8.0.0-171.15.255.255 + {-1236271104,-1235419137},//182.80.0.0-182.92.255.255 + {-770113536,-768606209},//210.25.0.0-210.47.255.255 + {-569376768,-564133889}, //222.16.0.0-222.95.255.255 + }; + + Random rdint = new Random(); + int index = rdint.nextInt(10); + return num2ip(range[index][0]+new Random().nextInt(range[index][1]-range[index][0])); + } + + + public static String num2ip(int ip) { + int [] b=new int[4] ; + String x = ""; + + b[0] = (int)((ip >> 24) & 0xff); + b[1] = (int)((ip >> 16) & 0xff); + b[2] = (int)((ip >> 8) & 0xff); + b[3] = (int)(ip & 0xff); + x=Integer.toString(b[0])+"."+Integer.toString(b[1])+"."+Integer.toString(b[2])+"."+Integer.toString(b[3]); + + return x; } } diff --git a/common/src/main/java/com/jd/platform/jlog/common/utils/ConfigUtil.java b/common/src/main/java/com/jd/platform/jlog/common/utils/ConfigUtil.java index e74de5e..4e27fb8 100644 --- a/common/src/main/java/com/jd/platform/jlog/common/utils/ConfigUtil.java +++ b/common/src/main/java/com/jd/platform/jlog/common/utils/ConfigUtil.java @@ -2,8 +2,12 @@ package com.jd.platform.jlog.common.utils; import com.jd.platform.jlog.common.constant.Constant; -import java.util.Enumeration; -import java.util.Properties; +import java.beans.IntrospectionException; +import java.beans.PropertyDescriptor; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.*; import java.util.concurrent.ThreadLocalRandom; /** @@ -18,13 +22,14 @@ public class ConfigUtil { private static final String SERVER_SUFFIX = "Server"; - public static final ThreadLocalRandom RANDOM = ThreadLocalRandom.current(); + public static final char MID_LINE = '-'; + public static final ThreadLocalRandom RANDOM = ThreadLocalRandom.current(); public static String escapeExprSpecialWord(String str) { - if(str != null && str.length() > 0){ + if (str != null && str.length() > 0) { for (String s : Constant.SPECIAL_CHAR) { if (str.contains(s)) { str = str.replace(s, "\\" + s); @@ -35,7 +40,6 @@ public class ConfigUtil { } - public static String formatConfigStr(Properties properties) { StringBuilder sb = new StringBuilder(); @@ -43,7 +47,7 @@ public class ConfigUtil { while (enumeration.hasMoreElements()) { String key = (String) enumeration.nextElement(); Object property = properties.get(key); - if(property != null){ + if (property != null) { property = String.valueOf(property); } sb.append(key).append("=").append(property).append("\n"); @@ -52,12 +56,41 @@ public class ConfigUtil { } - public static byte[] formatConfigByte(Properties properties) { return formatConfigStr(properties).getBytes(); } + //递归解析map对象 + public static void loadRecursion(Map map, String key, Properties props) { + map.forEach((k, v) -> { + System.out.println("k => " + k + " v.class => " + v.getClass() + " val => " + v.toString() + " 是不是爸爸 => " + isParent(v)); + if (isParent(v)) { + if (v instanceof Boolean || v instanceof List) { + props.put(key + "." + k, v); + } else { + Map nextValue = (Map) v; + loadRecursion(nextValue, (("".equals(key) ? "" : key + ".") + k), props); + } + } else { + props.put(key + "." + k, v); + } + }); + } + + //判断是否还有子节点 + public static boolean isParent(Object o) { + if (!(o instanceof String || o instanceof Character || o instanceof Byte)) { + try { + Number n = (Number) o; + // System.out.println("isParent ==> "+n); + } catch (Exception e) { + return true; + } + } + return false; + } + /* public static ConfigCenterEnum getCenter(CenterConfig config) throws Exception { @@ -86,4 +119,31 @@ public class ConfigUtil { items[0] = (byte) ((char) items[0] - 'a' + 'A'); return new String(items); } + + + + + public static String camelToMidline(String param) { + if (param == null || "".equals(param.trim())) { + return ""; + } + int len = param.length(); + StringBuilder sb = new StringBuilder(len); + for (int i = 0; i < len; i++) { + char c = param.charAt(i); + if (Character.isUpperCase(c)) { + sb.append("-"); + sb.append(Character.toLowerCase(c)); + } else { + sb.append(c); + } + } + return sb.toString(); + } + + public static String lowerFirst(String fromStr){ + char[] chars = fromStr.toCharArray(); + chars[0] += 32; + return String.valueOf(chars); + } } diff --git a/config/config-apollo/src/main/java/com/jd/platform/jlog/config/apollo/ApolloConfigurator.java b/config/config-apollo/src/main/java/com/jd/platform/jlog/config/apollo/ApolloConfigurator.java index 803bd32..f0e6432 100644 --- a/config/config-apollo/src/main/java/com/jd/platform/jlog/config/apollo/ApolloConfigurator.java +++ b/config/config-apollo/src/main/java/com/jd/platform/jlog/config/apollo/ApolloConfigurator.java @@ -77,6 +77,26 @@ public class ApolloConfigurator implements Configurator { return instance; } + @Override + public String getString(String key) { + return null; + } + + @Override + public Long getLong(String key) { + return null; + } + + @Override + public List getList(String key) { + return null; + } + + @Override + public T getObject(String key, Class clz) { + return null; + } + @Override public String getConfig(String key) { return config.getProperty(key,""); diff --git a/config/config-core/src/main/java/com/jd/platform/jlog/core/Configurator.java b/config/config-core/src/main/java/com/jd/platform/jlog/core/Configurator.java index 36df609..4ae742d 100644 --- a/config/config-core/src/main/java/com/jd/platform/jlog/core/Configurator.java +++ b/config/config-core/src/main/java/com/jd/platform/jlog/core/Configurator.java @@ -1,7 +1,6 @@ package com.jd.platform.jlog.core; import java.util.List; -import java.util.Map; /** * @author tangbohu @@ -13,19 +12,34 @@ import java.util.Map; public interface Configurator { /** - * 获取配置 + * 获取string配置 * @param key key * @return val */ - String getConfig(String key); + String getString(String key); + /** - * 获取配置 + * 获取LONG配置 * @param key key - * @param timeoutMills timeoutMills * @return val */ - String getConfig(String key, long timeoutMills); + Long getLong(String key); + + /** + * 获取LIST类型配置 + * @param key key + * @return val + */ + List getList(String key); + + /** + * 获取实体类型配置 + * @param key key + * @return val + */ + T getObject(String key, Class clz); + /** * 设置配置 diff --git a/config/config-core/src/main/java/com/jd/platform/jlog/core/ConfiguratorFactory.java b/config/config-core/src/main/java/com/jd/platform/jlog/core/ConfiguratorFactory.java index 92e7795..c87087f 100644 --- a/config/config-core/src/main/java/com/jd/platform/jlog/core/ConfiguratorFactory.java +++ b/config/config-core/src/main/java/com/jd/platform/jlog/core/ConfiguratorFactory.java @@ -32,8 +32,8 @@ public class ConfiguratorFactory { synchronized (Configurator.class) { if (instance == null) { instance = buildConfiguration(); - LOGGER.info("构建总配置器单例完成 instance 获取reqTags结果:{}", instance.getConfig("reqTags")); - LOGGER.info("构建总配置器单例完成 Base 获取serverAddr结果:{}", base.getConfig("serverAddr")); + LOGGER.info("构建总配置器单例完成 instance 获取类型结果:{}", instance.getType()); + LOGGER.info("构建总配置器单例完成 Base 获取serverAddr结果:{}", base.getString("serverAddr")); } } } @@ -69,4 +69,19 @@ public class ConfiguratorFactory { return base; } + + + private static Configurator refreshBaseConfiguration() { + + synchronized (Configurator.class){ + try { + base = new FileConfigurator(); + } catch (IOException e) { + LOGGER.info("文件配置器构建失败", e); + throw new RuntimeException("build file buildConfiguration fail", e); + } + } + return base; + } + } diff --git a/config/config-core/src/main/java/com/jd/platform/jlog/core/Constant.java b/config/config-core/src/main/java/com/jd/platform/jlog/core/Constant.java index f40ea23..fb05839 100644 --- a/config/config-core/src/main/java/com/jd/platform/jlog/core/Constant.java +++ b/config/config-core/src/main/java/com/jd/platform/jlog/core/Constant.java @@ -15,7 +15,7 @@ public class Constant { /** * 监听重读配置文件间隔 单位ms */ - static final long LISTENER_CONFIG_INTERVAL = 10000; + static final long LISTENER_CONFIG_INTERVAL = 3000; static final String CONFIG_FILE_PROPERTIES = "/application.properties"; @@ -34,7 +34,7 @@ public class Constant { public static final String SERVER_ADDR_KEY = "serverAddr"; - + public static final String NAMESPACE_KEY = "namespace"; /** * 配置文件集合 diff --git a/config/config-core/src/main/java/com/jd/platform/jlog/core/FileConfigurator.java b/config/config-core/src/main/java/com/jd/platform/jlog/core/FileConfigurator.java index 20730b1..26450e5 100644 --- a/config/config-core/src/main/java/com/jd/platform/jlog/core/FileConfigurator.java +++ b/config/config-core/src/main/java/com/jd/platform/jlog/core/FileConfigurator.java @@ -28,7 +28,7 @@ public class FileConfigurator implements Configurator { private static final Logger LOGGER = LoggerFactory.getLogger(FileConfigurator.class); - private static Properties PROPERTIES = new Properties(); + private static JcProperties PROPERTIES = new JcProperties(); private static volatile FileListener FILELISTENER = null; @@ -44,18 +44,19 @@ public class FileConfigurator implements Configurator { for (String file : CONFIG_FILES) { String fileName = StringUtil.isEmpty(env) ? file : file + "_" + env; URL url = this.getClass().getResource(file); - if(url != null){ - try (InputStream is = url.openStream()) { - Properties props = new Properties(); - if (fileName.contains(YML)) { - props.putAll(new Yaml().loadAs(is, Map.class)); - } else { - props.load(is); - } - FILE_MODIFY_MAP.put(fileName, new FileWrapper(new File(url.getFile()).lastModified(), props)); - PROPERTIES.putAll(props); - LOGGER.info("{}配置文件配置:{}", file, props.toString()); + if(url == null){ + continue; + } + try (InputStream is = url.openStream()) { + JcProperties props = new JcProperties(); + if (fileName.contains(YML)) { + props.putAll(new Yaml().loadAs(is, Map.class)); + } else { + props.load(is); } + FILE_MODIFY_MAP.put(fileName, new FileWrapper(new File(url.getFile()).lastModified(), props)); + PROPERTIES.putAll(props); + LOGGER.info("{}配置文件配置:{}", file, props.toString()); } } LOGGER.info("合并后的配置:{}",PROPERTIES.toString()); @@ -63,20 +64,24 @@ public class FileConfigurator implements Configurator { @Override - public String getConfig(String key) { - Object val = PROPERTIES.get(key); - if(val != null){ - return String.valueOf(val); - } - return null; + public String getString(String key) { + return PROPERTIES.getString(key); } - @Override - public String getConfig(String key, long timeoutMills) { - return PROPERTIES.getProperty(key); + public Long getLong(String key) { + return PROPERTIES.getLong(key); } + @Override + public List getList(String key) { + return PROPERTIES.getStrList(key); + } + + @Override + public T getObject(String key, Class clz) { + return PROPERTIES.getBean(key, clz); + } @Override public boolean putConfig(String key, String content) { return false; } @@ -106,7 +111,6 @@ public class FileConfigurator implements Configurator { return; } String env = System.getenv(ENV); - for (String file : CONFIG_FILES) { file = StringUtil.isEmpty(env) ? file : file + "_" + env; if(node.equals(file)){ @@ -171,7 +175,8 @@ public class FileConfigurator implements Configurator { TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>(), new DefaultThreadFactory("fileListener", 1)); - FileListener() { } + FileListener() { + } synchronized void addListener() { FILELISTENER.onProcessEvent(new ConfigChangeEvent()); @@ -202,28 +207,30 @@ public class FileConfigurator implements Configurator { * 检测文件最后修改时间 和重载文件 */ private void checkAndConfigure(){ + AtomicBoolean change = new AtomicBoolean(false); Map newModifyMap = checkAndReload(); + FILE_MODIFY_MAP.forEach((k, v)->{ FileWrapper newFile = newModifyMap.get(k); if(newFile != null && newFile.change){ - Set diffKeys = CollectionUtil.diffKeys(newFile.props, v.props); if(!diffKeys.isEmpty()){ change.set(true); - v.props = newFile.props; - for (String diffKey : diffKeys) { - LOGGER.warn("文件 {} 配置变更 key={}变更事件:{}", k, diffKey, new ConfigChangeEvent(diffKey, v.props.get(diffKey).toString(), newFile.props.get(diffKey).toString())); + LOGGER.warn("文件 {} 配置变更 key={}变更事件:{}", k, diffKey, new ConfigChangeEvent(diffKey, String.valueOf(v.props.get(diffKey)), String.valueOf(newFile.props.get(diffKey)))); } + v.props = newFile.props; + v.lastModify= newFile.lastModify; } } }); if(change.get()){ - LOGGER.info("变更之前的总配置:{}", JSON.toJSONString(PROPERTIES)); + // LOGGER.info("变更之前的总配置:{}", JSON.toJSONString(PROPERTIES)); PROPERTIES.clear(); FILE_MODIFY_MAP.forEach((k,v)-> PROPERTIES.putAll(v.props)); LOGGER.info("变更之后的总配置:{}", JSON.toJSONString(PROPERTIES)); + TagHandlerBuilder.refresh(); } } @@ -234,8 +241,10 @@ public class FileConfigurator implements Configurator { private Map checkAndReload() { Map fileWrapperMap = new ConcurrentHashMap<>(3); + for (String fileName : LISTENED_FILES) { URL url = this.getClass().getResource(fileName); + if(url == null){ continue; } @@ -246,7 +255,7 @@ public class FileConfigurator implements Configurator { if(curLastMod <= cacheLastMod){ continue; } - Properties props = new Properties(); + JcProperties props = new JcProperties(); try (InputStream is = url.openStream()) { if (fileName.contains(YML)) { props.putAll(new Yaml().loadAs(is, Map.class)); @@ -269,14 +278,14 @@ public class FileConfigurator implements Configurator { private boolean change; - private Properties props; + private JcProperties props; - FileWrapper(long lastModify, Properties props) { + FileWrapper(long lastModify, JcProperties props) { this.lastModify = lastModify; this.change = false; this.props = props; } - FileWrapper(long lastModify, boolean change, Properties props) { + FileWrapper(long lastModify, boolean change, JcProperties props) { this.lastModify = lastModify; this.change = change; this.props = props; diff --git a/config/config-core/src/main/java/com/jd/platform/jlog/core/FileNode.java b/config/config-core/src/main/java/com/jd/platform/jlog/core/FileNode.java new file mode 100644 index 0000000..49634af --- /dev/null +++ b/config/config-core/src/main/java/com/jd/platform/jlog/core/FileNode.java @@ -0,0 +1,30 @@ +package com.jd.platform.jlog.core; + +import com.alibaba.fastjson.JSON; + +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * @author tangbohu + * @version 1.0.0 + * @ClassName FileNode.java + * @Description TODO + * @createTime 2022年03月08日 16:32:00 + */ +public final class FileNode { + + private String fillPath; + + private long lastModity; + + public static void main(String[] args) throws IOException { + JcProperties properties = new JcProperties(); + String path = "/Users/didi/Desktop/jlog/example/target/classes/application.properties"; + properties.load(new FileInputStream(path)); + System.out.println(JSON.toJSONString(properties)); + Server bean = properties.getBean("server", Server.class); + System.out.println(JSON.toJSONString(bean)); + } +} diff --git a/config/config-core/src/main/java/com/jd/platform/jlog/core/JcProperties.java b/config/config-core/src/main/java/com/jd/platform/jlog/core/JcProperties.java new file mode 100644 index 0000000..8bd02bd --- /dev/null +++ b/config/config-core/src/main/java/com/jd/platform/jlog/core/JcProperties.java @@ -0,0 +1,139 @@ +package com.jd.platform.jlog.core; + +import com.alibaba.fastjson.JSON; +import com.jd.platform.jlog.common.utils.ConfigUtil; +import com.jd.platform.jlog.common.utils.FastJsonUtils; +import com.jd.platform.jlog.common.utils.StringUtil; + +import java.beans.IntrospectionException; +import java.beans.PropertyDescriptor; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.lang.reflect.Type; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.*; + +import static com.jd.platform.jlog.common.utils.ConfigUtil.lowerFirst; + +/** + * @author tangbohu + * @version 1.0.0 + * @ClassName JcProperties.java + * @Description TODO + * @createTime 2022年03月07日 12:43:00 + */ +public class JcProperties extends Properties { + + public JcProperties() { + } + + public String getString(String key) { + Object val = super.get(key); + if(val == null){ + return null; + } + return String.valueOf(super.get(key)); + } + + public Long getLong(String key) { + String val = getString(key); + if(StringUtil.isEmpty(val)){ + return null; + } + return Long.valueOf(val); + } + + public List getStrList(String key) { + String val = getString(key); + if(StringUtil.isEmpty(val)){ + return null; + } + return FastJsonUtils.toList(val, String.class); + } + + public T getBean(String key, Class clz) { + T bean = FastJsonUtils.toBean(JSON.toJSONString(get(key)), clz); + if(bean != null){ + return bean; + } + try { + T instance = clz.newInstance(); + invoke(instance, this, ""); + return instance; + }catch (Exception e){ + e.printStackTrace(); + } + + return null; + } + + + private void invoke(Object model, JcProperties properties, String prefix) throws + IllegalAccessException, ClassNotFoundException, InstantiationException, ParseException { + + Class clz = model.getClass(); + Field[] fields = model.getClass().getDeclaredFields(); + for (Field field : fields) { + String type = field.getGenericType().toString(); + field.setAccessible(true); + + String curObjName = ConfigUtil.camelToMidline(lowerFirst(clz.getSimpleName())); + + prefix = StringUtil.isEmpty(prefix) ? curObjName : prefix; + String fillName = !curObjName.equals(prefix) ? prefix +"."+ curObjName + "." + field.getName() : curObjName + "." + field.getName(); + + + switch (type){ + case "class java.lang.String": + field.set(model, properties.getString(fillName)) ; + break; + case "byte": + field.setByte(model, Byte.valueOf(properties.getString(fillName))); + break; + case "short": + field.setShort(model, Short.valueOf(properties.getString(fillName))); + break; + case "int": + field.setInt(model, properties.getLong(fillName).intValue()) ; + break; + case "long": + field.setLong(model, properties.getLong(fillName)); + break; + case "double": + field.setDouble(model, Double.valueOf(properties.getString(fillName))); + break; + case "float": + field.setFloat(model, Float.valueOf(properties.getString(fillName))); + break; + case "boolean": + field.setBoolean(model, Boolean.parseBoolean(properties.getString(fillName))); + break; + case "class java.util.Date": + Date date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(properties.getString(fillName)); + field.set(model,date) ; + break; + default: + String tn = field.getType().getTypeName(); + if("java.util.List".equals(tn)){ + String val = properties.getString(fillName); + field.set(model,FastJsonUtils.toList(val, String.class)); + }else if("java.util.Map".equals(tn)){ + String val = properties.getString(fillName); + field.set(model,FastJsonUtils.toMap(val)); + }else if(field.getType().isArray()){ + String val = properties.getString(fillName); + field.set(model,FastJsonUtils.toArray(val)); + }else{ + String[] ar = type.split(" "); + Object tinyObj = Class.forName(ar[1]).newInstance(); + invoke(tinyObj, properties, prefix); + field.set(model,tinyObj); + } + } + } + + } + +} diff --git a/config/config-core/src/main/java/com/jd/platform/jlog/core/NodeBak.java b/config/config-core/src/main/java/com/jd/platform/jlog/core/NodeBak.java new file mode 100644 index 0000000..3a5d521 --- /dev/null +++ b/config/config-core/src/main/java/com/jd/platform/jlog/core/NodeBak.java @@ -0,0 +1,142 @@ +package com.jd.platform.jlog.core; + +import com.alibaba.fastjson.JSON; +import com.jd.platform.jlog.common.utils.StringUtil; +import org.yaml.snakeyaml.Yaml; + +import java.io.*; +import java.util.*; + +/** + * @author tangbohu + * @version 1.0.0 + * @ClassName Node.java 包装类 用于以后的支持key->node->[listener,properties] + * @createTime 2022年03月02日 20:37:00 + */ +public class NodeBak implements Serializable { + + + private String name; + + private ConfigChangeListener listener; + + private Properties properties; + + private String type; + + private Object val; + + + static Properties newPro = new Properties(); + + + public static void main(String[] args) throws IOException { + + String path = "/Users/didi/Desktop/jlog/example/target/classes/application.properties"; + // newPro.load(); + read(path); + + System.out.println(JSON.toJSONString(newPro)); + } + + protected static Map toMap(Properties properties) { + Map result = new HashMap<>(10); + Enumeration propertyNames = properties.propertyNames(); + while (propertyNames.hasMoreElements()) { + String name = (String) propertyNames.nextElement(); + String value = properties.getProperty(name); + result.put(name, value); + } + return result; + } + + + + + public static void read(String path) { + + FileReader fr = null; + LineNumberReader lnr = null; + String str; + + try { + fr = new FileReader(path); + lnr = new LineNumberReader(fr); + + Stack stack = new Stack<>(); + HashMap tinyMap = new LinkedHashMap<>(); + List tinyList = new ArrayList<>(); + String temKey = ""; + while ((str = lnr.readLine()) != null) { + if(StringUtil.isBlank(str) || !str.contains("=")){ + continue; + } + String[] lineArr = str.split("="); + String key = lineArr[0]; + String val = lineArr[1]; + + if(!key.contains(".")){ + newPro.put(key,val.trim()); + continue; + } + + String[] keyArr = key.split("\\."); + + String lastTinyKey = keyArr[keyArr.length - 1]; + if(lastTinyKey.contains("[") & lastTinyKey.contains("]")){ + String[] lastArr = lastTinyKey.split("\\["); + for (int i = 0; i < keyArr.length - 1; i++) { + stack.push(keyArr[i]); + } + stack.push(lastArr[0]); + + /* if(!temKey.equals(lastArr[0])){ + temKey = lastArr[0]; + String out = stack.pop(); + stack.push(temKey); + }*/ + //list + tinyList.add(val); + newPro.put(keyArr[0],tinyList); + }else{ + for (int i = 0; i < keyArr.length - 1; i++) { + if(stack.empty() || !stack.peek().equals(keyArr[i])){ + stack.push(keyArr[i]); + } + } + + /* if(!temKey.equals(lastTinyKey)){ + temKey = lastTinyKey; + String out = stack.pop(); + System.out.println("out==> "+ out +" temKey==> '"+temKey ); + stack.push(temKey); + }*/ + // map + tinyMap.put(keyArr[1],val.trim()); + newPro.put(keyArr[0],tinyMap); + } + System.out.println(" -- stack==> " + JSON.toJSONString(stack) ); + + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (fr != null) { + try { + fr.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (lnr != null) { + try { + lnr.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + } + } + +} diff --git a/config/config-core/src/main/java/com/jd/platform/jlog/core/ObjObj.java b/config/config-core/src/main/java/com/jd/platform/jlog/core/ObjObj.java new file mode 100644 index 0000000..346f6b9 --- /dev/null +++ b/config/config-core/src/main/java/com/jd/platform/jlog/core/ObjObj.java @@ -0,0 +1,45 @@ +package com.jd.platform.jlog.core; + +import java.util.List; +import java.util.Map; + +public class ObjObj{ + private int last; + private String max; + + private List ids; + + private Map ms; + + public int getLast() { + return last; + } + + public void setLast(int last) { + this.last = last; + } + + public String getMax() { + return max; + } + + public void setMax(String max) { + this.max = max; + } + + public List getIds() { + return ids; + } + + public void setIds(List ids) { + this.ids = ids; + } + + public Map getMs() { + return ms; + } + + public void setMs(Map ms) { + this.ms = ms; + } +} diff --git a/config/config-core/src/main/java/com/jd/platform/jlog/core/Server.java b/config/config-core/src/main/java/com/jd/platform/jlog/core/Server.java new file mode 100644 index 0000000..a958816 --- /dev/null +++ b/config/config-core/src/main/java/com/jd/platform/jlog/core/Server.java @@ -0,0 +1,32 @@ +package com.jd.platform.jlog.core; + +public class Server{ + private int port; + private String addr; + private ObjObj objObj; + + public int getPort() { + return port; + } + + public void setPort(int port) { + this.port = port; + } + + public String getAddr() { + return addr; + } + + public void setAddr(String addr) { + this.addr = addr; + } + + + public ObjObj getObjObj() { + return objObj; + } + + public void setObjObj(ObjObj objObj) { + this.objObj = objObj; + } +} \ No newline at end of file diff --git a/config/config-core/src/main/java/com/jd/platform/jlog/core/TagHandlerBuilder.java b/config/config-core/src/main/java/com/jd/platform/jlog/core/TagHandlerBuilder.java new file mode 100644 index 0000000..c8489f4 --- /dev/null +++ b/config/config-core/src/main/java/com/jd/platform/jlog/core/TagHandlerBuilder.java @@ -0,0 +1,39 @@ +package com.jd.platform.jlog.core; + +import com.jd.platform.jlog.common.tag.TagConfig; +import com.jd.platform.jlog.common.tag.TagHandler; + +/** + * @author tangbohu + * @version 1.0.0 + * @ClassName TagHandlerBuilder.java + * @Description TODO + * @createTime 2022年03月05日 22:07:00 + */ +public class TagHandlerBuilder { + + + + public static void buildTagHandler(TagConfig tagConfig, Configurator configurator){ + if(tagConfig == null){ + tagConfig = buildTagConfigByConfigurator(configurator); + } + TagHandler.buildHandler(tagConfig); + } + + + public static void refresh(){ + Configurator configurator = ConfiguratorFactory.getInstance(); + if(configurator == null){ + throw new RuntimeException("configurator is null"); + } + TagHandler.refresh(buildTagConfigByConfigurator(configurator)); + } + + + + + private static TagConfig buildTagConfigByConfigurator(Configurator configurator){ + return configurator.getObject("tag-config", TagConfig.class); + } +} diff --git a/config/config-etcd/src/main/java/com/jd/platform/jlog/etcd/EtcdConfigurator.java b/config/config-etcd/src/main/java/com/jd/platform/jlog/etcd/EtcdConfigurator.java index cc2a5c1..060fe06 100644 --- a/config/config-etcd/src/main/java/com/jd/platform/jlog/etcd/EtcdConfigurator.java +++ b/config/config-etcd/src/main/java/com/jd/platform/jlog/etcd/EtcdConfigurator.java @@ -1,6 +1,8 @@ package com.jd.platform.jlog.etcd; +import java.io.IOException; +import java.io.StringReader; import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; @@ -39,7 +41,7 @@ public class EtcdConfigurator implements Configurator { private static final Configurator FILE_CONFIG = ConfiguratorFactory.base; - private static final String PROPERTIES_PATH = "/jLog/properties"; + private static final String PROPERTIES_PATH = "/jLog/jLog.properties"; private static Properties PROPERTIES = new Properties(); @@ -56,7 +58,11 @@ public class EtcdConfigurator implements Configurator { } String val = keyValues.get(0).getValue().toStringUtf8(); if(StringUtil.isNotBlank(val)){ - PROPERTIES.putAll((Map)JSON.parse(val)); + try { + PROPERTIES.load(new StringReader(val)); + } catch (IOException e) { + e.printStackTrace(); + } } } @@ -73,6 +79,26 @@ public class EtcdConfigurator implements Configurator { } + @Override + public String getString(String key) { + return null; + } + + @Override + public Long getLong(String key) { + return null; + } + + @Override + public List getList(String key) { + return null; + } + + @Override + public T getObject(String key, Class clz) { + return null; + } + @Override public String getConfig(String key) { Object val = PROPERTIES.get(key); diff --git a/config/config-etcd/src/main/java/com/jd/platform/jlog/etcd/EtcdListener.java b/config/config-etcd/src/main/java/com/jd/platform/jlog/etcd/EtcdListener.java index 6524c83..53bf0e9 100644 --- a/config/config-etcd/src/main/java/com/jd/platform/jlog/etcd/EtcdListener.java +++ b/config/config-etcd/src/main/java/com/jd/platform/jlog/etcd/EtcdListener.java @@ -5,6 +5,7 @@ import com.ibm.etcd.api.Event; import com.ibm.etcd.api.KeyValue; import com.ibm.etcd.client.EtcdClient; import com.ibm.etcd.client.kv.KvClient; +import com.ibm.etcd.client.kv.WatchUpdate; import com.jd.platform.jlog.core.ConfigChangeEvent; import com.jd.platform.jlog.core.ConfigChangeListener; import com.jd.platform.jlog.core.ConfigChangeType; @@ -30,19 +31,24 @@ public class EtcdListener implements ConfigChangeListener { public EtcdListener(String node) { - iterator = EtcdConfigurator.client.getKvClient().watch(ByteString.copyFromUtf8(node)).start(); - System.out.println("构造器EtcdListener"); + iterator = EtcdConfigurator.client.getKvClient().watch(ByteString.copyFromUtf8(node)).asPrefix().start(); + System.out.println("构造器EtcdListener"+node); getExecutorService().submit(() -> { while (iterator.hasNext()){ - Event eve = iterator.next().getEvents().get(0); - KeyValue kv = eve.getKv(); - Event.EventType eveType = eve.getType(); - ConfigChangeType changeType = eveType.equals(Event.EventType.DELETE) ? ConfigChangeType.MODIFY : ConfigChangeType.DELETE; + try { + WatchUpdate update = iterator.next(); + Event eve = update.getEvents().get(0); + KeyValue kv = eve.getKv(); + Event.EventType eveType = eve.getType(); + ConfigChangeType changeType = eveType.equals(Event.EventType.DELETE) ? ConfigChangeType.MODIFY : ConfigChangeType.DELETE; + ConfigChangeEvent event = new ConfigChangeEvent(); + event.setKey(node).setNewValue(kv.getValue().toStringUtf8()).setChangeType(changeType); + onChangeEvent(event); + }catch (RuntimeException e){ + e.printStackTrace(); + } - ConfigChangeEvent event = new ConfigChangeEvent(); - event.setKey(node).setNewValue(kv.getValue().toStringUtf8()).setChangeType(changeType); - onChangeEvent(event); } }); } diff --git a/config/config-nacos/src/main/java/com/jd/platform/jlog/nacos/NacosConfigurator.java b/config/config-nacos/src/main/java/com/jd/platform/jlog/nacos/NacosConfigurator.java index 678d071..88212aa 100644 --- a/config/config-nacos/src/main/java/com/jd/platform/jlog/nacos/NacosConfigurator.java +++ b/config/config-nacos/src/main/java/com/jd/platform/jlog/nacos/NacosConfigurator.java @@ -20,7 +20,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import static com.jd.platform.jlog.common.utils.ConfigUtil.formatConfigStr; -import static com.jd.platform.jlog.core.Constant.DEFAULT_TIMEOUT; +import static com.jd.platform.jlog.core.Constant.*; import static com.jd.platform.jlog.nacos.NacosConstant.*; @@ -78,6 +78,26 @@ public class NacosConfigurator implements Configurator { } + @Override + public String getString(String key) { + return null; + } + + @Override + public Long getLong(String key) { + return null; + } + + @Override + public List getList(String key) { + return null; + } + + @Override + public T getObject(String key, Class clz) { + return null; + } + @Override public String getConfig(String key) { return getConfig(key, DEFAULT_TIMEOUT); @@ -198,9 +218,18 @@ public class NacosConfigurator implements Configurator { private static Properties getConfigProperties() { Properties properties = new Properties(); - String address = FILE_CONFIG.getConfig(PRO_SERVER_ADDR_KEY); + String address = FILE_CONFIG.getConfig(SERVER_ADDR_KEY); if (address != null) { - properties.setProperty(PRO_SERVER_ADDR_KEY, address); + properties.setProperty(SERVER_ADDR_KEY, address); + } + + String namespace = FILE_CONFIG.getConfig(NAMESPACE_KEY); + if (namespace != null) { + properties.setProperty(NAMESPACE_KEY, namespace); + }else{ + if (System.getProperty(NAMESPACE_KEY) != null) { + properties.setProperty(NAMESPACE_KEY, System.getProperty(NAMESPACE_KEY)); + } } return properties; } diff --git a/config/config-nacos/src/main/java/com/jd/platform/jlog/nacos/NacosConstant.java b/config/config-nacos/src/main/java/com/jd/platform/jlog/nacos/NacosConstant.java index 326932c..513671f 100644 --- a/config/config-nacos/src/main/java/com/jd/platform/jlog/nacos/NacosConstant.java +++ b/config/config-nacos/src/main/java/com/jd/platform/jlog/nacos/NacosConstant.java @@ -12,5 +12,4 @@ public class NacosConstant { static final String JLOG_GROUP = "JLOG_GROUP"; static final String DEFAULT_DATA_ID = "jLog.properties"; - static final String PRO_SERVER_ADDR_KEY = "serverAddr"; } diff --git a/config/config-nacos/src/main/java/com/jd/platform/jlog/nacos/NacosTest.java b/config/config-nacos/src/main/java/com/jd/platform/jlog/nacos/NacosTest.java index 68e3218..a67bced 100644 --- a/config/config-nacos/src/main/java/com/jd/platform/jlog/nacos/NacosTest.java +++ b/config/config-nacos/src/main/java/com/jd/platform/jlog/nacos/NacosTest.java @@ -28,11 +28,11 @@ public class NacosTest { NamingService naming = NamingFactory.createNamingService(serverAddr); naming.registerInstance("nacos.test1", JLOG_GROUP,"172.22.216.105", 8888, "TEST1"); Thread.sleep(3000); - NacosListener server = new NacosListener(DEFAULT_DATA_ID); + NacosListener server = new NacosListener(); naming.subscribe("nacos.test1", JLOG_GROUP,server); String content = configService.getConfig(dataId, group, 2000L); System.out.println("content: "+content); - NacosListener nL = new NacosListener(DEFAULT_DATA_ID); + NacosListener nL = new NacosListener(); configService.addListener(dataId, group, nL); System.out.println("新增完成"); diff --git a/config/config-zk/src/main/java/com/jd/platform/jlog/zk/ZkConfigurator.java b/config/config-zk/src/main/java/com/jd/platform/jlog/zk/ZkConfigurator.java index bea239a..c1130bb 100644 --- a/config/config-zk/src/main/java/com/jd/platform/jlog/zk/ZkConfigurator.java +++ b/config/config-zk/src/main/java/com/jd/platform/jlog/zk/ZkConfigurator.java @@ -39,10 +39,9 @@ public class ZkConfigurator implements Configurator { public ZkConfigurator() throws Exception { - System.out.println("### SERVER_ADDR_KEY ===> "+FILE_CONFIG.getConfig(SERVER_ADDR_KEY)); if (zkClient == null) { synchronized (ZkConfigurator.class) { - zkClient = CuratorFrameworkFactory.builder().connectString(FILE_CONFIG.getConfig(SERVER_ADDR_KEY)) + zkClient = CuratorFrameworkFactory.builder().connectString(FILE_CONFIG.getString(SERVER_ADDR_KEY)) // 连接超时时间 .sessionTimeoutMs(6000) // 会话超时时间 @@ -65,30 +64,24 @@ public class ZkConfigurator implements Configurator { @Override - public String getConfig(String key) { - return getConfig(key, DEFAULT_TIMEOUT); + public String getString(String key) { + return getString(key); } - @Override - public String getConfig(String key, long timeoutMills) { - String value = PROPERTIES.getProperty(key); - if (value != null) { - return value; - } - - value = System.getProperty(key); - if (value != null) { - return value; - } - try { - loadZkData(); - } catch (Exception e) { - return null; - } - return PROPERTIES.getProperty(key); + public Long getLong(String key) { + return null; } + @Override + public List getList(String key) { + return null; + } + + @Override + public T getObject(String key, Class clz) { + return null; + } @Override @@ -140,8 +133,11 @@ public class ZkConfigurator implements Configurator { throw new RuntimeException("no support"); } LOGGER.info("ZK添加监听器, node:{}", node); - ZKLISTENER = new ZkListener(node); - ZKLISTENER.onProcessEvent(new ConfigChangeEvent()); + if(ZKLISTENER == null){ + synchronized (ZkConfigurator.class){ + ZKLISTENER = new ZkListener(node); + } + } } @@ -159,7 +155,7 @@ public class ZkConfigurator implements Configurator { @Override public List getConfigByPrefix(String prefix) { try { - String val = getConfig(prefix); + String val = getString(prefix); return FastJsonUtils.toList(val,String.class); } catch (Exception e) { e.printStackTrace(); diff --git a/config/config-zk/src/main/java/com/jd/platform/jlog/zk/ZkListener.java b/config/config-zk/src/main/java/com/jd/platform/jlog/zk/ZkListener.java index 388b666..9877341 100644 --- a/config/config-zk/src/main/java/com/jd/platform/jlog/zk/ZkListener.java +++ b/config/config-zk/src/main/java/com/jd/platform/jlog/zk/ZkListener.java @@ -32,7 +32,6 @@ public class ZkListener implements ConfigChangeListener { public ZkListener(String path) { this.path = path; cache = new NodeCache(zkClient, path); - LOGGER.info("构造ZkListener:{}",path); try { cache.start(true); } catch (Exception e) { @@ -43,9 +42,9 @@ public class ZkListener implements ConfigChangeListener { if(null!=cache.getCurrentData()){ value = new String(cache.getCurrentData().getData()); } + onChangeEvent(null); System.out.println("=####====== "+value); }); - System.out.println("=####= SIZE===== "+cache.getListenable().size()); } @@ -62,19 +61,23 @@ public class ZkListener implements ConfigChangeListener { @Override public void onChangeEvent(ConfigChangeEvent event) { - LOGGER.info("ZK数据变更-当前监听器关注的path:{}", path); - Properties propsTmp = new Properties(PROPERTIES); + LOGGER.info("ZK数据变更-当前监听器关注的path:{} PROPERTIES:{}", path, JSON.toJSONString(PROPERTIES)); + Properties props = new Properties(); + props.putAll(PROPERTIES); try { - LOGGER.info("ZK数据变更,旧Properties:{}", JSON.toJSONString(propsTmp)); + LOGGER.info("ZK数据变更,旧Properties:{}", JSON.toJSONString(props)); loadZkData(); LOGGER.info("ZK数据变更,新Properties:{}", JSON.toJSONString(PROPERTIES)); } catch (Exception e) { e.printStackTrace(); } - Set diffKeys = CollectionUtil.diffKeys(propsTmp, PROPERTIES); + Set diffKeys = CollectionUtil.diffKeys(props, PROPERTIES); if(!diffKeys.isEmpty()){ for (String diffKey : diffKeys) { - LOGGER.warn("ZK {} 配置变更 key={} 变更事件:{}", path, diffKey, new ConfigChangeEvent(diffKey, propsTmp.get(diffKey).toString(), PROPERTIES.get(diffKey).toString())); + LOGGER.warn("ZK {} 配置变更 key={} 变更事件:{}", path, diffKey, + new ConfigChangeEvent(diffKey, + String.valueOf(props.get(diffKey)), + String.valueOf(PROPERTIES.get(diffKey).toString()))); } } } diff --git a/config/config-zk/src/main/java/com/jd/platform/jlog/zk/ZkTest.java b/config/config-zk/src/main/java/com/jd/platform/jlog/zk/ZkTest.java index 15039e7..f66b9ec 100644 --- a/config/config-zk/src/main/java/com/jd/platform/jlog/zk/ZkTest.java +++ b/config/config-zk/src/main/java/com/jd/platform/jlog/zk/ZkTest.java @@ -3,13 +3,10 @@ package com.jd.platform.jlog.zk; import org.apache.curator.framework.CuratorFramework; import org.apache.curator.framework.CuratorFrameworkFactory; import org.apache.curator.framework.recipes.cache.NodeCache; -import org.apache.curator.framework.recipes.cache.NodeCacheListener; import org.apache.curator.retry.ExponentialBackoffRetry; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import static com.jd.platform.jlog.zk.ZkConstant.SERVER_ADDR_KEY; - /** * @author tangbohu * @version 1.0.0 diff --git a/clientdemo/pom.xml b/example/pom.xml similarity index 96% rename from clientdemo/pom.xml rename to example/pom.xml index 09a2c83..b177a8e 100644 --- a/clientdemo/pom.xml +++ b/example/pom.xml @@ -10,10 +10,10 @@ com.jd.platfrom.jlog - clientdemo + example 0.0.1-SNAPSHOT - clientdemo - Demo project for using JLog + example + example for using JLog 1.8 diff --git a/clientdemo/src/main/java/com/jd/platform/jlog/clientdemo/ClientDemoApplication.java b/example/src/main/java/com/jd/platform/jlog/clientdemo/ExampleApplication.java similarity index 79% rename from clientdemo/src/main/java/com/jd/platform/jlog/clientdemo/ClientDemoApplication.java rename to example/src/main/java/com/jd/platform/jlog/clientdemo/ExampleApplication.java index 8da0ed4..fec83ce 100644 --- a/clientdemo/src/main/java/com/jd/platform/jlog/clientdemo/ClientDemoApplication.java +++ b/example/src/main/java/com/jd/platform/jlog/clientdemo/ExampleApplication.java @@ -11,11 +11,11 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; * @date 2021-12-27 */ @SpringBootApplication -public class ClientDemoApplication { +public class ExampleApplication { public static void main(String[] args) { try { - SpringApplication.run(ClientDemoApplication.class, args); + SpringApplication.run(ExampleApplication.class, args); }catch (Exception e){ e.printStackTrace(); } diff --git a/clientdemo/src/main/java/com/jd/platform/jlog/clientdemo/appender/TracerLogbackAppender.java b/example/src/main/java/com/jd/platform/jlog/clientdemo/appender/TracerLogbackAppender.java similarity index 98% rename from clientdemo/src/main/java/com/jd/platform/jlog/clientdemo/appender/TracerLogbackAppender.java rename to example/src/main/java/com/jd/platform/jlog/clientdemo/appender/TracerLogbackAppender.java index 6db352c..a450351 100644 --- a/clientdemo/src/main/java/com/jd/platform/jlog/clientdemo/appender/TracerLogbackAppender.java +++ b/example/src/main/java/com/jd/platform/jlog/clientdemo/appender/TracerLogbackAppender.java @@ -30,9 +30,9 @@ public class TracerLogbackAppender extends AppenderBase { protected void append(ILoggingEvent iLoggingEvent) { try { long tracerId = TracerHolder.getTracerId(); - /* if (0L == tracerId) { + if (0L == tracerId) { return; - }*/ + } RunLogMessage logMessage = getLogMessage(iLoggingEvent); UdpSender.offerLogger(logMessage); } catch (Exception e) { @@ -62,7 +62,7 @@ public class TracerLogbackAppender extends AppenderBase { String formattedMessage = getMessage(loggingEvent); logMessage.setContent(formattedMessage); Map map = TagHandler.extractLogTag(formattedMessage); - + logMessage.setTagMap(map); return logMessage; } diff --git a/clientdemo/src/main/java/com/jd/platform/jlog/clientdemo/config/DemoConfig.java b/example/src/main/java/com/jd/platform/jlog/clientdemo/config/DemoConfig.java similarity index 100% rename from clientdemo/src/main/java/com/jd/platform/jlog/clientdemo/config/DemoConfig.java rename to example/src/main/java/com/jd/platform/jlog/clientdemo/config/DemoConfig.java diff --git a/clientdemo/src/main/java/com/jd/platform/jlog/clientdemo/web/TestController.java b/example/src/main/java/com/jd/platform/jlog/clientdemo/web/TestController.java similarity index 56% rename from clientdemo/src/main/java/com/jd/platform/jlog/clientdemo/web/TestController.java rename to example/src/main/java/com/jd/platform/jlog/clientdemo/web/TestController.java index 2fbd065..8533e0c 100644 --- a/clientdemo/src/main/java/com/jd/platform/jlog/clientdemo/web/TestController.java +++ b/example/src/main/java/com/jd/platform/jlog/clientdemo/web/TestController.java @@ -1,25 +1,38 @@ package com.jd.platform.jlog.clientdemo.web; +import com.jd.platform.jlog.clientdemo.config.DemoConfig; import com.jd.platform.jlog.common.model.TracerBean; +import com.jd.platform.jlog.common.tag.TagConfig; import com.jd.platform.jlog.core.Configurator; import com.jd.platform.jlog.core.ConfiguratorFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.http.MediaType; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.stereotype.Component; +import org.springframework.web.bind.annotation.*; /** * @author shenkaiwen5 * @version 1.0 * @date 2021-12-27 */ +@Component +//@ConfigurationProperties() @RestController public class TestController { + private TagConfig tagConfig ; + + public TagConfig getTagConfig() { + return tagConfig; + } + + public void setTagConfig(TagConfig tagConfig) { + this.tagConfig = tagConfig; + } + /** * do nothing * just as an adapter for this project common log helper @@ -39,7 +52,7 @@ public class TestController { e.printStackTrace(); } - String val = configurator.getConfig("/test"); + String val = configurator.getString("/test"); System.out.println("val ===> "+val); RequestLog.info("哈哈哈哈哈哈"); @@ -48,14 +61,16 @@ public class TestController { @RequestMapping("/log") public Object log() { - RequestLog.info("|tag3=val3||tag4=val4||这是随便的log|"); + RequestLog.info("|errno=val3||node=val4||这是随便的log|"); return 1; } @PostMapping(value = "/test", consumes = MediaType.APPLICATION_JSON_VALUE) - public Object test(@RequestBody TestReq req) { - + public Object test(@RequestParam Integer uid, @RequestParam Integer newKey,@RequestBody TestReq req) { + String config = ConfiguratorFactory.getInstance().getString("reqTags"); + // System.out.println("tagConfig ===> " + tagConfig.toString()); + RequestLog.info("|errno=val3||node=val4||这是随便的log|"); return 1; } diff --git a/clientdemo/src/main/java/com/jd/platform/jlog/clientdemo/web/TestReq.java b/example/src/main/java/com/jd/platform/jlog/clientdemo/web/TestReq.java similarity index 100% rename from clientdemo/src/main/java/com/jd/platform/jlog/clientdemo/web/TestReq.java rename to example/src/main/java/com/jd/platform/jlog/clientdemo/web/TestReq.java diff --git a/example/src/main/resources/application.properties b/example/src/main/resources/application.properties new file mode 100644 index 0000000..9c7c1c6 --- /dev/null +++ b/example/src/main/resources/application.properties @@ -0,0 +1,16 @@ +server.port=8085 + +tag-config.delimiter="|" + +tag-config.logConfig.limit=99 + +tag-config.logConfig.cfg[0]="AA" +tag-config.logConfig.cfg[1]="BB" +tag-config.logConfig.aa[0]="CC" +tag-config.logConfig.aa[1]="DD" + + +tag-config.reqTags[0]="AA" +tag-config.reqTags[1]="BB" +tag-config.logTags[0]="CC" +tag-config.logTags[1]="XSSX" diff --git a/clientdemo/src/main/resources/application.ymlbak b/example/src/main/resources/application.ymlbak similarity index 100% rename from clientdemo/src/main/resources/application.ymlbak rename to example/src/main/resources/application.ymlbak diff --git a/clientdemo/src/main/resources/application.yml b/example/src/main/resources/bakapplication.yml similarity index 73% rename from clientdemo/src/main/resources/application.yml rename to example/src/main/resources/bakapplication.yml index faa4d69..bce0acf 100644 --- a/clientdemo/src/main/resources/application.yml +++ b/example/src/main/resources/bakapplication.yml @@ -1,7 +1,9 @@ -testKey: 111 -serverAddr: 101.42.242.201:2181 +serverAddr: http://101.42.242.201:8848 server: port: 8085 + +test: true + workers: - 111 - 222 @@ -11,6 +13,7 @@ tag-config: reqTags: - uid - ip + - newK logTags: - errno - node diff --git a/example/src/main/resources/bakjLog.properties b/example/src/main/resources/bakjLog.properties new file mode 100644 index 0000000..4f16091 --- /dev/null +++ b/example/src/main/resources/bakjLog.properties @@ -0,0 +1,6 @@ +server.port=8085 +tag-config.reqTags[0]="AA" +tag-config.reqTags[1]="BB" +tag-config.logTags[0]="CC" +tag-config.logTags[1]="DD" +tag-config.delimiter="|" diff --git a/clientdemo/src/main/resources/logback-spring.xml b/example/src/main/resources/logback-spring.xml similarity index 100% rename from clientdemo/src/main/resources/logback-spring.xml rename to example/src/main/resources/logback-spring.xml diff --git a/clientdemo/src/test/java/com/jd/platform/jlog/test/Common.java b/example/src/test/java/com/jd/platform/jlog/test/Common.java similarity index 93% rename from clientdemo/src/test/java/com/jd/platform/jlog/test/Common.java rename to example/src/test/java/com/jd/platform/jlog/test/Common.java index 37242b1..3db0d8e 100644 --- a/clientdemo/src/test/java/com/jd/platform/jlog/test/Common.java +++ b/example/src/test/java/com/jd/platform/jlog/test/Common.java @@ -24,9 +24,9 @@ public class Common { public static void getTest(Configurator configurator){ LOGGER.info("配置器类型:{}", configurator.getType()); - String addr = configurator.getConfig("serverAddr"); + String addr = configurator.getString("serverAddr"); LOGGER.info("配置器get addr:{}", addr); - String reqTags = configurator.getConfig("reqTags"); + String reqTags = configurator.getString("reqTags"); LOGGER.info("配置器get reqTags:{}", reqTags); List workers = configurator.getConfigByPrefix("workers"); LOGGER.info("配置器get workers:{}", JSON.toJSONString(workers)); diff --git a/example/src/test/java/com/jd/platform/jlog/test/EtcdConfiguratorTest.java b/example/src/test/java/com/jd/platform/jlog/test/EtcdConfiguratorTest.java new file mode 100644 index 0000000..2945261 --- /dev/null +++ b/example/src/test/java/com/jd/platform/jlog/test/EtcdConfiguratorTest.java @@ -0,0 +1,91 @@ +package com.jd.platform.jlog.test; + +import com.alibaba.fastjson.JSON; +import com.jd.platform.jlog.clientdemo.ExampleApplication; +import com.jd.platform.jlog.core.Configurator; +import com.jd.platform.jlog.core.ConfiguratorFactory; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +import java.util.List; +import java.util.Random; + +import static com.jd.platform.jlog.test.Common.getTest; + +/** + * @author tangbohu + * @version 1.0.0 + * @ClassName EtcdConfiguratorTest.java + * @Description TODO + * @createTime 2022年03月03日 07:35:00 + */ +@SpringBootTest(classes = ExampleApplication.class) +@RunWith(SpringRunner.class) +public class EtcdConfiguratorTest { + + + + private final static Logger LOGGER = LoggerFactory.getLogger(EtcdConfiguratorTest.class); + + + private Configurator configurator = null; + + + + @Before + public void init() { + configurator = ConfiguratorFactory.getInstance(); + getTest(configurator); + } + + // @Test + public void testUpdateCFG() throws Exception { + List workers = configurator.getConfigByPrefix("workers"); + LOGGER.info("初始化的workers:{}", JSON.toJSONString(workers)); + String myIp = "121.1.1.0"; + if(workers.contains(myIp)){ + // do nothing + LOGGER.info("自己的IP还在配置list里 什么也不做"); + return; + }else{ + LOGGER.info("自己的IP不在配置list里 添加进去并发布"); + workers.add(myIp); + } + configurator.putConfig("workers",JSON.toJSONString(workers)); + List workers2 = configurator.getConfigByPrefix("workers"); + LOGGER.info("最新的workers:{}", JSON.toJSONString(workers2)); + } + + @Test + public void testAddConfigListener() throws Exception { + int i1 = new Random().nextInt(2000); + int i2 = new Random().nextInt(2000); + + String val1 = configurator.getString("testKey"); + LOGGER.info("初始化的testKey的val:{}", val1); + configurator.addConfigListener("/jLog"); + LOGGER.info("添加监听器后, 修改配置testKey = {}", i1); + configurator.putConfig("testKey",i1 + ""); + LOGGER.info("修改完毕 准备触发监听器"); + Thread.sleep(5000); + String val2 = configurator.getString("testKey"); + LOGGER.info("第一次修改后的的val:{}", val2); + Thread.sleep(5000); + configurator.removeConfigListener("/jLog"); + Thread.sleep(5000); + // LOGGER.info("移除监听器后:修改配置testKey = {}",i2); + // configurator.putConfig("testKey",i2 + ""); + LOGGER.info("准备验证监听器是否停止 最新testKey={}", configurator.getString("testKey")); + + + configurator.addConfigListener("/jLog"); + LOGGER.info("第二次添加监听器"); + Thread.sleep(22000); + + } +} diff --git a/clientdemo/src/test/java/com/jd/platform/jlog/test/FileConfiguratorTest.java b/example/src/test/java/com/jd/platform/jlog/test/FileConfiguratorTest.java similarity index 63% rename from clientdemo/src/test/java/com/jd/platform/jlog/test/FileConfiguratorTest.java rename to example/src/test/java/com/jd/platform/jlog/test/FileConfiguratorTest.java index 234c90b..b8ec6ec 100644 --- a/clientdemo/src/test/java/com/jd/platform/jlog/test/FileConfiguratorTest.java +++ b/example/src/test/java/com/jd/platform/jlog/test/FileConfiguratorTest.java @@ -1,7 +1,7 @@ package com.jd.platform.jlog.test; import com.alibaba.fastjson.JSON; -import com.jd.platform.jlog.clientdemo.ClientDemoApplication; +import com.jd.platform.jlog.clientdemo.ExampleApplication; import com.jd.platform.jlog.core.Configurator; import com.jd.platform.jlog.core.ConfiguratorFactory; import org.junit.Before; @@ -14,10 +14,8 @@ import org.springframework.test.context.junit4.SpringRunner; import org.yaml.snakeyaml.Yaml; import java.io.*; -import java.util.List; import java.util.Map; import java.util.Properties; -import java.util.Random; import static com.jd.platform.jlog.test.Common.getTest; import static com.jd.platform.jlog.test.Common.modifyFile; @@ -30,7 +28,7 @@ import static com.jd.platform.jlog.test.Common.modifyFile; * @Description TODO * @createTime 2022年02月28日 19:45:00 */ -@SpringBootTest(classes = ClientDemoApplication.class) +@SpringBootTest(classes = ExampleApplication.class) @RunWith(SpringRunner.class) public class FileConfiguratorTest { @@ -52,8 +50,8 @@ public class FileConfiguratorTest { @Test public void testAddConfigListener() throws Exception { - configurator.addConfigListener("/application.yml"); - String path = "/Users/didi/Desktop/jlog/clientdemo/target/classes/application.yml"; + configurator.addConfigListener("/bakapplication.yml"); + String path = "/Users/didi/Desktop/jlog/example/target/classes/bakapplication.yml"; Properties props = new Properties(); FileInputStream fis = new FileInputStream(new File(path)); if (path.contains("yml")) { @@ -61,15 +59,25 @@ public class FileConfiguratorTest { } else { props.load(fis); } - LOGGER.info("读取文件:{}最新配置:{}", path, JSON.toJSONString(props)); + LOGGER.info("读取文件:{} 最新配置:{}", path, JSON.toJSONString(props)); modifyFile(path); LOGGER.info("修改文件完毕 准备触发监听器"); - Thread.sleep(1000); - LOGGER.info("睡醒了 应该更新了配置,testKey:{}",configurator.getConfig("testKey")); - LOGGER.info("移除监听器"); - configurator.removeConfigListener("/application.yml"); + Thread.sleep(2000); + LOGGER.info("睡醒了 应该更新了配置,testKey:{}",configurator.getString("testKey")); + Thread.sleep(12000); + LOGGER.info("移除监听器之前,testKey:{}",configurator.getString("testKey")); + configurator.removeConfigListener("/bakapplication.yml"); + LOGGER.info("移除监听器之后,testKey:{}",configurator.getString("testKey")); modifyFile(path); - LOGGER.info("修改文件完毕 准备验证监听器是否停止 最新testKey={}", configurator.getConfig("testKey")); + LOGGER.info("修改文件完毕 准备验证监听器是否停止 最新testKey={}", configurator.getString("testKey")); + + + LOGGER.info("再次添加监听器"); + configurator.addConfigListener("/bakapplication.yml"); + modifyFile(path); + LOGGER.info("修改文件完毕"); + Thread.sleep(12000); + } diff --git a/example/src/test/java/com/jd/platform/jlog/test/NacosConfiguratorTest.java b/example/src/test/java/com/jd/platform/jlog/test/NacosConfiguratorTest.java new file mode 100644 index 0000000..bcc1be6 --- /dev/null +++ b/example/src/test/java/com/jd/platform/jlog/test/NacosConfiguratorTest.java @@ -0,0 +1,87 @@ +package com.jd.platform.jlog.test; + +import com.alibaba.fastjson.JSON; +import com.jd.platform.jlog.clientdemo.ExampleApplication; +import com.jd.platform.jlog.core.Configurator; +import com.jd.platform.jlog.core.ConfiguratorFactory; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +import java.util.List; +import java.util.Random; + +import static com.jd.platform.jlog.test.Common.getTest; + +/** + * @author tangbohu + * @version 1.0.0 + * @ClassName NacosConfiguratorTest.java + * @Description TODO + * @createTime 2022年03月01日 07:35:00 + */ +@SpringBootTest(classes = ExampleApplication.class) +@RunWith(SpringRunner.class) +public class NacosConfiguratorTest { + + + + private final static Logger LOGGER = LoggerFactory.getLogger(NacosConfiguratorTest.class); + + + private Configurator configurator = null; + + + + @Before + public void init() { + configurator = ConfiguratorFactory.getInstance(); + getTest(configurator); + } + + @Test + public void testUpdateCFG() throws Exception { + List workers = configurator.getConfigByPrefix("workers"); + LOGGER.info("初始化的workers:{}", JSON.toJSONString(workers)); + String myIp = "121.1.1.0"; + if(workers.contains(myIp)){ + // do nothing + LOGGER.info("自己的IP还在配置list里 什么也不做"); + return; + }else{ + LOGGER.info("自己的IP不在配置list里 添加进去并发布"); + workers.add(myIp); + } + configurator.putConfig("workers",JSON.toJSONString(workers)); + List workers2 = configurator.getConfigByPrefix("workers"); + LOGGER.info("最新的workers:{}", JSON.toJSONString(workers2)); + } + + @Test + public void testAddConfigListener() throws Exception { + int i1 = new Random().nextInt(2000); + int i2 = new Random().nextInt(2000); + + String val1 = configurator.getString("testKey"); + LOGGER.info("初始化的testKey的val:{}", val1); + configurator.addConfigListener("bakjLog.properties"); + LOGGER.info("添加监听器后, 修改配置testKey = {}", i1); + // configurator.putConfig("testKey",i1 + ""); + LOGGER.info("修改完毕 准备触发监听器"); + Thread.sleep(1000); + String val2 = configurator.getString("testKey"); + LOGGER.info("第一次修改后的的val:{}", val2); + Thread.sleep(1000); + configurator.removeConfigListener("bakjLog.properties"); + Thread.sleep(1000); + LOGGER.info("移除监听器后:修改配置testKey = {}",i2); + configurator.putConfig("testKey",i2 + ""); + LOGGER.info("准备验证监听器是否停止 最新testKey={}", configurator.getString("testKey")); + + Thread.sleep(35000); + } +} diff --git a/clientdemo/src/test/java/com/jd/platform/jlog/test/TracerPacketTest.java b/example/src/test/java/com/jd/platform/jlog/test/TracerPacketTest.java similarity index 95% rename from clientdemo/src/test/java/com/jd/platform/jlog/test/TracerPacketTest.java rename to example/src/test/java/com/jd/platform/jlog/test/TracerPacketTest.java index 140b2d5..0ef5a23 100644 --- a/clientdemo/src/test/java/com/jd/platform/jlog/test/TracerPacketTest.java +++ b/example/src/test/java/com/jd/platform/jlog/test/TracerPacketTest.java @@ -2,7 +2,7 @@ package com.jd.platform.jlog.test; import com.alibaba.fastjson.JSON; import com.jd.platform.jlog.client.udp.UdpSender; -import com.jd.platform.jlog.clientdemo.ClientDemoApplication; +import com.jd.platform.jlog.clientdemo.ExampleApplication; import com.jd.platform.jlog.common.model.TracerBean; import com.jd.platform.jlog.common.utils.IpUtils; import com.jd.platform.jlog.common.utils.ZstdUtils; @@ -18,7 +18,7 @@ import java.util.*; * @version 1.0 * @date 2021-12-27 */ -//@SpringBootTest(classes = ClientDemoApplication.class) +//@SpringBootTest(classes = ExampleApplication.class) //@RunWith(SpringRunner.class) public class TracerPacketTest { diff --git a/clientdemo/src/test/java/com/jd/platform/jlog/test/ZKConfiguratorTest.java b/example/src/test/java/com/jd/platform/jlog/test/ZKConfiguratorTest.java similarity index 69% rename from clientdemo/src/test/java/com/jd/platform/jlog/test/ZKConfiguratorTest.java rename to example/src/test/java/com/jd/platform/jlog/test/ZKConfiguratorTest.java index 5850d22..4f320dd 100644 --- a/clientdemo/src/test/java/com/jd/platform/jlog/test/ZKConfiguratorTest.java +++ b/example/src/test/java/com/jd/platform/jlog/test/ZKConfiguratorTest.java @@ -1,7 +1,7 @@ package com.jd.platform.jlog.test; import com.alibaba.fastjson.JSON; -import com.jd.platform.jlog.clientdemo.ClientDemoApplication; +import com.jd.platform.jlog.clientdemo.ExampleApplication; import com.jd.platform.jlog.core.Configurator; import com.jd.platform.jlog.core.ConfiguratorFactory; import org.junit.Before; @@ -11,17 +11,12 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; -import org.yaml.snakeyaml.Yaml; -import java.io.File; -import java.io.FileInputStream; import java.util.List; -import java.util.Map; -import java.util.Properties; + import java.util.Random; import static com.jd.platform.jlog.test.Common.getTest; -import static com.jd.platform.jlog.test.Common.modifyFile; /** * @author tangbohu @@ -30,7 +25,7 @@ import static com.jd.platform.jlog.test.Common.modifyFile; * @Description TODO * @createTime 2022年03月01日 07:35:00 */ -@SpringBootTest(classes = ClientDemoApplication.class) +@SpringBootTest(classes = ExampleApplication.class) @RunWith(SpringRunner.class) public class ZKConfiguratorTest { @@ -53,7 +48,7 @@ public class ZKConfiguratorTest { public void testUpdateCFG() throws Exception { List workers = configurator.getConfigByPrefix("workers"); LOGGER.info("初始化的workers:{}", JSON.toJSONString(workers)); - String myIp = "121.1.1.1"; + String myIp = "121.1.1.0"; if(workers.contains(myIp)){ // do nothing LOGGER.info("自己的IP还在配置list里 什么也不做"); @@ -72,20 +67,22 @@ public class ZKConfiguratorTest { int i1 = new Random().nextInt(2000); int i2 = new Random().nextInt(2000); - String val1 = configurator.getConfig("testKey"); + String val1 = configurator.getString("testKey"); LOGGER.info("初始化的testKey的val:{}", val1); - configurator.addConfigListener("/application.yml"); - LOGGER.info("添加监听器:随机数:{}", i1); - configurator.putConfig("testKey",i1 + ""); + configurator.addConfigListener("/bakjLog.properties"); + LOGGER.info("添加监听器后, 修改配置testKey = {}", i1); + // configurator.putConfig("testKey",i1 + ""); LOGGER.info("修改完毕 准备触发监听器"); Thread.sleep(1000); - String val2 = configurator.getConfig("testKey"); - LOGGER.info("修改后的的val:{}", val2); - LOGGER.info("移除监听器:随机数:{}",i2); - Thread.sleep(3000); - configurator.removeConfigListener("/application.yml"); + String val2 = configurator.getString("testKey"); + LOGGER.info("第一次修改后的的val:{}", val2); Thread.sleep(1000); - configurator.putConfig("testKey",i2 + ""); - LOGGER.info("准备验证监听器是否停止 最新testKey={}", configurator.getConfig("testKey")); + configurator.removeConfigListener("/bakjLog.properties"); + Thread.sleep(1000); + LOGGER.info("移除监听器后:修改配置testKey = {}",i2); + // configurator.putConfig("testKey",i2 + ""); + LOGGER.info("准备验证监听器是否停止 最新testKey={}", configurator.getString("testKey")); + + Thread.sleep(35000); } } diff --git a/pom.xml b/pom.xml index eb3fca9..4c92e3e 100644 --- a/pom.xml +++ b/pom.xml @@ -16,7 +16,7 @@ clientlog4j2 clientlogback Dashboard - clientdemo + example config