hechunping 2 mēneši atpakaļ
vecāks
revīzija
5fb4c2dbaa

+ 235 - 0
pom.xml

@@ -0,0 +1,235 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-starter-parent</artifactId>
+        <version>2.3.1.RELEASE</version>
+        <relativePath /> <!-- lookup parent from repository -->
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>xynet-service-marketing</artifactId>
+    <version>1.0</version>
+
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+        <java.version>1.8</java.version>
+        <spring-cloud.version>Hoxton.SR6</spring-cloud.version>
+    </properties>
+
+
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+        </dependency>
+        <!-- hutool -->
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+            <version>5.8.10</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+            <exclusions><!-- 去掉默认配置 -->
+                <exclusion>
+                    <groupId>org.springframework.boot</groupId>
+                    <artifactId>spring-boot-starter-logging</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-log4j2</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-actuator</artifactId>
+        </dependency>
+
+        <!-- String工具类 -->
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+        </dependency>
+        <!-- mysql 依赖 -->
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+        </dependency>
+
+        <!-- mybatis-plus -->
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-boot-starter</artifactId>
+            <version>3.5.2</version>
+        </dependency>
+
+        <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
+        <dependency>
+            <groupId>javax.servlet</groupId>
+            <artifactId>javax.servlet-api</artifactId>
+            <scope>provided</scope>
+        </dependency>
+
+        <!-- redis -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-redis</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>redis.clients</groupId>
+            <artifactId>jedis</artifactId>
+        </dependency>
+
+        <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-databind</artifactId>
+        </dependency>
+
+        <!-- https://mvnrepository.com/artifact/com.auth0/java-jwt -->
+        <dependency>
+            <groupId>com.auth0</groupId>
+            <artifactId>java-jwt</artifactId>
+            <version>3.10.3</version>
+        </dependency>
+
+        <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>1.2.71</version>
+        </dependency>
+
+        <!-- https://mvnrepository.com/artifact/org.apache.shiro/shiro-spring 生成加盐密码 -->
+        <dependency>
+            <groupId>org.apache.shiro</groupId>
+            <artifactId>shiro-spring</artifactId>
+            <version>1.5.3</version>
+        </dependency>
+
+        <!--poi依赖 -->
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi-ooxml</artifactId>
+            <version>3.14</version>
+        </dependency>
+
+		<!-- 导出excel相关的jar包 -->
+	<!--	<dependency>
+			<groupId>org.apache.poi</groupId>
+			<artifactId>poi</artifactId>
+			<version>3.10-FINAL</version>
+		</dependency>-->
+
+        <!-- apache httpclient组件 -->
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpclient</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
+            <version>2.2.3.RELEASE</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-openfeign</artifactId>
+            <version>2.2.3.RELEASE</version>
+        </dependency>
+
+    </dependencies>
+
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>org.springframework.cloud</groupId>
+                <artifactId>spring-cloud-dependencies</artifactId>
+                <version>${spring-cloud.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+    
+     <build>
+		<plugins>
+			<plugin>
+				<artifactId>maven-jar-plugin</artifactId>
+				<version>2.6</version>
+				<configuration>
+					<archive>
+						<manifest>
+							<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
+							<addClasspath>true</addClasspath>
+							<mainClass>com.xynet.AdminApplication</mainClass>
+							<classpathPrefix>dependency</classpathPrefix>
+							<useUniqueVersions>false</useUniqueVersions>
+						</manifest>
+					</archive>
+				</configuration>
+			</plugin>
+			<plugin>
+				<artifactId>maven-dependency-plugin</artifactId>
+				<executions>
+					<execution>
+						<id>copy-dependencies</id>
+						<phase>package</phase>
+						<goals>
+							<goal>copy-dependencies</goal>
+						</goals>
+					</execution>
+				</executions>
+			</plugin>
+
+
+			<plugin>
+				<artifactId>maven-compiler-plugin</artifactId>
+				<configuration>
+					<source>1.8</source>
+					<target>1.8</target>
+					<encoding>UTF-8</encoding>
+					<compilerArguments>
+						<extdirs>${project.basedir}/src/main/lib</extdirs>
+					</compilerArguments>
+				</configuration>
+			</plugin>
+
+			<!-- maven打包跳过编译 -->
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-surefire-plugin</artifactId>
+				<configuration>
+					<skip>true</skip>
+				</configuration>
+			</plugin>
+		</plugins>
+		<defaultGoal>compile</defaultGoal>
+
+		<resources>
+			<resource>
+				<directory>src/main/java</directory>
+				<includes>
+					<include>**/*.properties</include>
+					<include>**/*.xml</include>
+				</includes>
+				<filtering>false</filtering>
+			</resource>
+			<resource>
+				<directory>src/main/resources</directory>
+			</resource>
+		</resources>
+	</build>
+</project>

+ 23 - 0
src/main/java/com/xynet/AdminApplication.java

@@ -0,0 +1,23 @@
+package com.xynet;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
+import org.springframework.cloud.openfeign.EnableFeignClients;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+
+@SpringBootApplication
+@EnableDiscoveryClient
+// 开启事物注解,在service方法上加@Transactional(rollbackFor = Exception.class)
+@EnableTransactionManagement
+@EnableFeignClients
+@EnableScheduling
+public class AdminApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(AdminApplication.class, args);
+    }
+
+}

