日志框架和定时任务线程配置修改修改
This commit is contained in:
@@ -32,6 +32,28 @@
|
|||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
<dependencies>
|
<dependencies>
|
||||||
|
<!--日志管理start-->
|
||||||
|
<!--日志管理-->
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.plumelog</groupId>
|
||||||
|
<artifactId>plumelog-lite-spring-boot-starter</artifactId>
|
||||||
|
<version>3.5.3</version>
|
||||||
|
<exclusions>
|
||||||
|
<exclusion>
|
||||||
|
<artifactId>plumelog-core</artifactId>
|
||||||
|
<groupId>com.plumelog</groupId>
|
||||||
|
</exclusion>
|
||||||
|
</exclusions>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.plumelog</groupId>
|
||||||
|
<artifactId>plumelog-trace</artifactId>
|
||||||
|
<version>3.5.2</version>
|
||||||
|
</dependency>
|
||||||
|
<!--日志管理end-->
|
||||||
|
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.reflections</groupId>
|
<groupId>org.reflections</groupId>
|
||||||
<artifactId>reflections</artifactId>
|
<artifactId>reflections</artifactId>
|
||||||
|
|||||||
@@ -12,17 +12,20 @@
|
|||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*//*
|
||||||
|
|
||||||
package org.nl.config;
|
package org.nl.config;
|
||||||
|
|
||||||
import org.springframework.context.annotation.Bean;
|
import org.springframework.context.annotation.Bean;
|
||||||
import org.springframework.context.annotation.Configuration;
|
import org.springframework.context.annotation.Configuration;
|
||||||
import org.springframework.web.socket.server.standard.ServerEndpointExporter;
|
import org.springframework.web.socket.server.standard.ServerEndpointExporter;
|
||||||
|
|
||||||
|
*/
|
||||||
/**
|
/**
|
||||||
* @author ZhangHouYing
|
* @author ZhangHouYing
|
||||||
* @date 2019-08-24 15:44
|
* @date 2019-08-24 15:44
|
||||||
*/
|
*//*
|
||||||
|
|
||||||
@Configuration
|
@Configuration
|
||||||
public class WebSocketConfig {
|
public class WebSocketConfig {
|
||||||
|
|
||||||
@@ -31,3 +34,4 @@ public class WebSocketConfig {
|
|||||||
return new ServerEndpointExporter();
|
return new ServerEndpointExporter();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|||||||
@@ -1,40 +0,0 @@
|
|||||||
package org.nl.modules.loki.rest;
|
|
||||||
|
|
||||||
import com.alibaba.fastjson.JSONObject;
|
|
||||||
import io.swagger.annotations.Api;
|
|
||||||
import io.swagger.annotations.ApiOperation;
|
|
||||||
import lombok.RequiredArgsConstructor;
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
|
||||||
import org.nl.modules.common.annotation.RateLimiter;
|
|
||||||
import org.nl.modules.loki.service.LokiService;
|
|
||||||
import org.springframework.http.HttpStatus;
|
|
||||||
import org.springframework.http.ResponseEntity;
|
|
||||||
import org.springframework.web.bind.annotation.*;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @Author: lyd
|
|
||||||
* @Description: 日志监控
|
|
||||||
* @Date: 2022-08-15
|
|
||||||
*/
|
|
||||||
@RestController
|
|
||||||
@RequiredArgsConstructor
|
|
||||||
@Api(tags = "日志监控")
|
|
||||||
@RequestMapping("/api/loki")
|
|
||||||
@Slf4j
|
|
||||||
public class LokiController {
|
|
||||||
|
|
||||||
private final LokiService lokiService;
|
|
||||||
|
|
||||||
@GetMapping("/labels/values")
|
|
||||||
@ApiOperation("获取标签")
|
|
||||||
public ResponseEntity<Object> labelsValues() {
|
|
||||||
return new ResponseEntity<>(lokiService.getLabelsValues(), HttpStatus.OK);
|
|
||||||
}
|
|
||||||
|
|
||||||
@PostMapping("/logs")
|
|
||||||
@ApiOperation("获取日志")
|
|
||||||
@RateLimiter(value = 1, timeout = 300) // 限流
|
|
||||||
public ResponseEntity<Object> getLogData(@RequestBody JSONObject json) {
|
|
||||||
return new ResponseEntity<>(lokiService.getLogData(json), HttpStatus.OK);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
package org.nl.modules.loki.service;
|
|
||||||
|
|
||||||
import com.alibaba.fastjson.JSONArray;
|
|
||||||
import com.alibaba.fastjson.JSONObject;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @Author: lyd
|
|
||||||
* @Description: 服务类
|
|
||||||
* @Date: 2022-08-15
|
|
||||||
*/
|
|
||||||
public interface LokiService {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取日志信息
|
|
||||||
* @param json
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
JSONObject getLogData(JSONObject json);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取labels和values树
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
JSONArray getLabelsValues();
|
|
||||||
}
|
|
||||||
@@ -1,113 +0,0 @@
|
|||||||
package org.nl.modules.loki.service.impl;
|
|
||||||
|
|
||||||
import cn.hutool.core.util.CharsetUtil;
|
|
||||||
import cn.hutool.http.HttpUtil;
|
|
||||||
import com.alibaba.fastjson.JSONArray;
|
|
||||||
import com.alibaba.fastjson.JSONObject;
|
|
||||||
import lombok.RequiredArgsConstructor;
|
|
||||||
import org.nl.modules.loki.service.LokiService;
|
|
||||||
import org.springframework.beans.factory.annotation.Value;
|
|
||||||
import org.springframework.stereotype.Service;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @Author: lyd
|
|
||||||
* @Description: 实现类
|
|
||||||
* @Date: 2022-08-15
|
|
||||||
*/
|
|
||||||
@Service
|
|
||||||
@RequiredArgsConstructor
|
|
||||||
public class LokiServiceImpl implements LokiService {
|
|
||||||
|
|
||||||
@Value("${loki.url}")
|
|
||||||
private String lokiUrl;
|
|
||||||
|
|
||||||
@Value("${loki.systemName}")
|
|
||||||
private String systemName;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public JSONObject getLogData(JSONObject json) {
|
|
||||||
String logLabel = "";
|
|
||||||
String logLabelValue = "";
|
|
||||||
Long start = 0L;
|
|
||||||
Long end = 0L;
|
|
||||||
String text = "";
|
|
||||||
String limit = "100";
|
|
||||||
String direction = "backward";
|
|
||||||
if (json.get("logLabel") != null) logLabel = json.getString("logLabel");
|
|
||||||
if (json.get("logLabelValue") != null) logLabelValue = json.getString("logLabelValue");
|
|
||||||
if (json.get("text") != null) text = json.getString("text");
|
|
||||||
if (json.get("start") != null) start = json.getLong("start");
|
|
||||||
if (json.get("end") != null) end = json.getLong("end");
|
|
||||||
if (json.get("limits") != null) limit = json.getString("limits");
|
|
||||||
if (json.get("direction") != null) direction = json.getString("direction");
|
|
||||||
/**
|
|
||||||
* 组织参数
|
|
||||||
* 纳秒数
|
|
||||||
* 1660037391880000000
|
|
||||||
* 1641453208415000000
|
|
||||||
* http://localhost:3100/loki/api/v1/query_range?query={host="localhost"} |= ``&limit=1500&start=1641453208415000000&end=1660027623419419002
|
|
||||||
*/
|
|
||||||
JSONObject parse = null;
|
|
||||||
String query = lokiUrl + "/query_range?query={system=\"" + systemName + "\", " + logLabel + "=\"" + logLabelValue + "\"} |= `" + text + "`";
|
|
||||||
String result = "";
|
|
||||||
if (start==0L) {
|
|
||||||
result = HttpUtil.get(query + "&limit=" + limit + "&direction=" + direction, CharsetUtil.CHARSET_UTF_8);
|
|
||||||
} else {
|
|
||||||
result = HttpUtil.get(query + "&limit=" + limit + "&start=" + start + "&end=" + end + "&direction=" + direction, CharsetUtil.CHARSET_UTF_8);
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
parse = (JSONObject) JSONObject.parse(result);
|
|
||||||
} catch (Exception e) {
|
|
||||||
// reslut的值可能为:too many outstanding requests,无法转化成Json
|
|
||||||
System.out.println("reslut:" + result);
|
|
||||||
// e.printStackTrace();
|
|
||||||
}
|
|
||||||
return parse;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取labels和values树
|
|
||||||
*
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public JSONArray getLabelsValues() {
|
|
||||||
/**
|
|
||||||
* [{
|
|
||||||
* label:
|
|
||||||
* value:
|
|
||||||
* children:[{
|
|
||||||
* label
|
|
||||||
* value
|
|
||||||
* }]
|
|
||||||
* }]
|
|
||||||
*/
|
|
||||||
JSONArray result = new JSONArray();
|
|
||||||
// 获取所有标签
|
|
||||||
String labelString = HttpUtil.get(lokiUrl + "/labels", CharsetUtil.CHARSET_UTF_8);
|
|
||||||
JSONObject parse = (JSONObject) JSONObject.parse(labelString);
|
|
||||||
JSONArray labels = parse.getJSONArray("data");
|
|
||||||
for (int i=0; i<labels.size(); i++) {
|
|
||||||
// 获取标签下的所有值
|
|
||||||
String valueString = HttpUtil.get(lokiUrl + "/label/" + labels.getString(i) + "/values", CharsetUtil.CHARSET_UTF_8);
|
|
||||||
JSONObject parse2 = (JSONObject) JSONObject.parse(valueString);
|
|
||||||
JSONArray values = parse2.getJSONArray("data");
|
|
||||||
JSONArray children = new JSONArray();
|
|
||||||
// 组成树形状态 两级
|
|
||||||
for (int j=0; j<values.size(); j++) {
|
|
||||||
JSONObject leaf = new JSONObject();
|
|
||||||
leaf.put("label", values.getString(j));
|
|
||||||
leaf.put("value", values.getString(j));
|
|
||||||
children.add(leaf);
|
|
||||||
}
|
|
||||||
|
|
||||||
JSONObject node = new JSONObject();
|
|
||||||
node.put("label", labels.getString(i));
|
|
||||||
node.put("value", labels.getString(i));
|
|
||||||
node.put("children", children);
|
|
||||||
result.add(node);
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -39,19 +39,4 @@ public class QuartzConfig {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 注入scheduler到spring
|
|
||||||
* @param quartzJobFactory /
|
|
||||||
* @return Scheduler
|
|
||||||
* @throws Exception /
|
|
||||||
*/
|
|
||||||
@Bean(name = "scheduler")
|
|
||||||
public Scheduler scheduler(QuartzJobFactory quartzJobFactory) throws Exception {
|
|
||||||
SchedulerFactoryBean factoryBean=new SchedulerFactoryBean();
|
|
||||||
factoryBean.setJobFactory(quartzJobFactory);
|
|
||||||
factoryBean.afterPropertiesSet();
|
|
||||||
Scheduler scheduler=factoryBean.getScheduler();
|
|
||||||
scheduler.start();
|
|
||||||
return scheduler;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,8 +21,7 @@ import static org.quartz.TriggerBuilder.newTrigger;
|
|||||||
@Component
|
@Component
|
||||||
public class QuartzManage {
|
public class QuartzManage {
|
||||||
private static final String JOB_NAME = "TASK_";
|
private static final String JOB_NAME = "TASK_";
|
||||||
|
@Resource(name = "quartzScheduler")
|
||||||
@Resource(name = "scheduler")
|
|
||||||
private Scheduler scheduler;
|
private Scheduler scheduler;
|
||||||
|
|
||||||
public void addJob(SysQuartzJob quartzJob) {
|
public void addJob(SysQuartzJob quartzJob) {
|
||||||
|
|||||||
@@ -19,10 +19,19 @@ spring:
|
|||||||
hibernate:
|
hibernate:
|
||||||
dialect: org.hibernate.dialect.MySQL5InnoDBDialect
|
dialect: org.hibernate.dialect.MySQL5InnoDBDialect
|
||||||
enable_lazy_load_no_trans: true
|
enable_lazy_load_no_trans: true
|
||||||
|
quartz:
|
||||||
|
properties:
|
||||||
|
org:
|
||||||
|
quartz:
|
||||||
|
jobStore:
|
||||||
|
threadPool:
|
||||||
|
threadCount: 14
|
||||||
|
# class: org.nl.system.service.quartz.SimpleThreadPool
|
||||||
|
scheduler-name: quartzScheduler
|
||||||
task:
|
task:
|
||||||
pool:
|
pool:
|
||||||
# 核心线程池大小
|
# 核心线程池大小
|
||||||
core-pool-size: 10
|
core-pool-size: 12
|
||||||
# 最大线程数
|
# 最大线程数
|
||||||
max-pool-size: 30
|
max-pool-size: 30
|
||||||
# 活跃时间
|
# 活跃时间
|
||||||
|
|||||||
@@ -63,21 +63,13 @@ https://juejin.cn/post/6844903775631572999
|
|||||||
<appender-ref ref="FILE"/>
|
<appender-ref ref="FILE"/>
|
||||||
</appender>
|
</appender>
|
||||||
|
|
||||||
<!--添加loki-->
|
<appender name="plumelog" class="com.plumelog.lite.logback.appender.LiteAppender">
|
||||||
<appender name="lokiAppender" class="com.github.loki4j.logback.Loki4jAppender">
|
<appName>lms</appName>
|
||||||
<batchTimeoutMs>1000</batchTimeoutMs>
|
<!-- 日志存储位置 -->
|
||||||
<http class="com.github.loki4j.logback.ApacheHttpSender">
|
<logPath>/plumelog/lite</logPath>
|
||||||
<url>${LOKI_URL}/push</url>
|
<!-- 日志保留天数 -->
|
||||||
</http>
|
<keepDay>15</keepDay>
|
||||||
<format>
|
<expand>sleuth</expand>
|
||||||
<label>
|
|
||||||
<pattern>system=${SYSTEM_NAME},level=%level,logType=%X{log_file_type:-logType}</pattern>
|
|
||||||
</label>
|
|
||||||
<message>
|
|
||||||
<pattern>${log.pattern}</pattern>
|
|
||||||
</message>
|
|
||||||
<sortByTime>true</sortByTime>
|
|
||||||
</format>
|
|
||||||
</appender>
|
</appender>
|
||||||
|
|
||||||
<!--开发环境:打印控制台-->
|
<!--开发环境:打印控制台-->
|
||||||
@@ -85,7 +77,7 @@ https://juejin.cn/post/6844903775631572999
|
|||||||
<root level="debug">
|
<root level="debug">
|
||||||
<appender-ref ref="CONSOLE"/>
|
<appender-ref ref="CONSOLE"/>
|
||||||
<appender-ref ref="asyncFileAppender"/>
|
<appender-ref ref="asyncFileAppender"/>
|
||||||
<appender-ref ref="lokiAppender" />
|
<appender-ref ref="plumelog" />
|
||||||
</root>
|
</root>
|
||||||
<logger name="org.springframework" level="ERROR" additivity="false">
|
<logger name="org.springframework" level="ERROR" additivity="false">
|
||||||
<appender-ref ref="CONSOLE"/>
|
<appender-ref ref="CONSOLE"/>
|
||||||
@@ -131,55 +123,55 @@ https://juejin.cn/post/6844903775631572999
|
|||||||
<root level="debug">
|
<root level="debug">
|
||||||
<appender-ref ref="CONSOLE"/>
|
<appender-ref ref="CONSOLE"/>
|
||||||
<appender-ref ref="asyncFileAppender"/>
|
<appender-ref ref="asyncFileAppender"/>
|
||||||
<appender-ref ref="lokiAppender"/>
|
<appender-ref ref="plumelog"/>
|
||||||
</root>
|
</root>
|
||||||
<logger name="org.springframework" level="ERROR" additivity="false">
|
<logger name="org.springframework" level="ERROR" additivity="false">
|
||||||
<appender-ref ref="asyncFileAppender"/>
|
<appender-ref ref="asyncFileAppender"/>
|
||||||
<appender-ref ref="lokiAppender"/>
|
<appender-ref ref="plumelog"/>
|
||||||
</logger>
|
</logger>
|
||||||
<logger name="org.apache" level="ERROR" additivity="false">
|
<logger name="org.apache" level="ERROR" additivity="false">
|
||||||
<appender-ref ref="asyncFileAppender"/>
|
<appender-ref ref="asyncFileAppender"/>
|
||||||
<appender-ref ref="lokiAppender"/>
|
<appender-ref ref="plumelog"/>
|
||||||
</logger>
|
</logger>
|
||||||
<logger name="org.hibernate" level="ERROR" additivity="false">
|
<logger name="org.hibernate" level="ERROR" additivity="false">
|
||||||
<appender-ref ref="asyncFileAppender"/>
|
<appender-ref ref="asyncFileAppender"/>
|
||||||
<appender-ref ref="lokiAppender"/>
|
<appender-ref ref="plumelog"/>
|
||||||
</logger>
|
</logger>
|
||||||
<logger name="io.netty" level="ERROR" additivity="false">
|
<logger name="io.netty" level="ERROR" additivity="false">
|
||||||
<appender-ref ref="asyncFileAppender"/>
|
<appender-ref ref="asyncFileAppender"/>
|
||||||
<appender-ref ref="lokiAppender"/>
|
<appender-ref ref="plumelog"/>
|
||||||
</logger>
|
</logger>
|
||||||
<logger name="jdbc" level="ERROR" additivity="false">
|
<logger name="jdbc" level="ERROR" additivity="false">
|
||||||
<appender-ref ref="asyncFileAppender"/>
|
<appender-ref ref="asyncFileAppender"/>
|
||||||
<appender-ref ref="lokiAppender"/>
|
<appender-ref ref="plumelog"/>
|
||||||
</logger>
|
</logger>
|
||||||
<logger name="io.lettuce" level="ERROR" additivity="false">
|
<logger name="io.lettuce" level="ERROR" additivity="false">
|
||||||
<appender-ref ref="asyncFileAppender"/>
|
<appender-ref ref="asyncFileAppender"/>
|
||||||
<appender-ref ref="lokiAppender"/>
|
<appender-ref ref="plumelog"/>
|
||||||
</logger>
|
</logger>
|
||||||
<logger name="com.fasterxml" level="ERROR" additivity="false">
|
<logger name="com.fasterxml" level="ERROR" additivity="false">
|
||||||
<appender-ref ref="asyncFileAppender"/>
|
<appender-ref ref="asyncFileAppender"/>
|
||||||
<appender-ref ref="lokiAppender"/>
|
<appender-ref ref="plumelog"/>
|
||||||
</logger>
|
</logger>
|
||||||
<logger name="org.quartz" level="ERROR" additivity="false">
|
<logger name="org.quartz" level="ERROR" additivity="false">
|
||||||
<appender-ref ref="asyncFileAppender"/>
|
<appender-ref ref="asyncFileAppender"/>
|
||||||
<appender-ref ref="lokiAppender"/>
|
<appender-ref ref="plumelog"/>
|
||||||
</logger>
|
</logger>
|
||||||
<logger name="com.google" level="ERROR" additivity="false">
|
<logger name="com.google" level="ERROR" additivity="false">
|
||||||
<appender-ref ref="asyncFileAppender"/>
|
<appender-ref ref="asyncFileAppender"/>
|
||||||
<appender-ref ref="lokiAppender"/>
|
<appender-ref ref="plumelog"/>
|
||||||
</logger>
|
</logger>
|
||||||
<logger name="springfox" level="ERROR" additivity="false">
|
<logger name="springfox" level="ERROR" additivity="false">
|
||||||
<appender-ref ref="asyncFileAppender"/>
|
<appender-ref ref="asyncFileAppender"/>
|
||||||
<appender-ref ref="lokiAppender"/>
|
<appender-ref ref="plumelog"/>
|
||||||
</logger>
|
</logger>
|
||||||
<logger name="log4jdbc" level="ERROR" additivity="false">
|
<logger name="log4jdbc" level="ERROR" additivity="false">
|
||||||
<appender-ref ref="asyncFileAppender"/>
|
<appender-ref ref="asyncFileAppender"/>
|
||||||
<appender-ref ref="lokiAppender"/>
|
<appender-ref ref="plumelog"/>
|
||||||
</logger>
|
</logger>
|
||||||
<logger name="nl.basjes" level="ERROR" additivity="false">
|
<logger name="nl.basjes" level="ERROR" additivity="false">
|
||||||
<appender-ref ref="asyncFileAppender"/>
|
<appender-ref ref="asyncFileAppender"/>
|
||||||
<appender-ref ref="lokiAppender"/>
|
<appender-ref ref="plumelog"/>
|
||||||
</logger>
|
</logger>
|
||||||
</springProfile>
|
</springProfile>
|
||||||
|
|
||||||
|
|||||||
@@ -188,7 +188,7 @@
|
|||||||
>
|
>
|
||||||
解锁
|
解锁
|
||||||
</el-button>
|
</el-button>
|
||||||
<el-button
|
<!--<el-button
|
||||||
slot="right"
|
slot="right"
|
||||||
class="filter-item"
|
class="filter-item"
|
||||||
size="mini"
|
size="mini"
|
||||||
@@ -198,7 +198,7 @@
|
|||||||
@click="sync"
|
@click="sync"
|
||||||
>
|
>
|
||||||
仓位同步
|
仓位同步
|
||||||
</el-button>
|
</el-button>-->
|
||||||
</crudOperation>
|
</crudOperation>
|
||||||
<!--表单组件-->
|
<!--表单组件-->
|
||||||
<el-dialog
|
<el-dialog
|
||||||
|
|||||||
Reference in New Issue
Block a user