LogUtil.java 4.27 KB
package com.cjs.site.util.log;

import java.util.Date;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.lang3.StringUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.mobile.device.Device;

import com.cjs.site.util.web.ActionUtil;

/**
 * Log4j记录日志
 * 
 * @author tongyufu
 *
 */
public class LogUtil {

    static Logger              logger         = LogManager.getLogger("zhao-mobile");
    public static final String SPARATOR       = "|";
    /**日志标记*/
    public static final String LOG_ANNOTATION = "LOG_ANNOTATION";

    /**
     * 记录日志
     * 
     * @param request
     * @param behaviour 注解在方法上@Log的 value
     * @param responseStatus 响应状态
     */
    public static void log(HttpServletRequest request, String behaviour, int responseStatus) {
        StringBuilder message = LogUtil.createMessage(request, behaviour, responseStatus);
        try {
            logger.info(message);
        } catch (Exception e) {
            logger.error("记录日志出错", e);
        }
    }

    private static StringBuilder createMessage(HttpServletRequest request, String behaviour,
                                               int responseStatus) {
        StringBuilder message = new StringBuilder(SPARATOR);
        String userId = request.getHeader("X-Zhao-UserId");
        String deviceId = request.getHeader("X-Zhao-DeviceId");
        Device device = ActionUtil.getCurrentDevice();

        //1. 时间戳(精确到毫秒)
        message.append(new Date().getTime());
        message.append(SPARATOR);
        //2. 登录状态(0,未登录; 1,登录)
        message.append(ActionUtil.getUser() == null ? "0" : "1");
        message.append(SPARATOR);
        //3. 用户ID(如果在登录前并且cookie中没有用户id的,存X-Zhao-DeviceId)
        if (StringUtils.isBlank(userId)) {
            message.append("0");
            message.append(SPARATOR);
            message.append(LogUtil.castString(deviceId));
        } else {
            message.append("1");
            message.append(SPARATOR);
            message.append(userId);
        }
        message.append(SPARATOR);
        //4. 用户来源(web,app)
        if (device == null) {
            message.append("");
        } else {
            message.append(device.isNormal() ? "web" : "app");
        }
        message.append(SPARATOR);
        //5. 行为类型(默认为空; search,搜索; auction,竞拍)
        message.append(LogUtil.castString(behaviour));
        message.append(SPARATOR);
        //6. 行为结果(Response Status)
        if (responseStatus == 0) {
            responseStatus = 200;
        }
        message.append(responseStatus);
        message.append(SPARATOR);
        //7. Sessionid
        message.append(request.getSession().getId());
        message.append(SPARATOR);
        //8. IP(如果X-Forwarded-For等代理Header不为空,以代理Header优先)
        message.append(ActionUtil.getIP());
        message.append(SPARATOR);
        //9. 对象ID,可为空
        message.append(LogUtil.castString(request.getAttribute("LOG_AUCTION_ID")));
        message.append(SPARATOR);
        //10. 行为参数(价格, 搜索关键字(urlencoded)等)
        message.append(LogUtil.castString(request.getQueryString()));
        message.append(SPARATOR);
        //11. 行为编号(页面id)
        String url = request.getMethod() + request.getRequestURI();
        message.append(asciiSum(url));
        message.append(SPARATOR);
        //12. 当前页URL(urlencoded)
        message.append(request.getRequestURI());
        message.append(SPARATOR);
        //13. 来源页URL(urlencoded)
        message.append(LogUtil.castString(request.getHeader("Referer")));
        message.append(SPARATOR);
        //14. 用户终端(User-Agent urlencoded)
        message.append(LogUtil.castString(request.getHeader("User-Agent")));
        return message;
    }

    private static String castString(Object obj) {
        return obj == null ? "" : obj.toString();
    }

    private static int asciiSum(String str) {
        int sum = 0;
        if (StringUtils.isNotBlank(str)) {
            for (char c : str.toCharArray()) {
                sum += (int) c;
            }
        }
        return sum;
    }

}