+ 30 - 0
src/main/resources/application-dev.properties

@@ -0,0 +1,30 @@
+spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
+spring.datasource.url=jdbc:mysql://47.119.120.128:3316/xyplatdb?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8
+spring.datasource.username=root
+spring.datasource.password=xymysqlroot_2019
+eureka.client.service-url.defaultZone=http://eureka:eureka_xyplat@localhost:8080/eureka/
+eureka.client.enabled=false
+eureka.client.registerWithEureka=true
+eureka.client.fetchRegistry=true
+eureka.client.healthcheck.enabled=true
+eureka.client.registry-fetch-interval-seconds=5
+eureka.instance.lease-renewal-interval-in-seconds=5
+eureka.instance.lease-expiration-duration-in-seconds=5
+eureka.instance.hostname=${spring.application.name}:${server.port}:@project.version@
+eureka.instance.prefer-ip-address=true
+eureka.instance.instance-id=${spring.cloud.client.ip-address}:${server.port}
+logging.config=classpath:log4j2-dev.xml
+
+#redis
+spring.redis.host=47.119.120.128
+spring.redis.password=XY#123456@mm
+spring.redis.port=6389
+
+# ²âÊÔ·þ±£´æµÄ·¾¶
+savePath=/data/apps/electricbox/images
+
+maxSize=104857600
+
+picFileType=jpg,png,jpeg
+videoFileType=mp4,avi,mov,rmvb,3gp,webm,mkv,mpeg,mpg
+

+ 33 - 0
src/main/resources/application-prod.properties

@@ -0,0 +1,33 @@
+spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
+spring.datasource.url=jdbc:mysql://172.30.2.188:3316/electricboxdb?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8
+spring.datasource.username=root
+spring.datasource.password=xymysqlroot_2019
+eureka.client.service-url.defaultZone=http://eureka:eureka_xyplat@172.18.117.45:8080/eureka/
+eureka.client.enabled=true
+eureka.client.registerWithEureka=true
+eureka.client.fetchRegistry=true
+eureka.client.healthcheck.enabled=true
+eureka.client.registry-fetch-interval-seconds=5
+eureka.instance.lease-renewal-interval-in-seconds=5
+eureka.instance.lease-expiration-duration-in-seconds=5
+eureka.instance.hostname=${spring.application.name}:${server.port}:@project.version@
+eureka.instance.prefer-ip-address=true
+eureka.instance.instance-id=${spring.cloud.client.ip-address}:${server.port}
+logging.config=classpath:log4j2-dev.xml
+
+#redis
+spring.redis.host=172.30.2.188
+spring.redis.password=XY#123456@mm
+spring.redis.port=6389
+
+# ²âÊÔ·þ±£´æµÄ·¾¶
+savePath=/data/apps/electricbox/images
+
+maxSize=104857600
+
+picFileType=jpg,png,jpeg
+videoFileType=mp4,avi,mov,rmvb,3gp,webm,mkv,mpeg,mpg
+
+picturePrefix=http://8.142.160.185:8821/pic/
+
+compressionSize=2097152

