package com.lvtu.csa.utils;
import javax.servlet.ServletRequest;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;
import com.lvtu.csa.context.model.log.AccessLog;
import com.lvtu.csa.context.model.log.BaseLog;
import com.lvtu.csa.context.model.log.DeviceInfoLog;
import com.lvtu.csa.context.model.log.UserInfoLog;
/**
* 处理通过flume发送的日志
*/
public class FlumeLogUtils {
private final static String SEPERATOR = "\001";
private static Logger logger = Logger.getLogger(FlumeLogUtils.class);
/**
* 从请求参数中提取Log字符串
* @param request
* @return
*/
public static String extractFromRequest(ServletRequest request) {
if (null == request) {
return null;
}
if (!(request instanceof HttpServletRequest)){
return null;
}
HttpServletRequest req = (HttpServletRequest)request;
DeviceInfoLog deviceInfo = new DeviceInfoLog();
deviceInfo.firstChannel = req.getParameter("firstChannel");
deviceInfo.secondChannel = req.getParameter("secondChannel");
deviceInfo.osVersion = req.getParameter("osVersion");
deviceInfo.udid = req.getParameter("udid");
deviceInfo.userAgent = req.getHeader("User-Agent");
UserInfoLog userInfo = new UserInfoLog();
userInfo.ip = StringUtils.isBlank(req.getParameter("ip")) ? getRemoteAddr(req) : req.getParameter("ip");
userInfo.latitude = (StringUtils.isBlank(req.getParameter("latitude")) ? req.getParameter("globalLatitude") : req.getParameter("latitude"));
userInfo.longitude = (StringUtils.isBlank(req.getParameter("longitude")) ? req.getParameter("globalLongitude") : req.getParameter("longitude"));
userInfo.lvversion = req.getParameter("lvversion");
try{
userInfo.userId = (req.getAttribute("userId") == null ? "" : String.valueOf(req.getAttribute("userId")));
}catch (Exception e){
logger.error("userId转换异常",e);
}
userInfo.lvsessionid = req.getParameter("lvsessionid");
AccessLog accessLog = new AccessLog();
accessLog.method = req.getParameter("method");
accessLog.version = req.getParameter("version");
accessLog.clientTimestamp = req.getParameter("clientTimestamp");
BaseLog baseLog = new BaseLog();
baseLog.deviceInfo = deviceInfo;
baseLog.userInfo = userInfo;
baseLog.accessLog = accessLog;
String log = baseLog.toLogStr(SEPERATOR);
return log.replaceAll("null", "");
}
/**
* 获取客户端IP地址.<br>
* 支持多级反向代理
*
* @param request
* HttpServletRequest
* @return 客户端真实IP地址
*/
public static String getRemoteAddr(final HttpServletRequest request) {
try{
String remoteAddr = request.getHeader("X-Forwarded-For");
// 如果通过多级反向代理,X-Forwarded-For的值不止一个,而是一串用逗号分隔的IP值,此时取X-Forwarded-For中第一个非unknown的有效IP字符串
if (isEffective(remoteAddr) && (remoteAddr.indexOf(",") > -1)) {
String[] array = remoteAddr.split(",");
for (String element : array) {
if (isEffective(element)) {
remoteAddr = element;
break;
}
}
}
if (!isEffective(remoteAddr)) {
remoteAddr = request.getHeader("X-Real-IP");
}
if (!isEffective(remoteAddr)) {
remoteAddr = request.getRemoteAddr();
}
return remoteAddr;
}catch(Exception e){
return "";
}
}
/**
* 远程地址是否有效.
*
* @param remoteAddr
* 远程地址
* @return true代表远程地址有效,false代表远程地址无效
*/
private static boolean isEffective(final String remoteAddr) {
boolean isEffective = false;
if ((null != remoteAddr) && (!"".equals(remoteAddr.trim()))
&& (!"unknown".equalsIgnoreCase(remoteAddr.trim()))) {
isEffective = true;
}
return isEffective;
}
}
import javax.servlet.ServletRequest;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;
import com.lvtu.csa.context.model.log.AccessLog;
import com.lvtu.csa.context.model.log.BaseLog;
import com.lvtu.csa.context.model.log.DeviceInfoLog;
import com.lvtu.csa.context.model.log.UserInfoLog;
/**
* 处理通过flume发送的日志
*/
public class FlumeLogUtils {
private final static String SEPERATOR = "\001";
private static Logger logger = Logger.getLogger(FlumeLogUtils.class);
/**
* 从请求参数中提取Log字符串
* @param request
* @return
*/
public static String extractFromRequest(ServletRequest request) {
if (null == request) {
return null;
}
if (!(request instanceof HttpServletRequest)){
return null;
}
HttpServletRequest req = (HttpServletRequest)request;
DeviceInfoLog deviceInfo = new DeviceInfoLog();
deviceInfo.firstChannel = req.getParameter("firstChannel");
deviceInfo.secondChannel = req.getParameter("secondChannel");
deviceInfo.osVersion = req.getParameter("osVersion");
deviceInfo.udid = req.getParameter("udid");
deviceInfo.userAgent = req.getHeader("User-Agent");
UserInfoLog userInfo = new UserInfoLog();
userInfo.ip = StringUtils.isBlank(req.getParameter("ip")) ? getRemoteAddr(req) : req.getParameter("ip");
userInfo.latitude = (StringUtils.isBlank(req.getParameter("latitude")) ? req.getParameter("globalLatitude") : req.getParameter("latitude"));
userInfo.longitude = (StringUtils.isBlank(req.getParameter("longitude")) ? req.getParameter("globalLongitude") : req.getParameter("longitude"));
userInfo.lvversion = req.getParameter("lvversion");
try{
userInfo.userId = (req.getAttribute("userId") == null ? "" : String.valueOf(req.getAttribute("userId")));
}catch (Exception e){
logger.error("userId转换异常",e);
}
userInfo.lvsessionid = req.getParameter("lvsessionid");
AccessLog accessLog = new AccessLog();
accessLog.method = req.getParameter("method");
accessLog.version = req.getParameter("version");
accessLog.clientTimestamp = req.getParameter("clientTimestamp");
BaseLog baseLog = new BaseLog();
baseLog.deviceInfo = deviceInfo;
baseLog.userInfo = userInfo;
baseLog.accessLog = accessLog;
String log = baseLog.toLogStr(SEPERATOR);
return log.replaceAll("null", "");
}
/**
* 获取客户端IP地址.<br>
* 支持多级反向代理
*
* @param request
* HttpServletRequest
* @return 客户端真实IP地址
*/
public static String getRemoteAddr(final HttpServletRequest request) {
try{
String remoteAddr = request.getHeader("X-Forwarded-For");
// 如果通过多级反向代理,X-Forwarded-For的值不止一个,而是一串用逗号分隔的IP值,此时取X-Forwarded-For中第一个非unknown的有效IP字符串
if (isEffective(remoteAddr) && (remoteAddr.indexOf(",") > -1)) {
String[] array = remoteAddr.split(",");
for (String element : array) {
if (isEffective(element)) {
remoteAddr = element;
break;
}
}
}
if (!isEffective(remoteAddr)) {
remoteAddr = request.getHeader("X-Real-IP");
}
if (!isEffective(remoteAddr)) {
remoteAddr = request.getRemoteAddr();
}
return remoteAddr;
}catch(Exception e){
return "";
}
}
/**
* 远程地址是否有效.
*
* @param remoteAddr
* 远程地址
* @return true代表远程地址有效,false代表远程地址无效
*/
private static boolean isEffective(final String remoteAddr) {
boolean isEffective = false;
if ((null != remoteAddr) && (!"".equals(remoteAddr.trim()))
&& (!"unknown".equalsIgnoreCase(remoteAddr.trim()))) {
isEffective = true;
}
return isEffective;
}
}