Commit ea245913781d6abcaab5195f0d447ceb89e7e885

Authored by 潘钊
1 parent 2987450f

操作日志

src/main/java/com/bsth/Application.java
@@ -16,7 +16,7 @@ import org.springframework.context.annotation.Primary; @@ -16,7 +16,7 @@ import org.springframework.context.annotation.Primary;
16 @SpringBootApplication 16 @SpringBootApplication
17 public class Application extends SpringBootServletInitializer { 17 public class Application extends SpringBootServletInitializer {
18 18
19 - public static ScheduledExecutorService mainServices = Executors.newScheduledThreadPool(11); 19 + public static ScheduledExecutorService mainServices = Executors.newScheduledThreadPool(12);
20 20
21 @Override 21 @Override
22 protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { 22 protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
src/main/java/com/bsth/ServiceStateTest.java
@@ -3,8 +3,8 @@ package com.bsth; @@ -3,8 +3,8 @@ package com.bsth;
3 public class ServiceStateTest { 3 public class ServiceStateTest {
4 4
5 public static void main(String[] args) { 5 public static void main(String[] args) {
6 - System.out.println("运营状态:" + getService(603979776));  
7 - System.out.println("上下行:" + getUpOrDown(603979776)); 6 + System.out.println("运营状态:" + getService(268435456));
  7 + System.out.println("上下行:" + getUpOrDown(268435456));
8 } 8 }
9 9
10 /** 10 /**
src/main/java/com/bsth/StartCommand.java
@@ -23,37 +23,6 @@ public class StartCommand implements CommandLineRunner{ @@ -23,37 +23,6 @@ public class StartCommand implements CommandLineRunner{
23 @Autowired 23 @Autowired
24 SecurityMetadataSourceService invocationSecurityMetadataSourceService; 24 SecurityMetadataSourceService invocationSecurityMetadataSourceService;
25 25
26 - //public static ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(8);  
27 -  
28 - /*@Autowired  
29 - GpsRealDataRefreshThread gpsRefreshThread;  
30 - @Autowired  
31 - GetSchedulePlanThread getSchedulePlanThread;  
32 - @Autowired  
33 - CommonRefreshThread commonRefreshThread;  
34 - @Autowired  
35 - DirectivePersistenceThread directivePersistenceThread;  
36 - @Autowired  
37 - SchedulePersistenceThread SchedulePersistenceThread;  
38 - @Autowired  
39 - ArrivalThread gpsArrivalStationThread;  
40 - @Autowired  
41 - FirstScheduleIssuedThread firstScheduleIssuedThread;  
42 -  
43 - @Autowired  
44 - DirectiveService directiveService;  
45 - @Autowired  
46 - DirectiveBuffer directiveBuffer;  
47 - @Autowired  
48 - CarConfigInfoRepository carConfigInfoRepository;  
49 -  
50 - @Autowired  
51 - GpsOfflineMonitorThread gpsOfflineMonitorThread;*/  
52 -  
53 - /*final static Long HOUR_TIME = 1000 * 60 * 60L;  
54 -  
55 - final static int HOUR_SECOND = 60 * 60;*/  
56 -  
57 @Override 26 @Override
58 public void run(String... arg0){ 27 public void run(String... arg0){
59 28
@@ -61,91 +30,6 @@ public class StartCommand implements CommandLineRunner{ @@ -61,91 +30,6 @@ public class StartCommand implements CommandLineRunner{
61 //启动时加载所有资源 30 //启动时加载所有资源
62 invocationSecurityMetadataSourceService.loadResourceDefine(); 31 invocationSecurityMetadataSourceService.loadResourceDefine();
63 32
64 - /**  
65 - * 车辆,设备,公司等常用的映射数据,每两小时刷新一次  
66 - *//*  
67 - commonRefreshThread.start();  
68 - scheduler.scheduleWithFixedDelay(commonRefreshThread, HOUR_SECOND * 2 , HOUR_SECOND * 2, TimeUnit.SECONDS);  
69 - //等映射数据加载完......睡一会吧  
70 - Thread.sleep(4000);  
71 -  
72 - *//**  
73 - * GPS实时数据更新 线程  
74 - * 每8秒和网关HTTP接口同步一次  
75 - *//*  
76 - scheduler.scheduleWithFixedDelay(gpsRefreshThread, 0, 8, TimeUnit.SECONDS);  
77 -  
78 - *//**  
79 - * GPS 监控设备掉线行为  
80 - * 每分钟检测一次  
81 - *//*  
82 - scheduler.scheduleWithFixedDelay(gpsOfflineMonitorThread, 60, 60, TimeUnit.SECONDS);  
83 -  
84 -  
85 - *//**  
86 - * 每天 凌晨 2 点 抓取当天实际排班  
87 - *//*  
88 - //启动时先run一次  
89 - getSchedulePlanThread.start();  
90 - scheduler.scheduleAtFixedRate(getSchedulePlanThread  
91 - , ((DateUtils.getTimesnight2() + HOUR_TIME * 2) - System.currentTimeMillis()) / 1000  
92 - , 60 * 60 * 24, TimeUnit.SECONDS);  
93 -  
94 - *//**  
95 - * 调度指令两分钟入库一次  
96 - * 指令会缓存在内存,直到收到所有响应再入库  
97 - *//*  
98 - //从数据库恢复初始数据  
99 - directiveBuffer.recovery();  
100 - scheduler.scheduleWithFixedDelay(directivePersistenceThread, 20, 60 * 2, TimeUnit.SECONDS);  
101 -  
102 - *//**  
103 - * 每分钟将有变更的班次入库(不包括子任务)  
104 - * 单纯为了提高 线调操作 的响应速度  
105 - *//*  
106 - scheduler.scheduleWithFixedDelay(SchedulePersistenceThread, 60 * 1, 60 * 1, TimeUnit.SECONDS);  
107 -  
108 - *//**  
109 - * 每15秒从数据库抓取到离站信息和班次匹配  
110 - * (网关生成的到离站数据也是延迟批量入库,所以缩短该线程执行周期并不会提高 “实际到离站” 的实时性)  
111 - *//*  
112 - scheduler.scheduleWithFixedDelay(gpsArrivalStationThread, 35, 15, TimeUnit.SECONDS);  
113 -  
114 - *//**  
115 - * 首个调度指令下发(2分钟运行一次)  
116 - * 每辆车的第一个调度指令由该线程下发  
117 - * 后续班次由 “实际终点到达” 事件触发指令下发  
118 - *//*  
119 - scheduler.scheduleWithFixedDelay(firstScheduleIssuedThread, 60 , 60 * 2, TimeUnit.SECONDS);  
120 - */  
121 -  
122 -/* new Timer().schedule(new TimerTask() {  
123 -  
124 - @Override  
125 - public void run() {  
126 - List<CarConfigInfo> ccis = carConfigInfoRepository.findAll();  
127 - Cars car;  
128 - Line line;  
129 - String lineCode;  
130 - System.out.println("ccis size: " + ccis.size());  
131 - for(CarConfigInfo cci : ccis){  
132 - car = cci.getCl();  
133 - line = cci.getXl();  
134 - lineCode = line.getLineCode();  
135 -  
136 - String data = directiveService.createDeviceRefreshData(CommonMapped.vehicDeviceBiMap.inverse().get(car.getInsideCode())  
137 - , Integer.parseInt(lineCode));  
138 - System.out.println(data);  
139 - int code = HttpUtils.postJson(data);  
140 - System.out.println("车辆:" + car.getInsideCode() + "刷新线路:" + line.getLineCode());  
141 - code = directiveService.lineChange(car.getInsideCode(), Integer.parseInt(lineCode));  
142 - //directiveService.send60Phrase(car.getInsideCode(), "");  
143 - System.out.println("返回值:" + code);  
144 - }  
145 -  
146 - }  
147 - }, 1000 * 10);*/  
148 -  
149 } catch (Exception e) { 33 } catch (Exception e) {
150 e.printStackTrace(); 34 e.printStackTrace();
151 } 35 }
src/main/java/com/bsth/WebAppConfiguration.java
@@ -2,18 +2,21 @@ package com.bsth; @@ -2,18 +2,21 @@ package com.bsth;
2 2
3 import javax.servlet.Filter; 3 import javax.servlet.Filter;
4 4
  5 +import org.springframework.beans.factory.annotation.Autowired;
5 import org.springframework.boot.context.embedded.FilterRegistrationBean; 6 import org.springframework.boot.context.embedded.FilterRegistrationBean;
6 import org.springframework.context.annotation.Bean; 7 import org.springframework.context.annotation.Bean;
7 import org.springframework.context.annotation.ComponentScan; 8 import org.springframework.context.annotation.ComponentScan;
8 import org.springframework.context.annotation.Configuration; 9 import org.springframework.context.annotation.Configuration;
9 import org.springframework.web.filter.CharacterEncodingFilter; 10 import org.springframework.web.filter.CharacterEncodingFilter;
10 import org.springframework.web.filter.HttpPutFormContentFilter; 11 import org.springframework.web.filter.HttpPutFormContentFilter;
  12 +import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
11 import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; 13 import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
12 import org.springframework.web.socket.config.annotation.EnableWebSocket; 14 import org.springframework.web.socket.config.annotation.EnableWebSocket;
13 import org.springframework.web.socket.config.annotation.WebSocketConfigurer; 15 import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
14 import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry; 16 import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;
15 17
16 import com.bsth.filter.ResourceFilter; 18 import com.bsth.filter.ResourceFilter;
  19 +import com.bsth.oplog.http.HttpOpLogInterceptor;
17 import com.bsth.websocket.WebSocketHandshakeInterceptor; 20 import com.bsth.websocket.WebSocketHandshakeInterceptor;
18 import com.bsth.websocket.handler.RealControlSocketHandler; 21 import com.bsth.websocket.handler.RealControlSocketHandler;
19 22
@@ -22,12 +25,12 @@ import com.bsth.websocket.handler.RealControlSocketHandler; @@ -22,12 +25,12 @@ import com.bsth.websocket.handler.RealControlSocketHandler;
22 @ComponentScan 25 @ComponentScan
23 public class WebAppConfiguration extends WebMvcConfigurerAdapter implements WebSocketConfigurer{ 26 public class WebAppConfiguration extends WebMvcConfigurerAdapter implements WebSocketConfigurer{
24 27
  28 + @Autowired
  29 + HttpOpLogInterceptor httpOpLogInterceptor;
  30 +
25 /** 31 /**
26 - *  
27 * @Title: httpPutFormContentFilter 32 * @Title: httpPutFormContentFilter
28 * @Description: TODO(弥补浏览器不支持PUT/DELETE,对携带 _method 参数的请求进行转换) 33 * @Description: TODO(弥补浏览器不支持PUT/DELETE,对携带 _method 参数的请求进行转换)
29 - * @return Filter 返回类型  
30 - * @throws  
31 */ 34 */
32 @Bean 35 @Bean
33 public Filter httpPutFormContentFilter() { 36 public Filter httpPutFormContentFilter() {
@@ -35,11 +38,8 @@ public class WebAppConfiguration extends WebMvcConfigurerAdapter implements WebS @@ -35,11 +38,8 @@ public class WebAppConfiguration extends WebMvcConfigurerAdapter implements WebS
35 } 38 }
36 39
37 /** 40 /**
38 - *  
39 * @Title: characterEncodingFilter 41 * @Title: characterEncodingFilter
40 * @Description: TODO(编码过滤器) 42 * @Description: TODO(编码过滤器)
41 - * @return Filter 返回类型  
42 - * @throws  
43 */ 43 */
44 @Bean 44 @Bean
45 public Filter characterEncodingFilter(){ 45 public Filter characterEncodingFilter(){
@@ -50,8 +50,6 @@ public class WebAppConfiguration extends WebMvcConfigurerAdapter implements WebS @@ -50,8 +50,6 @@ public class WebAppConfiguration extends WebMvcConfigurerAdapter implements WebS
50 * 50 *
51 * @Title: resourceFilterRegistration 51 * @Title: resourceFilterRegistration
52 * @Description: TODO(静态资源过滤器, 只处理 /pages 目录下的片段请求 ) 52 * @Description: TODO(静态资源过滤器, 只处理 /pages 目录下的片段请求 )
53 - * @return FilterRegistrationBean 返回类型  
54 - * @throws  
55 */ 53 */
56 @Bean 54 @Bean
57 public FilterRegistrationBean resourceFilterRegistration(){ 55 public FilterRegistrationBean resourceFilterRegistration(){
@@ -59,8 +57,18 @@ public class WebAppConfiguration extends WebMvcConfigurerAdapter implements WebS @@ -59,8 +57,18 @@ public class WebAppConfiguration extends WebMvcConfigurerAdapter implements WebS
59 registration.setFilter(new ResourceFilter()); 57 registration.setFilter(new ResourceFilter());
60 registration.addUrlPatterns("/pages/*"); 58 registration.addUrlPatterns("/pages/*");
61 return registration; 59 return registration;
62 - }  
63 - 60 + }
  61 +
  62 + /**
  63 + *
  64 + * @Title: addInterceptors
  65 + * @Description: TODO(HTTP结构化访问日志记录 )
  66 +
  67 + @Override
  68 + public void addInterceptors(InterceptorRegistry registry) {
  69 + registry.addInterceptor(httpOpLogInterceptor);
  70 + }*/
  71 +
64 @Override 72 @Override
65 public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { 73 public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
66 //线调webSocket 74 //线调webSocket
src/main/java/com/bsth/data/BasicData.java
@@ -20,6 +20,7 @@ import com.bsth.entity.Line; @@ -20,6 +20,7 @@ import com.bsth.entity.Line;
20 import com.bsth.entity.Station; 20 import com.bsth.entity.Station;
21 import com.bsth.entity.StationRoute; 21 import com.bsth.entity.StationRoute;
22 import com.bsth.entity.schedule.CarConfigInfo; 22 import com.bsth.entity.schedule.CarConfigInfo;
  23 +import com.bsth.oplog.normal.OpLogger;
23 import com.bsth.repository.CarParkRepository; 24 import com.bsth.repository.CarParkRepository;
24 import com.bsth.repository.CarsRepository; 25 import com.bsth.repository.CarsRepository;
25 import com.bsth.repository.LineRepository; 26 import com.bsth.repository.LineRepository;
@@ -100,6 +101,8 @@ public class BasicData implements CommandLineRunner{ @@ -100,6 +101,8 @@ public class BasicData implements CommandLineRunner{
100 @Autowired 101 @Autowired
101 StationRouteRepository stationRouteRepository; 102 StationRouteRepository stationRouteRepository;
102 103
  104 + @Autowired
  105 + OpLogger opLog;
103 106
104 @Override 107 @Override
105 public void run() { 108 public void run() {
@@ -119,6 +122,8 @@ public class BasicData implements CommandLineRunner{ @@ -119,6 +122,8 @@ public class BasicData implements CommandLineRunner{
119 122
120 loadStationRouteInfo(); 123 loadStationRouteInfo();
121 logger.info("加载基础数据成功!," ); 124 logger.info("加载基础数据成功!," );
  125 +
  126 + opLog.info("load_basic");
122 }catch(Exception e){ 127 }catch(Exception e){
123 logger.error("加载基础数据时出现异常," , e); 128 logger.error("加载基础数据时出现异常," , e);
124 } 129 }
src/main/java/com/bsth/oplog/Level.java 0 → 100644
  1 +package com.bsth.oplog;
  2 +
  3 +public enum Level {
  4 +
  5 + ERROR,WARN,INFO,ACCESS;
  6 +}
src/main/java/com/bsth/oplog/Log.java 0 → 100644
  1 +package com.bsth.oplog;
  2 +
  3 +import java.util.Date;
  4 +
  5 +public class Log {
  6 +
  7 + private String userName;
  8 +
  9 + private Long timestamp;
  10 +
  11 + private String type;
  12 +
  13 + private String level;
  14 +
  15 + private String path;
  16 +
  17 + private String serverIp;
  18 +
  19 + private String clientIp;
  20 +
  21 + private String httpData;
  22 +
  23 + private Date month;
  24 +
  25 + private String callerClass;
  26 +
  27 + private String callerMethod;
  28 +
  29 + private Integer lineNumber;
  30 +
  31 + public String getPath() {
  32 + return path;
  33 + }
  34 +
  35 + public void setPath(String path) {
  36 + this.path = path;
  37 + }
  38 +
  39 + public String getServerIp() {
  40 + return serverIp;
  41 + }
  42 +
  43 + public void setServerIp(String serverIp) {
  44 + this.serverIp = serverIp;
  45 + }
  46 +
  47 + public String getHttpData() {
  48 + return httpData;
  49 + }
  50 +
  51 + public void setHttpData(String httpData) {
  52 + this.httpData = httpData;
  53 + }
  54 +
  55 + public Date getMonth() {
  56 + return month;
  57 + }
  58 +
  59 + public void setMonth(Date month) {
  60 + this.month = month;
  61 + }
  62 +
  63 + public String getType() {
  64 + return type;
  65 + }
  66 +
  67 + public void setType(String type) {
  68 + this.type = type;
  69 + }
  70 +
  71 + public String getLevel() {
  72 + return level;
  73 + }
  74 +
  75 + public void setLevel(String level) {
  76 + this.level = level;
  77 + }
  78 +
  79 + public String getCallerClass() {
  80 + return callerClass;
  81 + }
  82 +
  83 + public void setCallerClass(String callerClass) {
  84 + this.callerClass = callerClass;
  85 + }
  86 +
  87 + public String getCallerMethod() {
  88 + return callerMethod;
  89 + }
  90 +
  91 + public void setCallerMethod(String callerMethod) {
  92 + this.callerMethod = callerMethod;
  93 + }
  94 +
  95 + public String getClientIp() {
  96 + return clientIp;
  97 + }
  98 +
  99 + public void setClientIp(String clientIp) {
  100 + this.clientIp = clientIp;
  101 + }
  102 +
  103 + public String getUserName() {
  104 + return userName;
  105 + }
  106 +
  107 + public void setUserName(String userName) {
  108 + this.userName = userName;
  109 + }
  110 +
  111 + public Long getTimestamp() {
  112 + return timestamp;
  113 + }
  114 +
  115 + public void setTimestamp(Long timestamp) {
  116 + this.timestamp = timestamp;
  117 + }
  118 +
  119 + public Integer getLineNumber() {
  120 + return lineNumber;
  121 + }
  122 +
  123 + public void setLineNumber(Integer lineNumber) {
  124 + this.lineNumber = lineNumber;
  125 + }
  126 +}
src/main/java/com/bsth/oplog/Type.java 0 → 100644
  1 +package com.bsth.oplog;
  2 +
  3 +public enum Type {
  4 +
  5 + HTTP_GET,HTTP_POST,HTTP_DELETE,HTTP_PUT,NORMAL
  6 +}
src/main/java/com/bsth/oplog/db/DBHelper.java 0 → 100644
  1 +package com.bsth.oplog.db;
  2 +
  3 +import java.util.LinkedList;
  4 +import java.util.concurrent.TimeUnit;
  5 +
  6 +import org.springframework.beans.factory.annotation.Autowired;
  7 +import org.springframework.boot.CommandLineRunner;
  8 +import org.springframework.stereotype.Component;
  9 +
  10 +import com.bsth.Application;
  11 +import com.bsth.oplog.Log;
  12 +import com.bsth.oplog.db.mysql.DBPersistence;
  13 +
  14 +//@Component
  15 +public class DBHelper implements CommandLineRunner{
  16 +
  17 + private final static int maxBufSize = 1000;
  18 + private final static int fixedMinute = 1;
  19 +
  20 + private static LinkedList<Log> buffer = new LinkedList<>();
  21 +
  22 + @Autowired
  23 + private FixedTimePersistenceThread fixedTimeThread;
  24 +
  25 + public void save(Log log){
  26 + buffer.add(log);
  27 +
  28 + if(buffer.size() >= maxBufSize)
  29 + fixedTimeThread.start();
  30 + }
  31 +
  32 + @Component
  33 + public static class FixedTimePersistenceThread extends Thread{
  34 +
  35 + @Autowired
  36 + DBPersistence persistence;
  37 +
  38 + @Override
  39 + public void run() {
  40 + persistence.batchSave(buffer);
  41 + }
  42 + }
  43 +
  44 + @Override
  45 + public void run(String... arg0) throws Exception {
  46 + Application.mainServices.scheduleWithFixedDelay(fixedTimeThread, fixedMinute, fixedMinute, TimeUnit.MINUTES);
  47 + }
  48 +}
src/main/java/com/bsth/oplog/db/mysql/DBPersistence.java 0 → 100644
  1 +package com.bsth.oplog.db.mysql;
  2 +
  3 +import java.sql.Date;
  4 +import java.sql.PreparedStatement;
  5 +import java.sql.SQLException;
  6 +import java.util.ArrayList;
  7 +import java.util.LinkedList;
  8 +import java.util.List;
  9 +
  10 +import org.slf4j.Logger;
  11 +import org.slf4j.LoggerFactory;
  12 +import org.springframework.beans.factory.annotation.Autowired;
  13 +import org.springframework.jdbc.core.BatchPreparedStatementSetter;
  14 +import org.springframework.jdbc.core.JdbcTemplate;
  15 +import org.springframework.stereotype.Component;
  16 +
  17 +import com.bsth.oplog.Log;
  18 +
  19 +/**
  20 + *
  21 + * @ClassName: DBPersistence
  22 + * @Description: TODO(mysql 批量入库)
  23 + * @author PanZhao
  24 + * @date 2016年10月20日 上午9:44:00
  25 + *
  26 + */
  27 +@Component
  28 +public class DBPersistence {
  29 +
  30 + @Autowired
  31 + JdbcTemplate jdbcTemplate;
  32 +
  33 + Logger logger = LoggerFactory.getLogger(DBPersistence.class);
  34 +
  35 + public void batchSave(LinkedList<Log> list){
  36 + String sql = "insert into bsth_c_sys_op_log"
  37 + + "(timestamp, path, type,level, caller_class, caller_method, user_name, client_ip, server_ip, month, http_data, line_number)"
  38 + + " values(?,?,?,?,?,?,?,?,?,?,?,?)";
  39 +
  40 +
  41 + List<Log> saveList = new ArrayList<>(list.size());
  42 + Log log;
  43 + while(true){
  44 + log = list.poll();
  45 + if(log != null)
  46 + saveList.add(log);
  47 + else
  48 + break;
  49 + }
  50 +
  51 + Date month = new Date(System.currentTimeMillis());
  52 +
  53 + try {
  54 + jdbcTemplate.batchUpdate(sql, new LogBatchPreparedStatementSetter(saveList, month));
  55 + } catch (Exception e) {
  56 + logger.error("操作日志入库失败", e);
  57 + }
  58 + }
  59 +
  60 + private class LogBatchPreparedStatementSetter implements BatchPreparedStatementSetter{
  61 +
  62 + List<Log> temList;
  63 + Date month;
  64 +
  65 + public LogBatchPreparedStatementSetter(final List<Log> list, Date month){
  66 + this.temList = list;
  67 + this.month = month;
  68 + }
  69 +
  70 + @Override
  71 + public void setValues(PreparedStatement ps, int i) throws SQLException {
  72 + Log log = temList.get(i);
  73 + ps.setLong(1, log.getTimestamp());
  74 + ps.setString(2, log.getPath());
  75 + ps.setString(3, log.getType());
  76 + ps.setString(4, log.getLevel());
  77 + ps.setString(5, log.getCallerClass());
  78 + ps.setString(6, log.getCallerMethod());
  79 + ps.setString(7, log.getUserName());
  80 + ps.setString(8, log.getClientIp());
  81 + ps.setString(9, log.getServerIp());
  82 + ps.setDate(10, month);
  83 + ps.setString(11, log.getHttpData());
  84 + ps.setObject(12, log.getLineNumber());
  85 + }
  86 +
  87 + @Override
  88 + public int getBatchSize() {
  89 + return temList.size();
  90 + }
  91 + }
  92 +}
src/main/java/com/bsth/oplog/db/mysql/db.sql 0 → 100644
  1 +CREATE TABLE `bsth_c_sys_op_log` (
  2 +`timestamp` bigint(20) NOT NULL ,
  3 +`user_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
  4 +`caller_class` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
  5 +`caller_method` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
  6 +`client_ip` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
  7 +`http_data` longtext CHARACTER SET utf8 COLLATE utf8_general_ci NULL ,
  8 +`level` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
  9 +`month` date NOT NULL ,
  10 +`path` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
  11 +`server_ip` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
  12 +`type` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  13 +`line_number` int(11) NULL DEFAULT NULL
  14 +)
  15 +ENGINE=InnoDB
  16 +DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci
  17 +ROW_FORMAT=DYNAMIC
  18 +
  19 +PARTITION BY RANGE(TO_DAYS (month))
  20 +(
  21 +PARTITION p201610 VALUES LESS THAN (TO_DAYS('2016-11-01')),
  22 +PARTITION p201611 VALUES LESS THAN (TO_DAYS('2016-12-01')),
  23 +PARTITION p201612 VALUES LESS THAN (TO_DAYS('2017-01-01')),
  24 +
  25 +PARTITION p201701 VALUES LESS THAN (TO_DAYS('2017-02-01')),
  26 +PARTITION p201702 VALUES LESS THAN (TO_DAYS('2017-03-01')),
  27 +PARTITION p201703 VALUES LESS THAN (TO_DAYS('2017-04-01')),
  28 +PARTITION p201704 VALUES LESS THAN (TO_DAYS('2017-05-01')),
  29 +PARTITION p201705 VALUES LESS THAN (TO_DAYS('2017-06-01')),
  30 +PARTITION p201706 VALUES LESS THAN (TO_DAYS('2017-07-01')),
  31 +PARTITION p201707 VALUES LESS THAN (TO_DAYS('2017-08-01')),
  32 +PARTITION p201708 VALUES LESS THAN (TO_DAYS('2017-09-01')),
  33 +PARTITION p201709 VALUES LESS THAN (TO_DAYS('2017-10-01')),
  34 +PARTITION p201710 VALUES LESS THAN (TO_DAYS('2017-11-01')),
  35 +PARTITION p201711 VALUES LESS THAN (TO_DAYS('2017-12-01')),
  36 +PARTITION p201712 VALUES LESS THAN (TO_DAYS('2018-01-01')),
  37 +
  38 +
  39 +PARTITION p201801 VALUES LESS THAN (TO_DAYS('2018-02-01')),
  40 +PARTITION p201802 VALUES LESS THAN (TO_DAYS('2018-03-01')),
  41 +PARTITION p201803 VALUES LESS THAN (TO_DAYS('2018-04-01')),
  42 +PARTITION p201804 VALUES LESS THAN (TO_DAYS('2018-05-01')),
  43 +PARTITION p201805 VALUES LESS THAN (TO_DAYS('2018-06-01')),
  44 +PARTITION p201806 VALUES LESS THAN (TO_DAYS('2018-07-01')),
  45 +PARTITION p201807 VALUES LESS THAN (TO_DAYS('2018-08-01')),
  46 +PARTITION p201808 VALUES LESS THAN (TO_DAYS('2018-09-01')),
  47 +PARTITION p201809 VALUES LESS THAN (TO_DAYS('2018-10-01')),
  48 +PARTITION p201810 VALUES LESS THAN (TO_DAYS('2018-11-01')),
  49 +PARTITION p201811 VALUES LESS THAN (TO_DAYS('2018-12-01')),
  50 +PARTITION p201812 VALUES LESS THAN (TO_DAYS('2019-01-01')),
  51 +
  52 +PARTITION p201901 VALUES LESS THAN (TO_DAYS('2019-02-01')),
  53 +PARTITION p201902 VALUES LESS THAN (TO_DAYS('2019-03-01')),
  54 +PARTITION p201903 VALUES LESS THAN (TO_DAYS('2019-04-01')),
  55 +PARTITION p201904 VALUES LESS THAN (TO_DAYS('2019-05-01')),
  56 +PARTITION p201905 VALUES LESS THAN (TO_DAYS('2019-06-01')),
  57 +PARTITION p201906 VALUES LESS THAN (TO_DAYS('2019-07-01')),
  58 +PARTITION p201907 VALUES LESS THAN (TO_DAYS('2019-08-01')),
  59 +PARTITION p201908 VALUES LESS THAN (TO_DAYS('2019-09-01')),
  60 +PARTITION p201909 VALUES LESS THAN (TO_DAYS('2019-10-01')),
  61 +PARTITION p201910 VALUES LESS THAN (TO_DAYS('2019-11-01')),
  62 +PARTITION p201911 VALUES LESS THAN (TO_DAYS('2019-12-01')),
  63 +PARTITION p201912 VALUES LESS THAN (TO_DAYS('2020-01-01'))
  64 +
  65 +
  66 +);
  67 +
src/main/java/com/bsth/oplog/http/HttpOpLogInterceptor.java 0 → 100644
  1 +package com.bsth.oplog.http;
  2 +
  3 +import javax.servlet.http.HttpServletRequest;
  4 +import javax.servlet.http.HttpServletResponse;
  5 +
  6 +import org.springframework.beans.factory.annotation.Autowired;
  7 +import org.springframework.stereotype.Component;
  8 +import org.springframework.util.AntPathMatcher;
  9 +import org.springframework.util.PathMatcher;
  10 +import org.springframework.web.method.HandlerMethod;
  11 +import org.springframework.web.servlet.HandlerInterceptor;
  12 +import org.springframework.web.servlet.ModelAndView;
  13 +
  14 +/**
  15 + *
  16 + * @ClassName: HttpOpLogger
  17 + * @Description: TODO(HTTP 接口日志拦截器)
  18 + * @author PanZhao
  19 + * @date 2016年10月20日 上午12:03:11
  20 + *
  21 + */
  22 +@Component
  23 +public class HttpOpLogInterceptor implements HandlerInterceptor {
  24 +
  25 + private final PathMatcher pathMatcher = new AntPathMatcher();
  26 +
  27 + // GET 白名单
  28 + private String[] httpGetWhiteList = { "/user/login/**", "/user/currentUser", "/dictionary/**", "/module/findByCurrentUser" };
  29 +
  30 + // POST 白名单
  31 + private String[] httpPostWhiteList = {
  32 +
  33 + };
  34 +
  35 + @Autowired
  36 + HttpRecorder httpRecorder;
  37 +
  38 + @Override
  39 + public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object arg2, Exception arg3)
  40 + throws Exception {
  41 +
  42 + }
  43 +
  44 + @Override
  45 + public void postHandle(HttpServletRequest request, HttpServletResponse response, Object arg2, ModelAndView arg3)
  46 + throws Exception {
  47 +
  48 + String method = request.getMethod(), path = request.getRequestURI();
  49 + // white list
  50 + String[] whiteList = method == "GET" ? httpGetWhiteList : httpPostWhiteList;
  51 +
  52 + if (!isWhiteURL(whiteList, path))
  53 + httpRecorder.record(request, (HandlerMethod)arg2);
  54 + }
  55 +
  56 + @Override
  57 + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {
  58 +
  59 + return true;
  60 + }
  61 +
  62 + private boolean isWhiteURL(String[] whiteList, String currentURL) {
  63 + for (String whiteURL : whiteList) {
  64 + if (pathMatcher.match(whiteURL, currentURL)) {
  65 + return true;
  66 + }
  67 + }
  68 + return false;
  69 + }
  70 +}
src/main/java/com/bsth/oplog/http/HttpRecorder.java 0 → 100644
  1 +package com.bsth.oplog.http;
  2 +
  3 +import java.lang.reflect.Method;
  4 +import java.net.InetAddress;
  5 +import java.net.UnknownHostException;
  6 +
  7 +import javax.servlet.http.HttpServletRequest;
  8 +
  9 +import org.slf4j.Logger;
  10 +import org.slf4j.LoggerFactory;
  11 +import org.springframework.beans.factory.annotation.Autowired;
  12 +import org.springframework.stereotype.Component;
  13 +import org.springframework.web.method.HandlerMethod;
  14 +
  15 +import com.alibaba.fastjson.JSON;
  16 +import com.bsth.entity.sys.SysUser;
  17 +import com.bsth.oplog.Level;
  18 +import com.bsth.oplog.Log;
  19 +import com.bsth.oplog.Type;
  20 +import com.bsth.oplog.db.DBHelper;
  21 +import com.bsth.security.util.SecurityUtils;
  22 +import com.bsth.util.IpUtils;
  23 +
  24 +/**
  25 + *
  26 + * @ClassName: HttpRecorder
  27 + * @Description: TODO(HTTP 日志记录器)
  28 + * @author PanZhao
  29 + * @date 2016年10月20日 下午12:56:56
  30 + *
  31 + */
  32 +@Component
  33 +public class HttpRecorder {
  34 +
  35 + Logger logger = LoggerFactory.getLogger(HttpRecorder.class);
  36 +
  37 + private final static int httpDataMaxLen = 500;
  38 +
  39 + @Autowired
  40 + DBHelper persistenceBuff;
  41 +
  42 + public void record(HttpServletRequest request, HandlerMethod method){
  43 + Log log = new Log();
  44 +
  45 + Type type = null;
  46 + switch (request.getMethod()) {
  47 + case "GET":
  48 + type = Type.HTTP_GET;
  49 + break;
  50 + case "POST":
  51 + type = Type.HTTP_POST;
  52 + break;
  53 + case "DELETE":
  54 + type = Type.HTTP_DELETE;
  55 + break;
  56 + case "PUT":
  57 + type = Type.HTTP_PUT;
  58 + break;
  59 + }
  60 + log.setType(type.toString());
  61 + log.setLevel(Level.INFO.toString());
  62 + try {
  63 + log.setServerIp(InetAddress.getLocalHost().getHostAddress());
  64 + } catch (UnknownHostException e) {
  65 + e.printStackTrace();
  66 + }
  67 +
  68 + log.setPath(request.getRequestURI());
  69 + //Caller
  70 + Method refMethod = method.getMethod();
  71 + log.setCallerClass(refMethod.getDeclaringClass().getName());
  72 + log.setCallerMethod(refMethod.getName());
  73 +
  74 + //Primary Key
  75 + log.setTimestamp(System.currentTimeMillis());
  76 +
  77 + SysUser user = SecurityUtils.getCurrentUser();
  78 + if(user != null)
  79 + log.setUserName(user.getUserName());
  80 + //request
  81 + log.setClientIp(IpUtils.getIpAddr(request));
  82 + log.setHttpData(httpData(request));
  83 +
  84 + //save
  85 + persistenceBuff.save(log);
  86 + }
  87 +
  88 + private String httpData(HttpServletRequest request){
  89 + String rs = JSON.toJSONString(request.getParameterMap());
  90 +
  91 + if(rs.length() > httpDataMaxLen)
  92 + rs = rs.substring(0, httpDataMaxLen);
  93 +
  94 + return rs.replaceAll("\"", "‘");
  95 + }
  96 +}
src/main/java/com/bsth/oplog/normal/OpLogger.java 0 → 100644
  1 +package com.bsth.oplog.normal;
  2 +
  3 +import java.net.InetAddress;
  4 +import java.net.UnknownHostException;
  5 +
  6 +import javax.servlet.http.HttpServletRequest;
  7 +
  8 +import org.springframework.beans.factory.annotation.Autowired;
  9 +import org.springframework.stereotype.Component;
  10 +
  11 +import com.bsth.entity.sys.SysUser;
  12 +import com.bsth.oplog.Log;
  13 +import com.bsth.oplog.Type;
  14 +import com.bsth.oplog.db.DBHelper;
  15 +import com.bsth.security.util.SecurityUtils;
  16 +import com.bsth.util.IpUtils;
  17 +
  18 +/**
  19 + *
  20 + * @ClassName: OpLogger
  21 + * @Description: TODO(常规的操作日志记录器)
  22 + * @author PanZhao
  23 + * @date 2016年10月21日 上午12:52:30
  24 + *
  25 + */
  26 +@Component
  27 +public class OpLogger {
  28 +
  29 + @Autowired
  30 + DBHelper dbHelper;
  31 +
  32 + public void info(String path){
  33 + save(getInitLog(path));
  34 + }
  35 +
  36 + public void info(String path, HttpServletRequest request){
  37 + Log log = getInitLog(path);
  38 +
  39 + if(request != null){
  40 + SysUser user = SecurityUtils.getCurrentUser();
  41 + if(user != null)
  42 + log.setUserName(user.getUserName());
  43 +
  44 + log.setClientIp(IpUtils.getIpAddr(request));
  45 + }
  46 +
  47 + save(log);
  48 + }
  49 +
  50 + public void info(String path, HttpServletRequest request, String description){
  51 +
  52 + }
  53 +
  54 + public static Log getInitLog(String path){
  55 + Log log = new Log();
  56 + log.setTimestamp(System.currentTimeMillis());
  57 + log.setPath(path);
  58 + log.setType(Type.NORMAL.toString());
  59 +
  60 + //get caller
  61 + StackTraceElement[] stack = (new Throwable()).getStackTrace();
  62 + //注意调用链的顺序,此时2为实际调用者
  63 + StackTraceElement caller = stack[2];
  64 +
  65 + log.setCallerClass(caller.getClassName());
  66 + log.setCallerMethod(caller.getMethodName());
  67 + log.setLineNumber(caller.getLineNumber());
  68 +
  69 + try {
  70 + log.setServerIp(InetAddress.getLocalHost().getHostAddress());
  71 + } catch (UnknownHostException e) {
  72 + e.printStackTrace();
  73 + }
  74 +
  75 + return log;
  76 + }
  77 +
  78 + public void save(Log log){
  79 + dbHelper.save(log);
  80 + }
  81 +}
src/main/java/com/bsth/security/SecurityMetadataSourceService.java
@@ -66,8 +66,6 @@ public class SecurityMetadataSourceService implements @@ -66,8 +66,6 @@ public class SecurityMetadataSourceService implements
66 String method = invocation.getRequest().getMethod(); 66 String method = invocation.getRequest().getMethod();
67 String url = method.toLowerCase() + "#" + invocation.getRequestUrl(); 67 String url = method.toLowerCase() + "#" + invocation.getRequestUrl();
68 68
69 - System.out.println(url);  
70 -  
71 int symIndex = url.indexOf("?"); 69 int symIndex = url.indexOf("?");
72 if(symIndex != -1){ 70 if(symIndex != -1){
73 url = url.substring(0, symIndex); 71 url = url.substring(0, symIndex);