+ 33 - 0
src/main/resources/application-test.properties

@@ -0,0 +1,33 @@
+spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
+spring.datasource.url=jdbc:mysql://localhost:3316/electricboxdb?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8
+spring.datasource.username=root
+spring.datasource.password=xymysqlroot_2019
+eureka.client.service-url.defaultZone=http://eureka:eureka_xyplat@localhost:8080/eureka/
+eureka.client.enabled=true
+eureka.client.registerWithEureka=true
+eureka.client.fetchRegistry=true
+eureka.client.healthcheck.enabled=true
+eureka.client.registry-fetch-interval-seconds=5
+eureka.instance.lease-renewal-interval-in-seconds=5
+eureka.instance.lease-expiration-duration-in-seconds=5
+eureka.instance.hostname=${spring.application.name}:${server.port}:@project.version@
+eureka.instance.prefer-ip-address=true
+eureka.instance.instance-id=${spring.cloud.client.ip-address}:${server.port}
+logging.config=classpath:log4j2-dev.xml
+
+#redis
+spring.redis.host=172.27.210.154
+spring.redis.password=XY#123456@mm
+spring.redis.port=6389
+
+# ²âÊÔ·þ±£´æµÄ·¾¶
+savePath=/data/apps/electricbox/images
+
+maxSize=104857600
+
+picFileType=jpg,png,jpeg
+videoFileType=mp4,avi,mov,rmvb,3gp,webm,mkv,mpeg,mpg
+
+picturePrefix=http://8.142.160.185:8821/pic/
+
+compressionSize=2097152

+ 42 - 0
src/main/resources/application.properties

