Skip to content

Commit fe97cd7

Browse files
committed
merge
2 parents 45d845d + d044fb8 commit fe97cd7

File tree

13 files changed

+456
-1
lines changed

13 files changed

+456
-1
lines changed

README.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,11 @@
33
https://tech.meituan.com/change_log_level.html 《日志级别动态调整——小工具解决大问题》<br />
44

55
# 更新
6-
2018-04-28 初始版,包括实现日志级别动态调整和方法调用处理单元<br />
6+
2018-05-18<br />
7+
1、增加简单使用http从web获取日志配置的类,可自行扩展。
8+
9+
2018-04-28 <br />
10+
1、初始版,包括实现日志级别动态调整和方法调用处理单元<br />
711

812
# 使用帮助
913
引入依赖<br />
Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
package com.sekift.logger.util;
2+
3+
4+
import java.util.HashMap;
5+
import java.util.Map;
6+
import java.util.concurrent.ScheduledExecutorService;
7+
import java.util.concurrent.TimeUnit;
8+
9+
import org.slf4j.Logger;
10+
import org.slf4j.LoggerFactory;
11+
12+
import com.alibaba.fastjson.JSON;
13+
14+
/**
15+
* 公共配置获取类
16+
* @date 2018-05-18
17+
*
18+
*/
19+
public class ChangeUtil {
20+
private static Logger logger = LoggerFactory.getLogger(ChangeUtil.class);
21+
22+
private ChangeUtil(){}
23+
24+
private static class ConfigMap{
25+
// 自行填写相关的web页面
26+
private static final String CHANGE_URL = "http://www.xxx.com";
27+
28+
private static final int CONNECT_TIME_OUT = 3000;
29+
30+
private static final int READ_TIME_OUT = 3000;
31+
32+
private static final String CHARSET = "utf-8";
33+
34+
/**
35+
* 定时执行服务
36+
*/
37+
private static ScheduledExecutorService scheduledService = ThreadPools
38+
.newScheduledExecutorService(1, "获取配置服务");
39+
40+
private static final Map<String, String> CONFIG_MAP = new HashMap<String, String>();
41+
42+
43+
static {
44+
setConfigMap();
45+
startTimer();
46+
}
47+
48+
private static void startTimer() {
49+
Runnable task = new Runnable() {
50+
public void run() {
51+
setConfigMap();
52+
}
53+
};
54+
//每隔1分钟获取一次
55+
scheduledService.scheduleAtFixedRate(task, 0, 1, TimeUnit.MINUTES);
56+
}
57+
58+
/**
59+
* 查询并放入map
60+
*/
61+
@SuppressWarnings("unchecked")
62+
private static void setConfigMap() {
63+
try {
64+
String result = HttpUtil.post(CHANGE_URL, null,
65+
CONNECT_TIME_OUT, READ_TIME_OUT, CHARSET);
66+
if(result==null){
67+
throw new RuntimeException("[获取日志等级]返回NULL");
68+
}
69+
/**
70+
* TODO 将result转成BEAN,这部分请自行处理
71+
*/
72+
Map<String, Object> mapType = JSON.parseObject(result, Map.class);
73+
if ((int)mapType.get("success") == 1) {
74+
Map<Object,Object> dataMap = (Map<Object,Object>)mapType.get("data");
75+
if(dataMap!=null){
76+
Map<String,String> configMap = (Map<String,String>) dataMap.get("change-log-level");
77+
if(configMap!=null){
78+
CONFIG_MAP.clear();
79+
CONFIG_MAP.putAll(configMap);
80+
}
81+
}
82+
}
83+
} catch (Exception e) {
84+
logger.error("[获取日志等级]定时查询任务出错!", e);
85+
}
86+
}
87+
88+
public static String get(String key, String defaultVal) {
89+
if (CONFIG_MAP.containsKey(key)) {
90+
return CONFIG_MAP.get(key);
91+
}
92+
return defaultVal;
93+
}
94+
95+
}
96+
97+
/**
98+
* 下面这个一个是ChangeLogLevel,一个是MethodInvokerProcess,自行区分
99+
*/
100+
private static final String CHANGE_LOG_LEVEL = "change_log_level";
101+
private static final String METHOD_INVOKER_LEVEL = "com.sekift.logger.MethodInvokerProcessUnitTest";
102+
private static final String DEFAULT_VALUE = "ERROR";
103+
104+
public static String getChangeLogLevel() {
105+
return ConfigMap.get(CHANGE_LOG_LEVEL, DEFAULT_VALUE);
106+
}
107+
108+
public static String getMethodInvokerLevel() {
109+
return ConfigMap.get(METHOD_INVOKER_LEVEL, DEFAULT_VALUE);
110+
}
111+
112+
public static Map<String, String> getConfigMap() {
113+
return ConfigMap.CONFIG_MAP;
114+
}
115+
}
Lines changed: 268 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,268 @@
1+
package com.sekift.logger.util;
2+
3+
import java.io.BufferedReader;
4+
import java.io.BufferedWriter;
5+
import java.io.InputStream;
6+
import java.io.InputStreamReader;
7+
import java.io.OutputStreamWriter;
8+
import java.net.HttpURLConnection;
9+
import java.net.URL;
10+
import java.util.Map;
11+
import java.util.Set;
12+
13+
import org.slf4j.Logger;
14+
import org.slf4j.LoggerFactory;
15+
16+
/**
17+
* 提供通过HTTP协议获取内容的方法 <br/>
18+
* 所有提供方法中的params参数在内部不会进行自动的url encode,如果提交参数需要进行url encode,
19+
* 请调用方自行处理
20+
* @date 2018-05-18
21+
*/
22+
@SuppressWarnings({ "rawtypes", "unchecked" })
23+
public class HttpUtil {
24+
private static Logger logger = LoggerFactory.getLogger(HttpUtil.class);
25+
26+
/**
27+
* 支持的Http method
28+
*
29+
*/
30+
private static enum HttpMethod {
31+
POST,DELETE,GET,PUT,HEAD;
32+
};
33+
34+
private static String invokeUrl(String url, Map params, Map<String,String> headers, int connectTimeout, int readTimeout, String encoding, HttpMethod method){
35+
//构造请求参数字符串
36+
StringBuilder paramsStr = null;
37+
if(params != null){
38+
paramsStr = new StringBuilder();
39+
Set<Map.Entry> entries = params.entrySet();
40+
for(Map.Entry entry:entries){
41+
String value = (entry.getValue()!=null)?(String.valueOf(entry.getValue())):"";
42+
paramsStr.append(entry.getKey() + "=" + value + "&");
43+
}
44+
//只有POST方法才能通过OutputStream(即form的形式)提交参数
45+
if(method != HttpMethod.POST){
46+
url += "?"+paramsStr.toString();
47+
}
48+
}
49+
50+
URL uUrl = null;
51+
HttpURLConnection conn = null;
52+
BufferedWriter out = null;
53+
BufferedReader in = null;
54+
try {
55+
//创建和初始化连接
56+
uUrl = new URL(url);
57+
conn = (HttpURLConnection) uUrl.openConnection();
58+
conn.setRequestProperty("content-type", "application/x-www-form-urlencoded");
59+
conn.setRequestMethod(method.toString());
60+
conn.setDoOutput(true);
61+
conn.setDoInput(true);
62+
//设置连接超时时间
63+
conn.setConnectTimeout(connectTimeout);
64+
//设置读取超时时间
65+
conn.setReadTimeout(readTimeout);
66+
//指定请求header参数
67+
if(headers != null && headers.size() > 0){
68+
Set<String> headerSet = headers.keySet();
69+
for(String key:headerSet){
70+
conn.setRequestProperty(key, headers.get(key));
71+
}
72+
}
73+
74+
if(paramsStr != null && method == HttpMethod.POST){
75+
//发送请求参数
76+
out = new BufferedWriter(new OutputStreamWriter(conn.getOutputStream(),encoding));
77+
out.write(paramsStr.toString());
78+
out.flush();
79+
}
80+
81+
//接收返回结果
82+
StringBuilder result = new StringBuilder();
83+
in = new BufferedReader(new InputStreamReader(conn.getInputStream(),encoding));
84+
if(in != null){
85+
String line = "";
86+
while ((line = in.readLine()) != null) {
87+
result.append(line);
88+
}
89+
}
90+
return result.toString();
91+
} catch (Exception e) {
92+
logger.error("调用接口["+url+"]失败!请求URL:"+url+",参数:"+params,e);
93+
//处理错误流,提高http连接被重用的几率
94+
try {
95+
byte[] buf = new byte[100];
96+
InputStream es = conn.getErrorStream();
97+
if(es != null){
98+
while (es.read(buf) > 0) {;}
99+
es.close();
100+
}
101+
} catch (Exception e1) {
102+
e1.printStackTrace();
103+
}
104+
} finally {
105+
try {
106+
if (out!=null) {
107+
out.close();
108+
}
109+
}catch (Exception e) {
110+
e.printStackTrace();
111+
}
112+
try {
113+
if (in !=null) {
114+
in.close();
115+
}
116+
}catch (Exception e) {
117+
e.printStackTrace();
118+
}
119+
//关闭连接
120+
if (conn != null){
121+
conn.disconnect();
122+
}
123+
}
124+
return null;
125+
}
126+
127+
/**
128+
* POST方法提交Http请求,语义为“增加” <br/>
129+
* 注意:Http方法中只有POST方法才能使用body来提交内容
130+
* @param url 资源路径(如果url中已经包含参数,则params应该为null)
131+
* @param params 参数
132+
* @param connectTimeout 连接超时时间(单位为ms)
133+
* @param readTimeout 读取超时时间(单位为ms)
134+
* @param charset 字符集(一般该为“utf-8”)
135+
* @return
136+
*/
137+
public static String post(String url, Map params, int connectTimeout, int readTimeout, String charset){
138+
return invokeUrl(url,params,null,connectTimeout,readTimeout,charset,HttpMethod.POST);
139+
}
140+
141+
/**
142+
* POST方法提交Http请求,语义为“增加” <br/>
143+
* 注意:Http方法中只有POST方法才能使用body来提交内容
144+
* @param url 资源路径(如果url中已经包含参数,则params应该为null)
145+
* @param params 参数
146+
* @param headers 请求头参数
147+
* @param connectTimeout 连接超时时间(单位为ms)
148+
* @param readTimeout 读取超时时间(单位为ms)
149+
* @param charset 字符集(一般该为“utf-8”)
150+
* @return
151+
*/
152+
public static String post(String url, Map params, Map<String,String> headers, int connectTimeout, int readTimeout, String charset){
153+
return invokeUrl(url,params,headers,connectTimeout,readTimeout,charset,HttpMethod.POST);
154+
}
155+
156+
/**
157+
* GET方法提交Http请求,语义为“查询”
158+
* @param url 资源路径(如果url中已经包含参数,则params应该为null)
159+
* @param params 参数
160+
* @param connectTimeout 连接超时时间(单位为ms)
161+
* @param readTimeout 读取超时时间(单位为ms)
162+
* @param charset 字符集(一般该为“utf-8”)
163+
* @return
164+
*/
165+
public static String get(String url, Map params, int connectTimeout, int readTimeout, String charset){
166+
return invokeUrl(url,params,null,connectTimeout,readTimeout,charset,HttpMethod.GET);
167+
}
168+
169+
/**
170+
* GET方法提交Http请求,语义为“查询”
171+
* @param url 资源路径(如果url中已经包含参数,则params应该为null)
172+
* @param params 参数
173+
* @param headers 请求头参数
174+
* @param connectTimeout 连接超时时间(单位为ms)
175+
* @param readTimeout 读取超时时间(单位为ms)
176+
* @param charset 字符集(一般该为“utf-8”)
177+
* @return
178+
*/
179+
public static String get(String url, Map params, Map<String,String> headers,int connectTimeout, int readTimeout, String charset){
180+
return invokeUrl(url,params,headers,connectTimeout,readTimeout,charset,HttpMethod.GET);
181+
}
182+
183+
/**
184+
* PUT方法提交Http请求,语义为“更改” <br/>
185+
* 注意:PUT方法也是使用url提交参数内容而非body,所以参数最大长度收到服务器端实现的限制,Resin大概是8K
186+
* @param url 资源路径(如果url中已经包含参数,则params应该为null)
187+
* @param params 参数
188+
* @param connectTimeout 连接超时时间(单位为ms)
189+
* @param readTimeout 读取超时时间(单位为ms)
190+
* @param charset 字符集(一般该为“utf-8”)
191+
* @return
192+
*/
193+
public static String put(String url, Map params, int connectTimeout, int readTimeout, String charset){
194+
return invokeUrl(url,params,null,connectTimeout,readTimeout,charset,HttpMethod.PUT);
195+
}
196+
197+
/**
198+
* PUT方法提交Http请求,语义为“更改” <br/>
199+
* 注意:PUT方法也是使用url提交参数内容而非body,所以参数最大长度收到服务器端实现的限制,Resin大概是8K
200+
* @param url 资源路径(如果url中已经包含参数,则params应该为null)
201+
* @param params 参数
202+
* @param headers 请求头参数
203+
* @param connectTimeout 连接超时时间(单位为ms)
204+
* @param readTimeout 读取超时时间(单位为ms)
205+
* @param charset 字符集(一般该为“utf-8”)
206+
* @return
207+
*/
208+
public static String put(String url, Map params, Map<String,String> headers,int connectTimeout, int readTimeout, String charset){
209+
return invokeUrl(url,params,headers,connectTimeout,readTimeout,charset,HttpMethod.PUT);
210+
}
211+
212+
/**
213+
* DELETE方法提交Http请求,语义为“删除”
214+
* @param url 资源路径(如果url中已经包含参数,则params应该为null)
215+
* @param params 参数
216+
* @param connectTimeout 连接超时时间(单位为ms)
217+
* @param readTimeout 读取超时时间(单位为ms)
218+
* @param charset 字符集(一般该为“utf-8”)
219+
* @return
220+
*/
221+
public static String delete(String url, Map params, int connectTimeout, int readTimeout, String charset){
222+
return invokeUrl(url,params,null,connectTimeout,readTimeout,charset,HttpMethod.DELETE);
223+
}
224+
225+
/**
226+
* DELETE方法提交Http请求,语义为“删除”
227+
* @param url 资源路径(如果url中已经包含参数,则params应该为null)
228+
* @param params 参数
229+
* @param headers 请求头参数
230+
* @param connectTimeout 连接超时时间(单位为ms)
231+
* @param readTimeout 读取超时时间(单位为ms)
232+
* @param charset 字符集(一般该为“utf-8”)
233+
* @return
234+
*/
235+
public static String delete(String url, Map params, Map<String,String> headers, int connectTimeout, int readTimeout, String charset){
236+
return invokeUrl(url,params,headers,connectTimeout,readTimeout,charset,HttpMethod.DELETE);
237+
}
238+
239+
/**
240+
* HEAD方法提交Http请求,语义同GET方法 <br/>
241+
* 跟GET方法不同的是,用该方法请求,服务端不返回message body只返回头信息,能节省带宽
242+
* @param url 资源路径(如果url中已经包含参数,则params应该为null)
243+
* @param params 参数
244+
* @param connectTimeout 连接超时时间(单位为ms)
245+
* @param readTimeout 读取超时时间(单位为ms)
246+
* @param charset 字符集(一般该为“utf-8”)
247+
* @return
248+
*/
249+
public static String head(String url, Map params, int connectTimeout, int readTimeout, String charset){
250+
return invokeUrl(url,params,null,connectTimeout,readTimeout,charset,HttpMethod.HEAD);
251+
}
252+
253+
/**
254+
* HEAD方法提交Http请求,语义同GET方法 <br/>
255+
* 跟GET方法不同的是,用该方法请求,服务端不返回message body只返回头信息,能节省带宽
256+
* @param url 资源路径(如果url中已经包含参数,则params应该为null)
257+
* @param params 参数
258+
* @param headers 请求头参数
259+
* @param connectTimeout 连接超时时间(单位为ms)
260+
* @param readTimeout 读取超时时间(单位为ms)
261+
* @param charset 字符集(一般该为“utf-8”)
262+
* @return
263+
*/
264+
public static String head(String url, Map params, Map<String,String> headers, int connectTimeout, int readTimeout, String charset){
265+
return invokeUrl(url,params,headers,connectTimeout,readTimeout,charset,HttpMethod.HEAD);
266+
}
267+
268+
}

0 commit comments

Comments
 (0)