LogUtil.java
4.27 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
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;
}
}