@@ -0,0 +1,42 @@
+spring.profiles.active=dev
+spring.application.name=electricbox-admin
+#logging.level.com.xiaolong.find.shop.admin.dao=debug
+server.port=9785
+feign.hystrix.enabled=true
+
+mybatis.mapper-locations=classpath:mybatis/mapper/*/*.xml
+
+ribbon.readtimeout=50000
+
+mybatis.configuration.cache-enabled=true
+
+spring.jmx.default-domain=electricAdmin
+
+writepermission= false
+
+
+
+
+
+#\u5173\u95EDfavicon
+spring.mvc.favicon.enable=false
+
+spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
+spring.jackson.time-zone=GMT+8
+
+spring.jackson.serialization.FAIL_ON_EMPTY_BEANS=false
+
+#spring.jackson.default-property-inclusion=non-null
+
+
+#redis
+spring.redis.database=12
+spring.redis.database-session=1
+spring.redis.jedis.pool.max-idle=8
+spring.redis.jedis.pool.min-idle=1
+spring.redis.jedis.pool.max-active=100
+spring.redis.jedis.pool.max-wait=-1
+spring.redis.pool.maxTotal=8
+spring.redis.pool.maxWaitMillis=1000
+spring.redis.timeout=3000
+

+ 48 - 0
src/main/resources/generatorConfig.xml

@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd" >
+<generatorConfiguration>
+	<!-- 数据库驱动 -->
+	<classPathEntry
+		location="/Users/kurt/Downloads/mysql-connector-java-5.0.8-bin.jar" />
+	<context id="DB2Tables" targetRuntime="MyBatis3">
+		<commentGenerator>
+			<property name="suppressDate" value="true" />
+			<!-- 是否去除自动生成的注释 true:是 : false:否 -->
+			<property name="suppressAllComments" value="true" />
+			<property name="useInformationSchema" value="true"/>
+		</commentGenerator>
+		<!--数据库链接URL,用户名、密码 -->
+		<jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/find_shop" userId="root" password="123456">
+		</jdbcConnection>
+		<javaTypeResolver>
+			<property name="forceBigDecimals" value="false" />
+		</javaTypeResolver>
+		<!-- 生成模型的包名和位置 -->
+		<javaModelGenerator targetPackage="com.xiaolong.find.shop.service.dict.entity"
+			targetProject="/Users/kurt/Documents/workDocuments/Java/javaProject/workspace/xiaolong-find-shop/xiaolong-find-shop-service/src/main/java">
+			<property name="enableSubPackages" value="true" />
+			<property name="trimStrings" value="true" />
+		</javaModelGenerator>
+		<!-- 生成映射文件的包名和位置 -->
+		<sqlMapGenerator targetPackage="dict"
+			targetProject="/Users/kurt/Documents/workDocuments/Java/javaProject/workspace/xiaolong-find-shop/xiaolong-find-shop-service/src/main/resources/mybatis/mapper">
+			<property name="enableSubPackages" value="true" />
+		</sqlMapGenerator>
+		<!-- 生成DAO的包名和位置 -->
+		<javaClientGenerator type="XMLMAPPER"
+			targetPackage="com.xiaolong.find.shop.service.dict.dao" targetProject="/Users/kurt/Documents/workDocuments/Java/javaProject/workspace/xiaolong-find-shop/xiaolong-find-shop-service/src/main/java">
+			<property name="enableSubPackages" value="true" />
+		</javaClientGenerator>
+		<!-- 要生成的表 tableName是数据库中的表名或视图名 -->
+		<table tableName="dict" schema="general" domainObjectName="Dict"
+
+			enableCountByExample="false" enableUpdateByExample="false"
+
+			enableDeleteByExample="false" enableSelectByExample="false"
+
+			selectByExampleQueryId="false">
+
+			<property name="useActualColumnNames" value="false" />
+		</table>
+	</context>
+</generatorConfiguration>

+ 140 - 0
src/main/resources/log4j2-dev.xml

@@ -0,0 +1,140 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE >ALL -->
+<!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出;可以设置成OFF(关闭)或Error(只输出错误信息) -->
+<!--monitorInterval:Log4j2能够自动检测修改配置文件和重新配置本身,设置间隔秒数 -->
+<Configuration status="INFO" monitorInterval="30">
+
+	<Properties>
+		<!-- 缺省配置(用于开发环境),配置日志文件输出目录和动态参数。其他环境需要在VM参数中指定; “sys:”表示:如果VM参数中没指定这个变量值,则使用本文件中定义的缺省全局变量值 -->
+		<Property name="instance">electricbox-admin</Property>
+		<Property name="log.dir">logs</Property>
+	</Properties>
+
+	<!-- 定义所有的appender -->
+	<Appenders>
+		<!--这个输出控制台的配置 -->
+		<Console name="Console" target="SYSTEM_OUT">
+			<!--输出日志的格式 -->
+			<PatternLayout
+				pattern="[%date{yyyy-MM-dd HH:mm:ss.SSS}][%thread][%level][%class][%line]:%message%n" />
+		</Console>
+
+		<!-- info及以上级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档 -->
+		<RollingRandomAccessFile name="infoLog"
+			fileName="${log.dir}/${instance}.log"
+			filePattern="${log.dir}/%d{yyyy-MM}/${instance}-info-%d{yyyy-MM-dd}-%i.log.gz"
+			append="true">
+			<PatternLayout
+				pattern="[%date{yyyy-MM-dd HH:mm:ss.SSS}][%thread][%level][%class][%line]:%message%n" />
+
+			<!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) -->
+			<Filters>
+				<!-- onMatch="ACCEPT" 表示匹配该级别及以上 -->
+				<!-- onMatch="DENY" 表示不匹配该级别及以上 -->
+				<!-- onMatch="NEUTRAL" 表示该级别及以上的,由下一个filter处理,如果当前是最后一个,则表示匹配该级别及以上 -->
+				<!-- onMismatch="ACCEPT" 表示匹配该级别以下 -->
+				<!-- onMismatch="NEUTRAL" 表示该级别及以下的,由下一个filter处理,如果当前是最后一个,则不匹配该级别以下的 -->
+				<!-- onMismatch="DENY" 表示不匹配该级别以下的 -->
+				<ThresholdFilter level="INFO" onMatch="ACCEPT"
+					onMismatch="NEUTRAL" />
+			</Filters>
+
+			<Policies>
+				<!-- 基于时间的滚动策略,interval属性用来指定多久滚动一次,默认是1 hour -->
+				<TimeBasedTriggeringPolicy interval="1"
+					modulate="true" />
+				<!-- 基于指定文件大小的滚动策略,size属性用来定义每个日志文件的大小 -->
+				<SizeBasedTriggeringPolicy size="10MB" />
+				<DefaultRolloverStrategy max="100" />
+				<!-- DefaultRolloverStrategy:用来指定同一个文件夹下最多有几个日志文件时开始删除最旧的,创建新的(通过max属性) -->
+			</Policies>
+		</RollingRandomAccessFile>
+
+
+		<!-- warn级别的日志信息 -->
+		<RollingRandomAccessFile name="warnLog"
+			fileName="${log.dir}/${instance}.log"
+			filePattern="${log.dir}/%d{yyyy-MM}/${instance}-warn-%d{yyyy-MM-dd}-%i.log.gz"
+			append="true">
+			<Filters>
+				<!-- onMatch="ACCEPT" 表示匹配该级别及以上 -->
+				<!-- onMatch="DENY" 表示不匹配该级别及以上 -->
+				<!-- onMatch="NEUTRAL" 表示该级别及以上的,由下一个filter处理,如果当前是最后一个,则表示匹配该级别及以上 -->
+				<!-- onMismatch="ACCEPT" 表示匹配该级别以下 -->
+				<!-- onMismatch="NEUTRAL" 表示该级别及以下的,由下一个filter处理,如果当前是最后一个,则不匹配该级别以下的 -->
+				<!-- onMismatch="DENY" 表示不匹配该级别以下的 -->
+				<ThresholdFilter level="error" onMatch="DENY"
+					onMismatch="NEUTRAL" />
+				<ThresholdFilter level="warn" onMatch="ACCEPT"
+					onMismatch="DENY" />
+			</Filters>
+
+			<PatternLayout
+				pattern="[%date{yyyy-MM-dd HH:mm:ss.SSS}][%thread][%level][%class][%line]:%message%n" />
+
+			<Policies>
+				<TimeBasedTriggeringPolicy interval="1"
+					modulate="true" />
+				<SizeBasedTriggeringPolicy size="10MB" />
+			</Policies>
+		</RollingRandomAccessFile>
+
+
+		<!-- error级别的日志信息 -->
+		<RollingRandomAccessFile name="errorLog"
+			fileName="${log.dir}/${instance}.log"
+			filePattern="${log.dir}/%d{yyyy-MM}/${instance}-error-%d{yyyy-MM-dd}-%i.log.gz"
+			append="true">
+			<Filters>
+				<!-- onMatch="ACCEPT" 表示匹配该级别及以上 -->
+				<!-- onMatch="DENY" 表示不匹配该级别及以上 -->
+				<!-- onMatch="NEUTRAL" 表示该级别及以上的,由下一个filter处理,如果当前是最后一个,则表示匹配该级别及以上 -->
+				<!-- onMismatch="ACCEPT" 表示匹配该级别以下 -->
+				<!-- onMismatch="NEUTRAL" 表示该级别及以下的,由下一个filter处理,如果当前是最后一个,则不匹配该级别以下的 -->
+				<!-- onMismatch="DENY" 表示不匹配该级别以下的 -->
+				<ThresholdFilter level="ERROR" onMatch="ACCEPT"
+					onMismatch="DENY" />
+			</Filters>
+
+			<PatternLayout
+				pattern="[%date{yyyy-MM-dd HH:mm:ss.SSS}][%thread][%level][%class][%line]:%message%n" />
+
+			<Policies>
+				<TimeBasedTriggeringPolicy interval="1"
+					modulate="true" />
+				<SizeBasedTriggeringPolicy size="10MB" />
+			</Policies>
+		</RollingRandomAccessFile>
+	</Appenders>
+
+
+	<!-- 全局配置,默认所有的Logger都继承此配置 -->
+
+	<!-- 用来配置LoggerConfig,包含一个root logger和若干个普通logger。 additivity指定是否同时输出log到父类的appender,缺省为true。 
+		一个Logger可以绑定多个不同的Appender。只有定义了logger并引入的appender,appender才会生效。 -->
+	<Loggers>
+		<!-- 第三方的软件日志级别 -->
+		<logger name="org.springframework" level="info"
+			additivity="true">
+			<AppenderRef ref="warnLog" />
+			<AppenderRef ref="errorLog" />
+		</logger>
+
+		<logger name="java.sql.PreparedStatement" level="debug"
+			additivity="true">
+			<AppenderRef ref="Console" />
+		</logger>
+
+		<!-- root logger 配置 -->
+		<Root level="info" includeLocation="true">
+			<AppenderRef ref="Console" />
+			<AppenderRef ref="infoLog" />
+			<AppenderRef ref="errorLog" />
+		</Root>
+
+		<!-- AsyncRoot - 异步记录日志 - 需要LMAXDisruptor的支持 -->
+		<!-- <AsyncRootlevel="info" additivity="false"> <AppenderRef ref="Console"/> 
+			<AppenderRef ref="infoLog"/> <AppenderRef ref="errorLog"/> </AsyncRoot> -->
+	</Loggers>
+
+</Configuration>

+ 140 - 0
src/main/resources/log4j2-prod.xml

@@ -0,0 +1,140 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE >ALL -->
+<!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出;可以设置成OFF(关闭)或Error(只输出错误信息) -->
+<!--monitorInterval:Log4j2能够自动检测修改配置文件和重新配置本身,设置间隔秒数 -->
+<Configuration status="INFO" monitorInterval="30">
+
+	<Properties>
+		<!-- 缺省配置(用于开发环境),配置日志文件输出目录和动态参数。其他环境需要在VM参数中指定; “sys:”表示:如果VM参数中没指定这个变量值,则使用本文件中定义的缺省全局变量值 -->
+		<Property name="instance">electricbox-admin</Property>
+		<Property name="log.dir">logs</Property>
+	</Properties>
+
+	<!-- 定义所有的appender -->
+	<Appenders>
+		<!--这个输出控制台的配置 -->
+		<Console name="Console" target="SYSTEM_OUT">
+			<!--输出日志的格式 -->
+			<PatternLayout
+				pattern="[%date{yyyy-MM-dd HH:mm:ss.SSS}][%thread][%level][%class][%line]:%message%n" />
+		</Console>
+
+		<!-- info及以上级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档 -->
+		<RollingRandomAccessFile name="infoLog"
+			fileName="${log.dir}/${instance}.log"
+			filePattern="${log.dir}/%d{yyyy-MM}/${instance}-info-%d{yyyy-MM-dd}-%i.log.gz"
+			append="true">
+			<PatternLayout
+				pattern="[%date{yyyy-MM-dd HH:mm:ss.SSS}][%thread][%level][%class][%line]:%message%n" />
+
+			<!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) -->
+			<Filters>
+				<!-- onMatch="ACCEPT" 表示匹配该级别及以上 -->
+				<!-- onMatch="DENY" 表示不匹配该级别及以上 -->
+				<!-- onMatch="NEUTRAL" 表示该级别及以上的,由下一个filter处理,如果当前是最后一个,则表示匹配该级别及以上 -->
+				<!-- onMismatch="ACCEPT" 表示匹配该级别以下 -->
+				<!-- onMismatch="NEUTRAL" 表示该级别及以下的,由下一个filter处理,如果当前是最后一个,则不匹配该级别以下的 -->
+				<!-- onMismatch="DENY" 表示不匹配该级别以下的 -->
+				<ThresholdFilter level="INFO" onMatch="ACCEPT"
+					onMismatch="NEUTRAL" />
+			</Filters>
+
+			<Policies>
+				<!-- 基于时间的滚动策略,interval属性用来指定多久滚动一次,默认是1 hour -->
+				<TimeBasedTriggeringPolicy interval="1"
+					modulate="true" />
+				<!-- 基于指定文件大小的滚动策略,size属性用来定义每个日志文件的大小 -->
+				<SizeBasedTriggeringPolicy size="10MB" />
+				<DefaultRolloverStrategy max="100" />
+				<!-- DefaultRolloverStrategy:用来指定同一个文件夹下最多有几个日志文件时开始删除最旧的,创建新的(通过max属性) -->
+			</Policies>
+		</RollingRandomAccessFile>
+
+
+		<!-- warn级别的日志信息 -->
+		<RollingRandomAccessFile name="warnLog"
+			fileName="${log.dir}/${instance}.log"
+			filePattern="${log.dir}/%d{yyyy-MM}/${instance}-warn-%d{yyyy-MM-dd}-%i.log.gz"
+			append="true">
+			<Filters>
+				<!-- onMatch="ACCEPT" 表示匹配该级别及以上 -->
+				<!-- onMatch="DENY" 表示不匹配该级别及以上 -->
+				<!-- onMatch="NEUTRAL" 表示该级别及以上的,由下一个filter处理,如果当前是最后一个,则表示匹配该级别及以上 -->
+				<!-- onMismatch="ACCEPT" 表示匹配该级别以下 -->
+				<!-- onMismatch="NEUTRAL" 表示该级别及以下的,由下一个filter处理,如果当前是最后一个,则不匹配该级别以下的 -->
+				<!-- onMismatch="DENY" 表示不匹配该级别以下的 -->
+				<ThresholdFilter level="error" onMatch="DENY"
+					onMismatch="NEUTRAL" />
+				<ThresholdFilter level="warn" onMatch="ACCEPT"
+					onMismatch="DENY" />
+			</Filters>
+
+			<PatternLayout
+				pattern="[%date{yyyy-MM-dd HH:mm:ss.SSS}][%thread][%level][%class][%line]:%message%n" />
+
+			<Policies>
+				<TimeBasedTriggeringPolicy interval="1"
+					modulate="true" />
+				<SizeBasedTriggeringPolicy size="10MB" />
+			</Policies>
+		</RollingRandomAccessFile>
+
+
+		<!-- error级别的日志信息 -->
+		<RollingRandomAccessFile name="errorLog"
+			fileName="${log.dir}/${instance}.log"
+			filePattern="${log.dir}/%d{yyyy-MM}/${instance}-error-%d{yyyy-MM-dd}-%i.log.gz"
+			append="true">
+			<Filters>
+				<!-- onMatch="ACCEPT" 表示匹配该级别及以上 -->
+				<!-- onMatch="DENY" 表示不匹配该级别及以上 -->
+				<!-- onMatch="NEUTRAL" 表示该级别及以上的,由下一个filter处理,如果当前是最后一个,则表示匹配该级别及以上 -->
+				<!-- onMismatch="ACCEPT" 表示匹配该级别以下 -->
+				<!-- onMismatch="NEUTRAL" 表示该级别及以下的,由下一个filter处理,如果当前是最后一个,则不匹配该级别以下的 -->
+				<!-- onMismatch="DENY" 表示不匹配该级别以下的 -->
+				<ThresholdFilter level="ERROR" onMatch="ACCEPT"
+					onMismatch="DENY" />
+			</Filters>
+
+			<PatternLayout
+				pattern="[%date{yyyy-MM-dd HH:mm:ss.SSS}][%thread][%level][%class][%line]:%message%n" />
+
+			<Policies>
+				<TimeBasedTriggeringPolicy interval="1"
+					modulate="true" />
+				<SizeBasedTriggeringPolicy size="10MB" />
+			</Policies>
+		</RollingRandomAccessFile>
+	</Appenders>
+
+
+	<!-- 全局配置,默认所有的Logger都继承此配置 -->
+
+	<!-- 用来配置LoggerConfig,包含一个root logger和若干个普通logger。 additivity指定是否同时输出log到父类的appender,缺省为true。 
+		一个Logger可以绑定多个不同的Appender。只有定义了logger并引入的appender,appender才会生效。 -->
+	<Loggers>
+		<!-- 第三方的软件日志级别 -->
+		<logger name="org.springframework" level="info"
+			additivity="true">
+			<AppenderRef ref="warnLog" />
+			<AppenderRef ref="errorLog" />
+		</logger>
+
+		<logger name="java.sql.PreparedStatement" level="debug"
+			additivity="true">
+			<AppenderRef ref="Console" />
+		</logger>
+
+		<!-- root logger 配置 -->
+		<Root level="info" includeLocation="true">
+			<AppenderRef ref="Console" />
+			<AppenderRef ref="infoLog" />
+			<AppenderRef ref="errorLog" />
+		</Root>
+
+		<!-- AsyncRoot - 异步记录日志 - 需要LMAXDisruptor的支持 -->
+		<!-- <AsyncRootlevel="info" additivity="false"> <AppenderRef ref="Console"/> 
+			<AppenderRef ref="infoLog"/> <AppenderRef ref="errorLog"/> </AsyncRoot> -->
+	</Loggers>
+
+</Configuration>