diff --git a/logkuangjia/.gitignore b/logkuangjia/.gitignore new file mode 100644 index 0000000..682d4ed --- /dev/null +++ b/logkuangjia/.gitignore @@ -0,0 +1,27 @@ +# Created by .ignore support plugin (hsz.mobi) +### Java template +# Compiled class file +*.class + +# Log file +*.log + +# BlueJ files +*.ctxt + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files # +*.jar +*.war +*.nar +*.ear +*.zip +*.tar.gz +*.rar + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* +/.idea/ +/target/ diff --git a/logkuangjia/pom.xml b/logkuangjia/pom.xml new file mode 100644 index 0000000..d37e9b7 --- /dev/null +++ b/logkuangjia/pom.xml @@ -0,0 +1,202 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.3.9.RELEASE + + + + com.ayi + woniu-web + 0.0.1-SNAPSHOT + woniu-web + create by woniu + + jar + + + 1.8 + + + + + + com.baomidou + mybatis-plus-boot-starter + 3.5.2 + + + com.github.rholder + guava-retrying + 2.0.0 + + + + com.google.guava + guava + 29.0-jre + + + + org.lionsoul + ip2region + 2.7.0 + + + + org.springframework.boot + spring-boot-starter-aop + + + cn.hutool + hutool-all + 5.3.3 + + + org.springframework.boot + spring-boot-starter + + + org.springframework.boot + spring-boot-starter-web + + + + + org.springframework.boot + spring-boot-starter-test + + + + org.projectlombok + lombok + + + org.springframework.boot + spring-boot-starter-cache + + + + io.springfox + springfox-swagger2 + 2.9.2 + + + + io.springfox + springfox-swagger-ui + 2.9.2 + + + + + + + + + + + + com.alibaba + druid-spring-boot-starter + 1.2.18 + + + + + + + + mysql + mysql-connector-java + 8.0.29 + + + + com.alipay.sofa + runtime-sofa-boot-starter + 3.18.0 + + + + org.springframework.boot + spring-boot-starter-validation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + com.github.ben-manes.caffeine + caffeine + 2.9.3 + + + + com.alibaba + fastjson + 1.2.76 + + + com.alibaba + easyexcel + 3.0.5 + + + org.testng + testng + RELEASE + compile + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/logkuangjia/src/main/java/com/woniu/WoNiuApplication.java b/logkuangjia/src/main/java/com/woniu/WoNiuApplication.java new file mode 100644 index 0000000..6cb5f1c --- /dev/null +++ b/logkuangjia/src/main/java/com/woniu/WoNiuApplication.java @@ -0,0 +1,21 @@ +package com.woniu; + +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; + + +@SpringBootApplication +@MapperScan("com.woniu.logger.mapper") +@EnableAsync +@EnableScheduling +public class WoNiuApplication { + + public static void main(String[] args) { + SpringApplication.run(WoNiuApplication.class, args); + } + + +} diff --git a/logkuangjia/src/main/java/com/woniu/controller/IdGeneratorController.java b/logkuangjia/src/main/java/com/woniu/controller/IdGeneratorController.java new file mode 100644 index 0000000..3ccd117 --- /dev/null +++ b/logkuangjia/src/main/java/com/woniu/controller/IdGeneratorController.java @@ -0,0 +1,34 @@ +package com.woniu.controller; + +import com.woniu.service.RedisIdempotentStorage; +import com.woniu.utils.IdGeneratorUtil; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; + +/** + * 一个注解,优雅的实现接口幂等性! + * + * 关键因素1 + * 幂等唯一标识,就是客户端与服务端一次请求时的唯一标识,一般情况下由客户端来生成,也可以让第三方来统一分配。 + * + * 关键因素2 + * 有了唯一标识以后,服务端只需要确保这个唯一标识只被使用一次即可,一种常见的方式就是利用数据库的唯一索引。 + */ +@RestController +@RequestMapping("/generate") +public class IdGeneratorController { + @Resource + private RedisIdempotentStorage redisIdempotentStorage; + + @RequestMapping("/getIdGeneratorToken") + @ResponseBody + public String getIdGeneratorToken() { + String generateId = IdGeneratorUtil.generateId(); + redisIdempotentStorage.save(generateId); + return generateId; + } + +} diff --git a/logkuangjia/src/main/java/com/woniu/controller/OrderController.java b/logkuangjia/src/main/java/com/woniu/controller/OrderController.java new file mode 100644 index 0000000..99e6410 --- /dev/null +++ b/logkuangjia/src/main/java/com/woniu/controller/OrderController.java @@ -0,0 +1,20 @@ +package com.woniu.controller; + +import com.woniu.req.Order; +import com.woniu.req.RequestData; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/order") +public class OrderController { + + @RequestMapping("/saveOrder") + public String saveOrder(@RequestBody RequestData requestData) { + return "success"; + } + + + +} \ No newline at end of file diff --git a/logkuangjia/src/main/java/com/woniu/controller/TestController.java b/logkuangjia/src/main/java/com/woniu/controller/TestController.java new file mode 100644 index 0000000..fc17cbc --- /dev/null +++ b/logkuangjia/src/main/java/com/woniu/controller/TestController.java @@ -0,0 +1,15 @@ +package com.woniu.controller; + + +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/test") +public class TestController { + + @RequestMapping("/hello") + public String hello() { + return "success"; + } +} diff --git a/logkuangjia/src/main/java/com/woniu/logger/LoggerInfoApplicationListener.java b/logkuangjia/src/main/java/com/woniu/logger/LoggerInfoApplicationListener.java new file mode 100644 index 0000000..7ddc200 --- /dev/null +++ b/logkuangjia/src/main/java/com/woniu/logger/LoggerInfoApplicationListener.java @@ -0,0 +1,66 @@ +package com.woniu.logger; + + +import com.baomidou.mybatisplus.annotation.DbType; +import com.baomidou.mybatisplus.extension.toolkit.JdbcUtils; + +import com.woniu.logger.conf.LoggerConfig; +import com.woniu.logger.sql.DdlSqlFactory; +import com.woniu.logger.sql.IDdlSql; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; +import org.springframework.stereotype.Component; + +import javax.sql.DataSource; +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; + +/** + * 功能描述: 日志信息启动执行
+ * 日志备份,创建日志表等操作 + */ +@Component +public class LoggerInfoApplicationListener implements CommandLineRunner { + + @Autowired + private DataSource dataSource; + @Autowired + private LoggerConfig loggerConfig; + private IDdlSql ddl; + + @Override + public void run(String... args) throws Exception { + // 判断数据库类型 + Connection conn = dataSource.getConnection(); + try (Statement statement = conn.createStatement()) { + DbType dbType = JdbcUtils.getDbType(conn.getMetaData().getURL()); + ddl = DdlSqlFactory.valueOf(dbType.name()).getDdl(); + // 查询表有没有存在 + if (!existTable(statement)) { + createTable(statement); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + /** + * 功能描述: 建表
+ */ + private void createTable(Statement statement) throws SQLException { + statement.execute(ddl.createTable()); + } + + + /** + * 功能描述: 是否存在表
+ */ + private boolean existTable(Statement statement) throws SQLException { + ResultSet resultSet = statement.executeQuery(ddl.queryTable("")); + resultSet.next(); + return resultSet.getInt(1) == 1; + } + +} diff --git a/logkuangjia/src/main/java/com/woniu/logger/LoggerInfoBackTask.java b/logkuangjia/src/main/java/com/woniu/logger/LoggerInfoBackTask.java new file mode 100644 index 0000000..49661b0 --- /dev/null +++ b/logkuangjia/src/main/java/com/woniu/logger/LoggerInfoBackTask.java @@ -0,0 +1,77 @@ +package com.woniu.logger; +import cn.hutool.core.date.DatePattern; +import cn.hutool.core.date.DateUtil; +import com.baomidou.mybatisplus.annotation.DbType; +import com.baomidou.mybatisplus.extension.toolkit.JdbcUtils; + +import com.woniu.logger.conf.LoggerConfig; +import com.woniu.logger.conf.LoggerLevelEnum; +import com.woniu.logger.sql.DdlSqlFactory; +import com.woniu.logger.sql.IDdlSql; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import javax.sql.DataSource; +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; + + + +/** + * 功能描述: 日志备份任务
+ */ +@Component +public class LoggerInfoBackTask { + + @Autowired + private DataSource dataSource; + @Autowired + private LoggerConfig loggerConfig; + + private IDdlSql ddl; + + /** + * 功能描述: 每天0点1秒开始执行备份表(确定日期)
+ */ + @Scheduled(cron = "1 0 0 * * ?") + public void backTask() throws Throwable { + if (LoggerLevelEnum.NONE.equals(loggerConfig.getLevel())) { + return; + } + Connection conn = dataSource.getConnection(); + try (Statement statement = conn.createStatement()) { + DbType dbType = JdbcUtils.getDbType(conn.getMetaData().getURL()); + ddl = DdlSqlFactory.valueOf(dbType.name()).getDdl(); + String yesterday = DateUtil.format(DateUtil.yesterday(), DatePattern.PURE_DATE_FORMAT); + // 查询表有没有存在 + if (!existTable(statement, yesterday)) { + backTable(statement, yesterday); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + /** + * 功能描述: 每日备份操作
+ */ + public void backTable(Statement statement, String yesterday) throws SQLException { + // 先备份 + statement.execute(ddl.backTable(yesterday)); + // 再创建表 + statement.execute(ddl.createTable()); + } + + /** + * 功能描述: 是否存在表
+ */ + private boolean existTable(Statement statement, String yesterday) throws SQLException { + ResultSet resultSet = statement.executeQuery(ddl.queryTable(yesterday)); + resultSet.next(); + return resultSet.getInt(1) == 1; + } + +} diff --git a/logkuangjia/src/main/java/com/woniu/logger/aspect/RequestLogAspect.java b/logkuangjia/src/main/java/com/woniu/logger/aspect/RequestLogAspect.java new file mode 100644 index 0000000..4599779 --- /dev/null +++ b/logkuangjia/src/main/java/com/woniu/logger/aspect/RequestLogAspect.java @@ -0,0 +1,90 @@ +package com.woniu.logger.aspect; + + +import cn.hutool.core.net.NetUtil; +import cn.hutool.json.JSONUtil; + +import com.woniu.logger.conf.LoggerConfig; +import com.woniu.logger.conf.LoggerLevelEnum; +import com.woniu.logger.entity.LoggerInfoEntity; +import com.woniu.logger.service.ILoggerInfoService; +import com.woniu.logger.util.HttpRequestUtil; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import javax.servlet.http.HttpServletRequest; +import java.util.Optional; + +/** + * 功能描述: 日志切面
+ * 请求与响应参数日志记录框架 + */ +@Order(99) +@Aspect +@Component +public class RequestLogAspect { + + @Autowired + private LoggerConfig loggerConfig; + @Autowired + private ILoggerInfoService loggerInfoService; + + @Around("execution(* com.woniu.controller..*.*(..))") + public Object doAround(ProceedingJoinPoint point) throws Throwable { + // 如果没有开启,则直接返回 + if (LoggerLevelEnum.NONE.equals(loggerConfig.getLevel())) { + return point.proceed(); + } + long startTime = System.currentTimeMillis(); + LoggerInfoEntity info = new LoggerInfoEntity(); + // 设置url + info.setUrl(Optional.ofNullable((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).map(ServletRequestAttributes::getRequest).map(HttpServletRequest::getRequestURI).orElse("")); + // 设置类名 + info.setClassName(point.getTarget().getClass().getName()); + // 设置方法名 + info.setMethodName(point.getSignature().getName()); + // 设置请求IP地址 + info.setReqIpAdr(HttpRequestUtil.getRealIpAddress()); + // 设置响应IP地址 + info.setRspIpAdr(NetUtil.getLocalhostStr()); + // 设置请求头 + info.setReqHeader(JSONUtil.toJsonStr(HttpRequestUtil.getHeader())); + // 设置请求体 + info.setReqBody(JSONUtil.toJsonStr(point.getArgs())); + // 设置请求成功 + info.setSuccessInd(Boolean.TRUE); + // 定义返回值 + Object obj; + try { + Object result = point.proceed(); + info.setRspBody(JSONUtil.toJsonStr(result)); + obj = result; + } catch (Exception e) { + // 设置请求异常 + info.setSuccessInd(Boolean.FALSE); + // 设置异常信息 + info.setErrorMsg(e.getLocalizedMessage()); + throw e; + } finally { + // 计算处理时间 + info.setTotalTime(System.currentTimeMillis() - startTime); + // 如果为全部打印或正常打印,并且为正常标志,记录 + if (LoggerLevelEnum.ALL.equals(loggerConfig.getLevel()) || (LoggerLevelEnum.PRINT.equals(loggerConfig.getLevel()) && info.getSuccessInd())) { + loggerInfoService.saveAsync(info); + } + // 如果为全部打印或者异常打印,并且为异常标志,记录 + if (LoggerLevelEnum.ALL.equals(loggerConfig.getLevel()) || (LoggerLevelEnum.ERROR.equals(loggerConfig.getLevel())) && !info.getSuccessInd()) { + loggerInfoService.saveAsync(info); + } + } + return obj; + } + +} + diff --git a/logkuangjia/src/main/java/com/woniu/logger/conf/LoggerConfig.java b/logkuangjia/src/main/java/com/woniu/logger/conf/LoggerConfig.java new file mode 100644 index 0000000..ead462d --- /dev/null +++ b/logkuangjia/src/main/java/com/woniu/logger/conf/LoggerConfig.java @@ -0,0 +1,17 @@ +package com.woniu.logger.conf; + + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "logger.project") +public class LoggerConfig { + + /** 定义日志级别 */ + private LoggerLevelEnum level = LoggerLevelEnum.NONE; + +} + diff --git a/logkuangjia/src/main/java/com/woniu/logger/conf/LoggerLevelEnum.java b/logkuangjia/src/main/java/com/woniu/logger/conf/LoggerLevelEnum.java new file mode 100644 index 0000000..caeb6f6 --- /dev/null +++ b/logkuangjia/src/main/java/com/woniu/logger/conf/LoggerLevelEnum.java @@ -0,0 +1,26 @@ +package com.woniu.logger.conf; + + +/** + * 功能描述: 日志级别枚举
+ */ +public enum LoggerLevelEnum { + + /** + * 不打印 + */ + NONE, + /** + * 打印正常 + */ + PRINT, + /** + * 打印异常 + */ + ERROR, + /** + * 全部打印 + */ + ALL, + +} diff --git a/logkuangjia/src/main/java/com/woniu/logger/entity/LoggerInfoEntity.java b/logkuangjia/src/main/java/com/woniu/logger/entity/LoggerInfoEntity.java new file mode 100644 index 0000000..6295a88 --- /dev/null +++ b/logkuangjia/src/main/java/com/woniu/logger/entity/LoggerInfoEntity.java @@ -0,0 +1,70 @@ +package com.woniu.logger.entity; + + +import com.baomidou.mybatisplus.annotation.*; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.time.LocalDate; + +@Data +@TableName(LoggerInfoEntity.TABLE_NAME) +@ApiModel("日志信息") +public class LoggerInfoEntity { + + public static final String TABLE_NAME = "logger_info"; + + @ApiModelProperty("主键ID") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @ApiModelProperty("访问的url") + @TableField("url") + private String url; + + @ApiModelProperty("类名") + @TableField("class_name") + private String className; + + @ApiModelProperty("方法名") + @TableField("method_name") + private String methodName; + + @ApiModelProperty("请求的ip地址") + @TableField("req_ip_adr") + private String reqIpAdr; + + @ApiModelProperty("响应的ip地址(集群提供)") + @TableField("rsp_ip_adr") + private String rspIpAdr; + + @ApiModelProperty("成功标志") + @TableField("success_ind") + private Boolean successInd; + + @ApiModelProperty("请求报文头") + @TableField("req_header") + private String reqHeader; + + @ApiModelProperty("请求报文体") + @TableField("req_body") + private String reqBody; + + @ApiModelProperty("响应报文体") + @TableField("rsp_body") + private String rspBody; + + @ApiModelProperty("错误信息") + @TableField("error_msg") + private String errorMsg; + + @ApiModelProperty("总耗时") + @TableField("total_time") + private Long totalTime; + + @ApiModelProperty("创建时间") + @TableField(value = "create_time", fill = FieldFill.INSERT) + private LocalDate createTime; + +} diff --git a/logkuangjia/src/main/java/com/woniu/logger/mapper/LoggerInfoMapper.java b/logkuangjia/src/main/java/com/woniu/logger/mapper/LoggerInfoMapper.java new file mode 100644 index 0000000..ca7a618 --- /dev/null +++ b/logkuangjia/src/main/java/com/woniu/logger/mapper/LoggerInfoMapper.java @@ -0,0 +1,7 @@ +package com.woniu.logger.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.woniu.logger.entity.LoggerInfoEntity; + +public interface LoggerInfoMapper extends BaseMapper { +} diff --git a/logkuangjia/src/main/java/com/woniu/logger/service/ILoggerInfoService.java b/logkuangjia/src/main/java/com/woniu/logger/service/ILoggerInfoService.java new file mode 100644 index 0000000..99970a1 --- /dev/null +++ b/logkuangjia/src/main/java/com/woniu/logger/service/ILoggerInfoService.java @@ -0,0 +1,29 @@ +package com.woniu.logger.service; + +/** + * @className: ILoggerInfoService + * @author: woniu + * @date: 2023/8/24 + **/ + +import com.baomidou.mybatisplus.extension.service.IService; +import com.woniu.logger.entity.LoggerInfoEntity; +import org.springframework.scheduling.annotation.Async; + +/** + * 功能描述: 日志服务接口
+ */ +public interface ILoggerInfoService extends IService { + + /** + * 功能描述: 异步保存
+ * + * @param info 日志信息 + */ + @Async + default void saveAsync(LoggerInfoEntity info) { + save(info); + } + +} + diff --git a/logkuangjia/src/main/java/com/woniu/logger/service/LoggerInfoServiceImpl.java b/logkuangjia/src/main/java/com/woniu/logger/service/LoggerInfoServiceImpl.java new file mode 100644 index 0000000..6115f2c --- /dev/null +++ b/logkuangjia/src/main/java/com/woniu/logger/service/LoggerInfoServiceImpl.java @@ -0,0 +1,12 @@ +package com.woniu.logger.service; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.woniu.logger.entity.LoggerInfoEntity; +import com.woniu.logger.mapper.LoggerInfoMapper; +import org.springframework.stereotype.Service; + +@Service +public class LoggerInfoServiceImpl extends ServiceImpl implements ILoggerInfoService{ + + +} diff --git a/logkuangjia/src/main/java/com/woniu/logger/sql/DdlSqlFactory.java b/logkuangjia/src/main/java/com/woniu/logger/sql/DdlSqlFactory.java new file mode 100644 index 0000000..d468de1 --- /dev/null +++ b/logkuangjia/src/main/java/com/woniu/logger/sql/DdlSqlFactory.java @@ -0,0 +1,20 @@ +package com.woniu.logger.sql; + +import com.woniu.logger.sql.impl.MySQLDdlSql; +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 功能描述: SQL执行ddl语句工厂
+ */ +@Getter +@AllArgsConstructor +public enum DdlSqlFactory { + + MYSQL(new MySQLDdlSql()), + ; + + private final IDdlSql ddl; + +} + diff --git a/logkuangjia/src/main/java/com/woniu/logger/sql/IDdlSql.java b/logkuangjia/src/main/java/com/woniu/logger/sql/IDdlSql.java new file mode 100644 index 0000000..c6bddc1 --- /dev/null +++ b/logkuangjia/src/main/java/com/woniu/logger/sql/IDdlSql.java @@ -0,0 +1,29 @@ +package com.woniu.logger.sql; + + +/** + * 功能描述: 数据库语句
+ */ +public interface IDdlSql { + + /** + * 查询表是否存在 + */ + String queryTable(String date); + + /** + * 建表语句 + */ + String createTable(); + + /** + * 备份表 + */ + String backTable(String date); + + /** + * 删除表 + */ + String dropTable(); + +} diff --git a/logkuangjia/src/main/java/com/woniu/logger/sql/impl/MySQLDdlSql.java b/logkuangjia/src/main/java/com/woniu/logger/sql/impl/MySQLDdlSql.java new file mode 100644 index 0000000..d251553 --- /dev/null +++ b/logkuangjia/src/main/java/com/woniu/logger/sql/impl/MySQLDdlSql.java @@ -0,0 +1,46 @@ +package com.woniu.logger.sql.impl; + + +import cn.hutool.core.util.StrUtil; +import com.woniu.logger.entity.LoggerInfoEntity; +import com.woniu.logger.sql.IDdlSql; + +public class MySQLDdlSql implements IDdlSql { + + @Override + public String queryTable(String date) { + return "select count(1) from information_schema.tables where table_name ='" + LoggerInfoEntity.TABLE_NAME + (StrUtil.isNotBlank(date) ? "_" + date : "") + "';"; + } + + @Override + public String createTable() { + return "create table " + LoggerInfoEntity.TABLE_NAME + "(" + + " `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',\n" + + " `url` varchar(500) COMMENT '访问的url',\n" + + " `class_name` varchar(500) COMMENT '类名',\n" + + " `method_name` varchar(100) COMMENT '方法名',\n" + + " `req_ip_adr` varchar(20) COMMENT '请求的ip地址',\n" + + " `rsp_ip_adr` varchar(20) COMMENT '响应的ip地址',\n" + + " `success_ind` tinyint COMMENT '成功标志',\n" + + " `req_header` text COMMENT '请求报文头',\n" + + " `req_body` text COMMENT '请求报文体',\n" + + " `rsp_body` text COMMENT '响应报文体',\n" + + " `error_msg` text COMMENT '错误信息',\n" + + " `total_time` Long COMMENT '总耗时',\n" + + " `create_time` datetime DEFAULT NULL COMMENT '创建时间',\n" + + " PRIMARY KEY (`id`) USING BTREE,\n" + + " KEY `idx_name` (`url`) USING BTREE\n" + + ") ENGINE=InnoDB COMMENT='日志信息';"; + } + + @Override + public String backTable(String date) { + return "rename table " + LoggerInfoEntity.TABLE_NAME + " to " + LoggerInfoEntity.TABLE_NAME + "_" + date + ";"; + } + + @Override + public String dropTable() { + return "drop table " + LoggerInfoEntity.TABLE_NAME + ";"; + } + +} diff --git a/logkuangjia/src/main/java/com/woniu/logger/util/HttpRequestUtil.java b/logkuangjia/src/main/java/com/woniu/logger/util/HttpRequestUtil.java new file mode 100644 index 0000000..52cf8d5 --- /dev/null +++ b/logkuangjia/src/main/java/com/woniu/logger/util/HttpRequestUtil.java @@ -0,0 +1,88 @@ +package com.woniu.logger.util; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import javax.servlet.http.HttpServletRequest; +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.Map; + + + +/** + * 功能描述: 请求工具类
+ */ +public class HttpRequestUtil { + + private static final String UNKNOWN = "unknown"; + private static final String LOCALHOST_IP = "127.0.0.1"; + // 客户端与服务器同为一台机器,获取的 ip 有时候是 ipv6 格式 + private static final String LOCALHOST_IPV6 = "0:0:0:0:0:0:0:1"; + private static final String SEPARATOR = ","; + + public static HttpServletRequest getHttpServletRequest() { + ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); + if (servletRequestAttributes == null) { + return null; + } + return servletRequestAttributes.getRequest(); + } + + public static Map getHeader() { + HttpServletRequest request = getHttpServletRequest(); + if (request == null) { + return new HashMap<>(); + } + Map headerMap = new HashMap<>(); + Enumeration headerNames = request.getHeaderNames(); + while (headerNames.hasMoreElements()) { + String headerName = headerNames.nextElement(); + headerMap.put(headerName, request.getHeader(headerName)); + } + return headerMap; + } + + public static String getRealIpAddress() { + HttpServletRequest request = getHttpServletRequest(); + if (request == null) { + return ""; + } + String ip = request.getHeader("x-forwarded-for"); + if (ip == null || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) { + ip = request.getHeader("Proxy-Client-IP"); + } + if (ip == null || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) { + ip = request.getHeader("X-Forwarded-For"); + } + if (ip == null || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) { + ip = request.getHeader("WL-Proxy-Client-IP"); + } + if (ip == null || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) { + ip = request.getHeader("X-Real-IP"); + } + if (ip == null || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) { + ip = request.getRemoteAddr(); + if (LOCALHOST_IP.equalsIgnoreCase(ip) || LOCALHOST_IPV6.equalsIgnoreCase(ip)) { + // 根据网卡取本机配置的 IP + InetAddress iNet = null; + try { + iNet = InetAddress.getLocalHost(); + } catch (UnknownHostException e) { + e.printStackTrace(); + } + if (iNet != null) + ip = iNet.getHostAddress(); + } + } + // 对于通过多个代理的情况,分割出第一个 IP + if (ip != null && ip.length() > 15) { + if (ip.indexOf(SEPARATOR) > 0) { + ip = ip.substring(0, ip.indexOf(SEPARATOR)); + } + } + return LOCALHOST_IPV6.equals(ip) ? LOCALHOST_IP : ip; + } + +} diff --git a/logkuangjia/src/main/resources/application.properties b/logkuangjia/src/main/resources/application.properties new file mode 100644 index 0000000..ed6229a --- /dev/null +++ b/logkuangjia/src/main/resources/application.properties @@ -0,0 +1,57 @@ +# +spring.application.name=www +server.port=8081 +##1800s +#server.servlet.session.timeout=1800 +#spring.jackson.time-zone=GMT+8 +#spring.jackson.date-format=yyyy-MM-dd HH:mm:ss +# +##Դ +#spring.shardingsphere.datasource.names=m1,m2 +# +spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test?serverTimezone=GMT%2b8&useUnicode=true&characterEncoding=utf8 +spring.datasource.username=root +spring.datasource.password=123456 +spring.datasource.driver\class\name=com.mysql.cj.jdbc.Driver +spring.datasource.type=com.alibaba.druid.pool.DruidDataSource + + +#spring.redis.host=192.168.56.10 +#spring.redis.port=6379 +#spring.redis.password=123456 +# +# +#spring.shardingsphere.datasource.m2.url=jdbc:mysql://127.0.0.1:3306/test2?serverTimezone=GMT%2b8&useUnicode=true&characterEncoding=utf8 +#spring.shardingsphere.datasource.m2.username=root +#spring.shardingsphere.datasource.m2.password=123456 +#spring.shardingsphere.datasource.m2.driver\class\name=com.mysql.cj.jdbc.Driver +#spring.shardingsphere.datasource.m2.type=com.alibaba.druid.pool.DruidDataSource +# +## ָt_userݷֲݽڵ +#spring.shardingsphere.sharding.tables.t_user.actual\data\nodes=m$->{1..2}.t_user_$->{1..2} +# +## ָt_userɲΪSNOWFLAKE +#spring.shardingsphere.sharding.tables.t_user.key\generator.column=id +#spring.shardingsphere.sharding.tables.t_user.key\generator.type=SNOWFLAKE +# +## ָt_userķֿԣֿ԰ƬͷƬ㷨 +#spring.shardingsphere.sharding.tables.t_user.database-strategy.inline.sharding\column=sex +#spring.shardingsphere.sharding.tables.t_user.database-strategy.inline.algorithm\expression=m$->{sex % 2 + 1} +# +# +## ָt_userķֱԣֱ԰ƬͷƬ㷨 +#spring.shardingsphere.sharding.tables.t_user.table\strategy.inline.sharding\column=id +#spring.shardingsphere.sharding.tables.t_user.table\strategy.inline.algorithm\expression=t_user_$->{id % 2 + 1} +# +# +## ̨־ +#logging.level.root=info +# +## sql־ +#spring.shardingsphere.props.sql.show=true +# +##mapperļɨ· +#mybatis.mapper-locations=classpath:/mapper/*.xml +# +# +# diff --git a/logkuangjia/src/main/resources/application.yml b/logkuangjia/src/main/resources/application.yml new file mode 100644 index 0000000..8dbeb4e --- /dev/null +++ b/logkuangjia/src/main/resources/application.yml @@ -0,0 +1,18 @@ +#spring: +# datasource: +# type: com.alibaba.druid.pool.DruidDataSource +# driverClassName: com.mysql.cj.jdbc.Driver +# # 主库数据源 +# master: +# url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 +# username: root +# password: 123456 +# slave: +# url: jdbc:mysql://localhost:3306/test2?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 +# username: root +# password: 123456 + +# 日志打印级别:不打印-NONE;打印正常-PRINT;打印异常-ERROR;全部打印-ALL +logger: + project: + level: PRINT \ No newline at end of file diff --git a/logkuangjia/src/main/resources/ip2region/ip2region.xdb b/logkuangjia/src/main/resources/ip2region/ip2region.xdb new file mode 100644 index 0000000..9f6502b Binary files /dev/null and b/logkuangjia/src/main/resources/ip2region/ip2region.xdb differ diff --git a/logkuangjia/src/main/resources/logback-spring.xml b/logkuangjia/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..9b029bd --- /dev/null +++ b/logkuangjia/src/main/resources/logback-spring.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + + UTF-8 + + + + + + + + + + + diff --git a/logkuangjia/src/main/resources/mapper/master/UserDaoMapper.xml b/logkuangjia/src/main/resources/mapper/master/UserDaoMapper.xml new file mode 100644 index 0000000..846e3d0 --- /dev/null +++ b/logkuangjia/src/main/resources/mapper/master/UserDaoMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + insert into t_user_1(id,name, sex) values (#{id},#{name}, #{sex}) + + + + + + + diff --git a/logkuangjia/src/main/resources/mapper/slave/UserDaoMapper.xml b/logkuangjia/src/main/resources/mapper/slave/UserDaoMapper.xml new file mode 100644 index 0000000..6500acb --- /dev/null +++ b/logkuangjia/src/main/resources/mapper/slave/UserDaoMapper.xml @@ -0,0 +1,9 @@ + + + + + + insert into t_user_1(id,name, sex) values (#{id},#{name}, #{sex}) + + + diff --git a/logkuangjia/src/main/resources/mybatis-config.xml b/logkuangjia/src/main/resources/mybatis-config.xml new file mode 100644 index 0000000..b099e5d --- /dev/null +++ b/logkuangjia/src/main/resources/mybatis-config.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/logkuangjia/woniu-web.iml b/logkuangjia/woniu-web.iml new file mode 100644 index 0000000..b2c1064 --- /dev/null +++ b/logkuangjia/woniu-web.iml @@ -0,0 +1,189 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file