Java,日志信息处理

来源:互联网 发布:成都 大数据 售前 编辑:程序博客网 时间:2024/06/11 17:49
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;
    }
}

0 0