package org.weiboad.ragnar.logpusher;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import java.util.concurrent.ConcurrentLinkedQueue;
public class CurlThread extends Thread {
private Logger log = LoggerFactory.getLogger(CurlThread.class);
private String host;
private ConcurrentLinkedQueue<String> sendBizLogQueue;
private ConcurrentLinkedQueue<String> sendMetaLogQueue;
private int processMaxCount = 1000;
public CurlThread(String host, ConcurrentLinkedQueue<String> sendBizLogQueue, ConcurrentLinkedQueue<String> sendMetaLogQueue) {
this.host = host;
this.sendBizLogQueue = sendBizLogQueue;
this.sendMetaLogQueue = sendMetaLogQueue;
}
public void run() {
while (true) {
//biz log
pushBizLogToServer("http://" + host + "/ragnar/log/bizlog/put");
//meta log
pushMetaLogToServer("http://" + host + "/ragnar/log/metalog/put");
try {
Thread.sleep(10);
} catch (Exception e) {
//log.error(e.getMessage());
}
}
}
private String postHttp(String url, String postData) {
PrintWriter out = null;
BufferedReader in = null;
String result = "";
if (postData.trim().length() == 0) {
return "";
}
try {
URL realUrl = new URL(url);
// 打开和URL之间的连接
URLConnection conn = realUrl.openConnection();
// 设置通用的请求属性
conn.setRequestProperty("connection", "Keep-Alive");
conn.setRequestProperty("user-agent",
"Ragnar Fiery LogPusher");
// 发送POST请求必须设置如下两行
conn.setDoOutput(true);
conn.setDoInput(true);
// 获取URLConnection对象对应的输出流
out = new PrintWriter(conn.getOutputStream());
// 发送请求参数
out.print("contents=" + URLEncoder.encode(postData, "utf-8"));
// flush输出流的缓冲
out.flush();
// 定义BufferedReader输入流来读取URL的响应
in = new BufferedReader(
new InputStreamReader(conn.getInputStream()));
String line;
while ((line = in.readLine()) != null) {
result += line;
}
} catch (Exception e) {
log.error("Post Error:" + e);
e.printStackTrace();
} finally {
try {
if (out != null) {
out.close();
}
if (in != null) {
in.close();
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
return result;
}
private void pushBizLogToServer(String url) {
long pushcount = 0;
String postData = "";
while (sendBizLogQueue.peek() != null) {
String content = sendBizLogQueue.poll();
if (content != null && content.trim().length() > 0) {
postData += (content.trim() + "\n");
pushcount++;
}
if (pushcount > this.processMaxCount) {
break;
}
}
if (postData.trim().length() > 0) {
String retString = postHttp(url, postData);
if (retString.equals("")) {
return;
}
try {
JsonParser jsonParser = new JsonParser();
JsonObject retObj = jsonParser.parse(retString).getAsJsonObject();
if (retObj.get("code").getAsInt() != 0) {
log.error("bizlog:" + retString);
} else {
log.info("bizlog:" + retString);
}
} catch (Exception e) {
e.printStackTrace();
log.error(e.getMessage());
}
}
}
private boolean pushMetaLogToServer(String url) {
long pushcount = 0;
String data = "";
while (sendMetaLogQueue.peek() != null) {
String content = sendMetaLogQueue.poll();
if (content != null && content.trim().length() > 0) {
data += (content.trim() + "\n");
pushcount++;
}
if (pushcount > this.processMaxCount) {
break;
}
}
if (data.equals("")) {
return true;
}
if (data.trim().length() > 0) {
String retString = postHttp(url, data);
if (retString.equals("")) {
return false;
}
try {
JsonParser jsonParser = new JsonParser();
JsonObject retObj = jsonParser.parse(retString).getAsJsonObject();
if (retObj.get("code").getAsInt() != 0) {
log.error("metalog:" + retString);
return false;
} else {
log.info("metalog:" + retString);
return true;
}
} catch (Exception e) {
log.error(e.getMessage());
e.printStackTrace();
}
}
return true;
}
}