-
Notifications
You must be signed in to change notification settings - Fork 2
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
37ec646
commit e743437
Showing
9 changed files
with
334 additions
and
240 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
91 changes: 91 additions & 0 deletions
91
...ita-starters/alita-authorization-server-spring-boot-starter/src/test/resources/log4j2.xml
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,91 @@ | ||
<?xml version="1.0" encoding="UTF-8"?> | ||
<Configuration status="WARN" monitorInterval="600" shutdownHook="disable"> | ||
<!-- 将一些常用值提取出来,然后在文件的其他部分通过${}的形式引用,这些值可以随便定义 --> | ||
<Properties> | ||
<!-- 定义日志文件根目录 --> | ||
<Property name="logDir" value="/home/weihu/deploy/logs/alita/" /> | ||
<!-- 定义日志的通用格式 --> | ||
<Property name="genericPattern" value="[authorization-log]-%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" /> | ||
<!-- 定义日志分卷文件通用文件名形式 --> | ||
<Property name="genericFilePattern" value="%d{yyyy-MM-dd HH:mm}-%i" /> | ||
</Properties> | ||
<!-- appender们的定义 --> | ||
<Appenders> | ||
<!-- 定义一个console类型定定义,如果需要,可以以这个为原型粘贴复制修改再定义适合自己的 --> | ||
<Console name="consoleAppender" target="SYSTEM_OUT"> | ||
<PatternLayout pattern="${genericPattern}" /> | ||
</Console> | ||
|
||
<RocketMQ name="rocketmqAppender" producerGroup="alitaLogGroup" nameServerAddress="@log.rocketMQ.address@" topic="alitaLog-new" tag="authorizationWebapiLog"> | ||
<PatternLayout pattern="${genericPattern}" /> | ||
</RocketMQ> | ||
|
||
<!-- 定义一个文件appender,如果需要,可以以这个为原型粘贴复制修改再定义适合自己的,该appender的详细解释会在教程接下来的部分给出 | ||
<RollingRandomAccessFile name="appApiFileAppender" fileName="${logDir}/appApi.log" | ||
filePattern="${logDir}/appApi-${genericFilePattern}.log" append="true"> | ||
<PatternLayout pattern="${genericPattern}" /> | ||
<Policies> | ||
<TimeBasedTriggeringPolicy interval="1" /> | ||
<SizeBasedTriggeringPolicy size="2 MB" /> | ||
</Policies> | ||
<DefaultRolloverStrategy max="1000000" compressionLevel="9" /> | ||
</RollingRandomAccessFile> | ||
--> | ||
</Appenders> | ||
<!-- 定义logger们 --> | ||
<Loggers> | ||
<!-- 定义根logger,根logger是必须的,这里我把根logger定义为异步的,也可为定义为普通的同步的,但是注意在同步根logger和异步根logger中只能存在一个,不能两个都配置 --> | ||
<asyncRoot level="INFO"> | ||
<AppenderRef ref="consoleAppender" /> | ||
</asyncRoot> | ||
<!-- 普通的根logger,注意,跟上面的异步跟root同时只能存在一个 --> | ||
<!-- <Root level="trace"> <AppenderRef ref="consoleAppender" /> </Root> --> | ||
<!-- 定义一个普通的logger,这里我定义为异步的 --> | ||
<!-- additivity 表式是否向根 longer输出,由于上面配制的根是控制台,所以这里配为ture --> | ||
<asyncLogger name="top.klw8.alita.authorization" level="info"> | ||
<AppenderRef ref="rocketmqAppender" /> | ||
</asyncLogger> | ||
<!-- 定义一个普通的logger --> | ||
<!-- additivity 表式是否向根 longer输出,这里是另一种配法: 配制为false,下面配制向控制台输出 | ||
<Logger name="com.foo.Bar.common" level="info" additivity="false"> | ||
<AppenderRef ref="consoleAppender" /> | ||
<AppenderRef ref="rollingRandomAccessFileAppender" /> | ||
</Logger> | ||
--> | ||
|
||
<!-- 指定包的日志级别 ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF.--> | ||
<logger name="org.springframework" level="ERROR" /> | ||
<logger name="com.alibaba" level="ERROR" /> | ||
<logger name="org.apache.zookeeper" level="ERROR" /> | ||
</Loggers> | ||
</Configuration> | ||
|
||
<!-- 配制说明: | ||
1. 首先看<Configuration>元素,log4j2框架自己也有一系列日志,比如框架初始化日志或者初始化失败日志什么的。 | ||
status表示应该记录哪个等级的log4j2自身的日志,一般情况下WARN就行,如果出现了了WARN等级的日志,说明你的log4j2框架的用法有问题,就要及时排查排查了。 | ||
log4j2支持自动更新配置文件,也就是说不用重启服务器,直接改log4j2的配置文件,它就能自动重新加载,起作用,完全碾压log4j,monitorInterval表示应该多久检测一次更新,单位:秒,默认5秒。 | ||
2. 再看<Properties>,它里面包含<Property>,就是把一些通用的值提出来,在配置的其他地方已${}的形式引用而已。 | ||
3. <Appenders>元素,官方文档表示有还有一种异步appender,但是效能提升及其有限,而且在多线程情况下有可能出现问题,所以不建议使用,本教程不讨论那个。 | ||
官方文档有很多种类型的appender,但是平常工作中常用的也就是console类型和file类型的,console类型appender输出到控制台,方便开发调试用,file类型appender类型输出到文件,用在生产环境记录日志。 | ||
console类型appender没得选,只有这一种,结构很简单,不用多说。 | ||
file类型appender有多种类型,本教程建议使用<RollingRandomAccessFile>类型,因为这种类型的fileAppender有缓存功能,效率比RollingFile高(网上很多教程都是几年前的了,用的还是RollingFile), | ||
所以只讨论这种类型。fileName表示日志文件名,filePattern表示日志文件分卷的分卷文件的文件名(日志文件分卷就是某些情况,比如每天生成一个文件,或者单个日志文件超过100MB时自动分成多个日志文件), | ||
fileName如果已.zip结尾表示启用压缩功能,那些分卷好的日志文件会被压缩,某些情况会很有用。如果不想启用压缩功能,就不要已.zip或者其他压缩文件后缀结尾。PatternLayout表示日志格式,不必多说。 | ||
Policies是触发日志文件分卷的条件。TimeBasedTriggeringPolicy表示按照时间来分卷,interval表示时间间隔,时间单位有点诡异,不是明确设置的,而是从filePattern推导的,是filePattern中最小的时间的单位, | ||
比如上述示例中的filePattern为%d{yyyy-MM-dd},这个日期时间格式必须符合java日期时间规范,其中最小日期单位为dd,也就是天,推导出来也就是1天分一个日志文件出来, | ||
如果filePattern的配置为%d{yyyy-MM-dd HH:mm},最小单位是mm,也就是分钟,那就是1分钟分一个日志文件出来,如果interval为3,那就是3天一个日志文件和3分钟一个日志文件, | ||
推导规则就是如此。SizeBasedTriggeringPolicy表示日志文件大小超过多大时对其进行分卷,size表示日志大小,单位推荐写MB,数值为大于0的整数,100 MB中间有个空格,推荐写上。 | ||
DefaultRolloverStrategy表示分卷策略,只需要记住这个必须要配就行了,不必深究,max表示最多可以有多少个分卷文件,默认为7个,超出7个的日志分卷文件将被删除,也就是说可能导致重要日志丢失,所以该参数配大点,100000应该够了, | ||
compressionLevel表示压缩等级,值为0-9,只在filePattern以.zip结尾,也就是说压缩格式为zip时起作用,这也是为什么前面说建议压缩格式为zip。 | ||
0表示不压缩,只打包为zip格式,9表示最高压缩比(个人测试1MB日志文件某些情况下能压缩到4KB左右)。如果不想启用压缩功能,前面说过,日志filePattern不以.zip结尾就行了,这时compressionLevel是不起作用的。 | ||
4. <Loggers>表示配置各种logger的地方。 | ||
根logger是必需的,可配置为普通的,也可配置问异步的,但是只能配置一种,不能两种都配置。 | ||
其他的普通logger配置很简单,不必多说,可根据需要配置为普通logger或者异步logger,至于选择异步的还是普通的,教程前半部分已经说过, | ||
如果日志记录代码跟业务逻辑代码是有关系的,最好选普通logger,如果真的只是单纯为了记个日志,建议配置异步logger。根logger没有additivity属性, | ||
普通logger和异步logger有additivity属性。additivity设置为false是为了防止当前logger向父logger发送日志,导致日志被重复记录。至于log4j2的logger的父子关系, | ||
可以看这里http://logging.apache.org/log4j/2.x/manual/architecture.html。总的来说就是类似java体系的父子关系,跟logger相当于是java体系中的Object类, | ||
是所有logger的父logger,所以所有logger的日志都会被添加到根logger中,所以给每个(除了根logger)添加additivity=”false”是很有必要的,可以避免记录大量重复的日志。 | ||
--> |
3 changes: 0 additions & 3 deletions
3
...tarter/src/main/java/top/klw8/alita/service/authority/ISystemAuthoritysCatlogService.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
218 changes: 109 additions & 109 deletions
218
...spring-boot-starter/src/main/java/top/klw8/alita/starter/cfg/SpringDataMongoDbConfig.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,109 +1,109 @@ | ||
package top.klw8.alita.starter.cfg; | ||
|
||
import java.util.Collection; | ||
import java.util.Collections; | ||
import java.util.List; | ||
|
||
import javax.annotation.Resource; | ||
|
||
import org.springframework.boot.context.properties.EnableConfigurationProperties; | ||
import org.springframework.context.annotation.Bean; | ||
import org.springframework.context.annotation.Configuration; | ||
import org.springframework.data.mongodb.MongoDbFactory; | ||
import org.springframework.data.mongodb.config.MongoConfigurationSupport; | ||
import org.springframework.data.mongodb.core.MongoTemplate; | ||
import org.springframework.data.mongodb.core.SimpleMongoDbFactory; | ||
import org.springframework.data.mongodb.core.convert.DbRefResolver; | ||
import org.springframework.data.mongodb.core.convert.DefaultDbRefResolver; | ||
import org.springframework.data.mongodb.core.convert.DefaultMongoTypeMapper; | ||
import org.springframework.data.mongodb.core.convert.MappingMongoConverter; | ||
import org.springframework.data.mongodb.core.convert.MongoCustomConversions; | ||
import org.springframework.data.mongodb.core.mapping.MongoMappingContext; | ||
import org.springframework.data.mongodb.repository.config.EnableMongoRepositories; | ||
import org.springframework.util.Assert; | ||
|
||
import com.mongodb.MongoClient; | ||
import com.mongodb.MongoClientURI; | ||
|
||
import top.klw8.alita.config.beans.mongodb.MongoConfigBean; | ||
|
||
/** | ||
* @ClassName: SpringDataMongoDbConfig | ||
* @Description: spring-data-mongodb 非 Reactive 的配制 | ||
* @author klw | ||
* @date 2018-12-21 16:33:12 | ||
*/ | ||
@Configuration | ||
@EnableConfigurationProperties(MongoConfigBean.class) | ||
@EnableMongoRepositories | ||
public class SpringDataMongoDbConfig extends MongoConfigurationSupport { | ||
|
||
@Resource | ||
private MongoConfigBean mongoConfigBean; | ||
|
||
public MongoClient mongoClient() { | ||
Assert.notNull(mongoConfigBean, "mongodb 配置不能为空"); | ||
Assert.hasText(mongoConfigBean.getConnectUrl(), "mongodb 连接字符串不能为空"); | ||
return new MongoClient(new MongoClientURI(mongoConfigBean.getConnectUrl())); | ||
} | ||
|
||
@Bean | ||
public MongoDbFactory mongoDbFactory() { | ||
return new SimpleMongoDbFactory(mongoClient(), getDatabaseName()); | ||
} | ||
|
||
@Override | ||
protected String getDatabaseName() { | ||
Assert.notNull(mongoConfigBean, "mongodb 配置不能为空"); | ||
Assert.hasText(mongoConfigBean.getDbName(), "mongodb 数据库名不能为空"); | ||
return mongoConfigBean.getDbName(); | ||
} | ||
|
||
@Override | ||
protected Collection<String> getMappingBasePackages() { | ||
Assert.notNull(mongoConfigBean, "mongodb 配置不能为空"); | ||
List<String> mapPackages = mongoConfigBean.getMapPackages(); | ||
Assert.notEmpty(mapPackages, "要扫描并映射的包路径不能为空"); | ||
return mapPackages; | ||
} | ||
|
||
public MappingMongoConverter mappingMongoConverter() throws Exception { | ||
// 一定要把 MappingMongoConverter 配制成 Bean,否则自定义转换器不生效!!! | ||
// 纠结了N个小时,就是差了这个 !!! | ||
// DbRefResolver dbRefResolver = new DefaultDbRefResolver(mongoDbFactory()); | ||
// MappingMongoConverter converter = new MappingMongoConverter(dbRefResolver, mongoMappingContext()); | ||
// List<Converter<?, ?>> converters = new ArrayList<>(); | ||
// converters.add(LongIdToIdConverter.INSTANCE); | ||
// converters.add(IdToLongIdConverter.INSTANCE); | ||
// converter.setCustomConversions(new MongoCustomConversions(converters)); | ||
// converter.setCustomConversions(new MongoCustomConversions(Collections.emptyList())); | ||
DbRefResolver dbRefResolver = new DefaultDbRefResolver(mongoDbFactory()); | ||
MongoCustomConversions conversions = new MongoCustomConversions(Collections.emptyList()); | ||
|
||
MongoMappingContext mappingContext = new MongoMappingContext(); | ||
mappingContext.setSimpleTypeHolder(conversions.getSimpleTypeHolder()); | ||
mappingContext.afterPropertiesSet(); | ||
|
||
MappingMongoConverter converter = new MappingMongoConverter(dbRefResolver, mappingContext); | ||
converter.setCustomConversions(conversions); | ||
converter.afterPropertiesSet(); | ||
converter.setTypeMapper(new DefaultMongoTypeMapper(null)); | ||
return converter; | ||
} | ||
|
||
@Bean | ||
public MongoTemplate mongoTemplate() throws Exception { | ||
// 去掉保存到数据中的 _class 字段 | ||
// MappingMongoConverter converter = mappingMongoConverter(); | ||
// converter.setTypeMapper(new DefaultMongoTypeMapper(null)); | ||
// return new MongoTemplate(mongoDbFactory(), converter); | ||
|
||
return new MongoTemplate(mongoDbFactory(), mappingMongoConverter()); | ||
} | ||
|
||
} | ||
//package top.klw8.alita.starter.cfg; | ||
// | ||
//import java.util.Collection; | ||
//import java.util.Collections; | ||
//import java.util.List; | ||
// | ||
//import javax.annotation.Resource; | ||
// | ||
//import com.mongodb.MongoClientURI; | ||
//import com.mongodb.client.MongoClient; | ||
//import com.mongodb.reactivestreams.client.internal.MongoClientImpl; | ||
//import org.springframework.boot.context.properties.EnableConfigurationProperties; | ||
//import org.springframework.context.annotation.Bean; | ||
//import org.springframework.context.annotation.Configuration; | ||
//import org.springframework.data.mongodb.MongoDatabaseFactory; | ||
//import org.springframework.data.mongodb.config.MongoConfigurationSupport; | ||
//import org.springframework.data.mongodb.core.MongoTemplate; | ||
//import org.springframework.data.mongodb.core.SimpleMongoClientDatabaseFactory; | ||
//import org.springframework.data.mongodb.core.convert.DbRefResolver; | ||
//import org.springframework.data.mongodb.core.convert.DefaultDbRefResolver; | ||
//import org.springframework.data.mongodb.core.convert.DefaultMongoTypeMapper; | ||
//import org.springframework.data.mongodb.core.convert.MappingMongoConverter; | ||
//import org.springframework.data.mongodb.core.convert.MongoCustomConversions; | ||
//import org.springframework.data.mongodb.core.mapping.MongoMappingContext; | ||
//import org.springframework.data.mongodb.repository.config.EnableMongoRepositories; | ||
//import org.springframework.util.Assert; | ||
// | ||
//import top.klw8.alita.config.beans.mongodb.MongoConfigBean; | ||
// | ||
///** | ||
// * @author klw | ||
// * @ClassName: SpringDataMongoDbConfig | ||
// * @Description: spring-data-mongodb 非 Reactive 的配制 | ||
// * @date 2018-12-21 16:33:12 | ||
// */ | ||
//@Configuration | ||
//@EnableConfigurationProperties(MongoConfigBean.class) | ||
//@EnableMongoRepositories | ||
//public class SpringDataMongoDbConfig extends MongoConfigurationSupport { | ||
// | ||
// @Resource | ||
// private MongoConfigBean mongoConfigBean; | ||
// | ||
// public MongoClient mongoClient() { | ||
// Assert.notNull(mongoConfigBean, "mongodb 配置不能为空"); | ||
// Assert.hasText(mongoConfigBean.getConnectUrl(), "mongodb 连接字符串不能为空"); | ||
//// return new MongoClientImpl(new MongoClientURI(mongoConfigBean.getConnectUrl())); | ||
// // TODO | ||
// return null; | ||
// } | ||
// | ||
// @Bean | ||
// public MongoDatabaseFactory mongoDbFactory() { | ||
// return new SimpleMongoClientDatabaseFactory(mongoClient(), getDatabaseName()); | ||
// } | ||
// | ||
// @Override | ||
// protected String getDatabaseName() { | ||
// Assert.notNull(mongoConfigBean, "mongodb 配置不能为空"); | ||
// Assert.hasText(mongoConfigBean.getDbName(), "mongodb 数据库名不能为空"); | ||
// return mongoConfigBean.getDbName(); | ||
// } | ||
// | ||
// @Override | ||
// protected Collection<String> getMappingBasePackages() { | ||
// Assert.notNull(mongoConfigBean, "mongodb 配置不能为空"); | ||
// List<String> mapPackages = mongoConfigBean.getMapPackages(); | ||
// Assert.notEmpty(mapPackages, "要扫描并映射的包路径不能为空"); | ||
// return mapPackages; | ||
// } | ||
// | ||
// public MappingMongoConverter mappingMongoConverter() throws Exception { | ||
// // 一定要把 MappingMongoConverter 配制成 Bean,否则自定义转换器不生效!!! | ||
// // 纠结了N个小时,就是差了这个 !!! | ||
// // DbRefResolver dbRefResolver = new DefaultDbRefResolver(mongoDbFactory()); | ||
// // MappingMongoConverter converter = new MappingMongoConverter(dbRefResolver, mongoMappingContext()); | ||
// // List<Converter<?, ?>> converters = new ArrayList<>(); | ||
// // converters.add(LongIdToIdConverter.INSTANCE); | ||
// // converters.add(IdToLongIdConverter.INSTANCE); | ||
// | ||
// // converter.setCustomConversions(new MongoCustomConversions(converters)); | ||
// // converter.setCustomConversions(new MongoCustomConversions(Collections.emptyList())); | ||
// | ||
// DbRefResolver dbRefResolver = new DefaultDbRefResolver(mongoDbFactory()); | ||
// MongoCustomConversions conversions = new MongoCustomConversions(Collections.emptyList()); | ||
// | ||
// MongoMappingContext mappingContext = new MongoMappingContext(); | ||
// mappingContext.setSimpleTypeHolder(conversions.getSimpleTypeHolder()); | ||
// mappingContext.afterPropertiesSet(); | ||
// | ||
// MappingMongoConverter converter = new MappingMongoConverter(dbRefResolver, mappingContext); | ||
// converter.setCustomConversions(conversions); | ||
// converter.afterPropertiesSet(); | ||
// converter.setTypeMapper(new DefaultMongoTypeMapper(null)); | ||
// | ||
// return converter; | ||
// } | ||
// | ||
// @Bean | ||
// public MongoTemplate mongoTemplate() throws Exception { | ||
// // 去掉保存到数据中的 _class 字段 | ||
// // MappingMongoConverter converter = mappingMongoConverter(); | ||
// // converter.setTypeMapper(new DefaultMongoTypeMapper(null)); | ||
// // return new MongoTemplate(mongoDbFactory(), converter); | ||
// | ||
// return new MongoTemplate(mongoDbFactory(), mappingMongoConverter()); | ||
// } | ||
// | ||
//} |
Oops, something went wrong.