修复定时删除日志

This commit is contained in:
whyour 2022-02-19 17:36:49 +08:00
parent cf5f1b6f25
commit 7d6e1d3e3d
9 changed files with 146 additions and 96 deletions

View File

@ -4,7 +4,7 @@ import { DataTypes, Model, ModelDefined } from 'sequelize';
export class Crontab {
name?: string;
command: string;
schedule: string;
schedule?: string;
timestamp?: string;
saved?: boolean;
id?: number;

View File

@ -7,11 +7,15 @@ import EnvService from '../services/env';
import _ from 'lodash';
import { DependenceModel } from '../data/dependence';
import { Op } from 'sequelize';
import SystemService from '../services/system';
import ScheduleService from '../services/schedule';
export default async () => {
const cronService = Container.get(CronService);
const envService = Container.get(EnvService);
const dependenceService = Container.get(DependenceService);
const systemService = Container.get(SystemService);
const scheduleService = Container.get(ScheduleService);
// 初始化更新所有任务状态为空闲
await CrontabModel.update(
@ -53,6 +57,20 @@ export default async () => {
// 初始化保存一次ck和定时任务数据
await cronService.autosave_crontab();
await envService.set_envs();
// 运行删除日志任务
const data = await systemService.getLogRemoveFrequency();
if (data && data.info && data.info.frequency) {
const cron = {
id: data.id,
name: '删除日志',
command: `ql rmlog ${data.info.frequency}`,
};
await scheduleService.createIntervalTask(cron, {
days: data.info.frequency,
runImmediately: true,
});
}
};
function randomSchedule(from: number, to: number) {

View File

@ -3,24 +3,33 @@ import winston from 'winston';
import nodeSchedule from 'node-schedule';
import { Crontab } from '../data/cron';
import { exec } from 'child_process';
import {
ToadScheduler,
SimpleIntervalJob,
Task,
SimpleIntervalSchedule,
} from 'toad-scheduler';
@Service()
export default class ScheduleService {
private scheduleStacks = new Map<number, nodeSchedule.Job>();
private scheduleStacks = new Map<string, nodeSchedule.Job>();
private intervalSchedule = new ToadScheduler();
constructor(@Inject('logger') private logger: winston.Logger) {}
async generateSchedule({ id = 0, command, name, schedule }: Crontab) {
async createCronTask({ id = 0, command, name, schedule = '' }: Crontab) {
const _id = this.formatId(id);
this.logger.info(
'[创建定时任务]任务ID: %scron: %s任务名: %s执行命令: %s',
id,
'[创建cron任务]任务ID: %scron: %s任务名: %s执行命令: %s',
_id,
schedule,
name,
command,
);
this.scheduleStacks.set(
id,
_id,
nodeSchedule.scheduleJob(id + '', schedule, async () => {
try {
exec(command, async (error, stdout, stderr) => {
@ -55,8 +64,67 @@ export default class ScheduleService {
);
}
async cancelSchedule({ id = 0, name }: Crontab) {
async cancelCronTask({ id = 0, name }: Crontab) {
const _id = this.formatId(id);
this.logger.info('[取消定时任务],任务名:%s', name);
this.scheduleStacks.has(id) && this.scheduleStacks.get(id)?.cancel();
this.scheduleStacks.has(_id) && this.scheduleStacks.get(_id)?.cancel();
}
async createIntervalTask(
{ id = 0, command, name = '' }: Crontab,
schedule: SimpleIntervalSchedule,
) {
const _id = this.formatId(id);
this.logger.info(
'[创建interval任务]任务ID: %s任务名: %s执行命令: %s',
_id,
name,
command,
);
const task = new Task(name, async () => {
try {
exec(command, async (error, stdout, stderr) => {
if (error) {
await this.logger.info(
'执行任务%s失败时间%s, 错误信息:%j',
command,
new Date().toLocaleString(),
error,
);
}
if (stderr) {
await this.logger.info(
'执行任务%s失败时间%s, 错误信息:%j',
command,
new Date().toLocaleString(),
stderr,
);
}
});
} catch (error) {
await this.logger.info(
'执行任务%s失败时间%s, 错误信息:%j',
command,
new Date().toLocaleString(),
error,
);
} finally {
}
});
const job = new SimpleIntervalJob({ ...schedule }, task, _id);
this.intervalSchedule.addIntervalJob(job);
}
async cancelIntervalTask({ id = 0, name }: Crontab) {
const _id = this.formatId(id);
this.logger.info('[取消interval任务]任务ID: %s任务名%s', _id, name);
this.intervalSchedule.removeById(_id);
}
private formatId(id: number): string {
return String(id);
}
}

View File

@ -24,7 +24,7 @@ export default class SystemService {
public async getLogRemoveFrequency() {
const doc = await this.getDb({ type: AuthDataType.removeLogFrequency });
return (doc && doc.info) || {};
return doc || {};
}
private async updateAuthDb(payload: AuthInfo): Promise<any> {
@ -65,11 +65,13 @@ export default class SystemService {
id: result.id,
name: '删除日志',
command: `ql rmlog ${frequency}`,
schedule: `5 23 */${frequency} * *`,
};
await this.scheduleService.cancelSchedule(cron);
await this.scheduleService.cancelIntervalTask(cron);
if (frequency > 0) {
await this.scheduleService.generateSchedule(cron);
await this.scheduleService.createIntervalTask(cron, {
days: frequency,
runImmediately: true,
});
}
return { code: 200, data: { ...cron } };
}

View File

@ -360,9 +360,9 @@ export default class UserService {
command: `ql rmlog ${frequency}`,
schedule: `5 23 */${frequency} * *`,
};
await this.scheduleService.cancelSchedule(cron);
await this.scheduleService.cancelCronTask(cron);
if (frequency > 0) {
await this.scheduleService.generateSchedule(cron);
await this.scheduleService.createCronTask(cron);
}
return { code: 200, data: { ...cron } };
}

View File

@ -51,6 +51,7 @@
"serve-handler": "^6.1.3",
"sockjs": "^0.3.21",
"sqlite3": "^5.0.2",
"toad-scheduler": "^1.6.0",
"typedi": "^0.8.0",
"uuid": "^8.3.2",
"winston": "^3.3.3",

View File

@ -1,8 +1,10 @@
.container {
display: flex;
justify-content: center;
align-items: center;
padding: 50px 130px;
flex-wrap: wrap;
max-width: 800px;
margin: 20px auto;
.right {
display: flex;
justify-content: center;

View File

@ -12,6 +12,7 @@ import {
Modal,
message,
Typography,
Input,
} from 'antd';
import config from '@/utils/config';
import { PageContainer } from '@ant-design/pro-layout';
@ -273,8 +274,10 @@ const Setting = ({
request
.get(`${config.apiPrefix}system/log/remove`)
.then((data: any) => {
setLogRemoveFrequency(data.data.frequency);
form.setFieldsValue({ frequency: data.data.frequency });
if (data.data.info) {
const { frequency } = data.data.info;
setLogRemoveFrequency(frequency);
}
})
.catch((error: any) => {
console.log(error);
@ -367,14 +370,19 @@ const Setting = ({
name="frequency"
tooltip="每x天自动删除x天以前的日志"
>
<InputNumber
addonBefore="每"
addonAfter="天"
style={{ width: 150 }}
min={0}
onBlur={updateRemoveLogFrequency}
onChange={(value) => setLogRemoveFrequency(value)}
/>
<Input.Group compact>
<InputNumber
addonBefore="每"
addonAfter="天"
style={{ width: 150 }}
min={0}
value={logRemoveFrequency}
onChange={(value) => setLogRemoveFrequency(value)}
/>
<Button type="primary" onClick={updateRemoveLogFrequency}>
</Button>
</Input.Group>
</Form.Item>
<Form.Item label="检查更新" name="update">
<CheckUpdate socketMessage={socketMessage} />

View File

@ -868,7 +868,7 @@
"@sentry/browser@6.17.2":
version "6.17.2"
resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-6.17.2.tgz#8e794b846f43a341068c83420918d896683d903e"
resolved "https://registry.npmjs.org/@sentry/browser/-/browser-6.17.2.tgz"
integrity sha512-4Ow5z9GxK5dG9+stBNKb7s6NoxE4wgEcHRmO66QTK4gH2NNmzV4R/aaZ7iDoS/lD86sH0M86jm76dpg9uiJPmw==
dependencies:
"@sentry/core" "6.17.2"
@ -878,7 +878,7 @@
"@sentry/core@6.17.2":
version "6.17.2"
resolved "https://registry.yarnpkg.com/@sentry/core/-/core-6.17.2.tgz#f218920f269ccdbaee20a092bbc90a71a007cc88"
resolved "https://registry.npmjs.org/@sentry/core/-/core-6.17.2.tgz"
integrity sha512-Uew0CNMr+QvowrF4EJYjOUgHep/sZJ3l5zevPEELugIgqWBodd+ZDCV3fQFR7cr6KOqx1rMgVrgcKIkLl0l+RA==
dependencies:
"@sentry/hub" "6.17.2"
@ -889,7 +889,7 @@
"@sentry/hub@6.17.2":
version "6.17.2"
resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-6.17.2.tgz#d92accada845fa21fff1b2b491d3c6964851693b"
resolved "https://registry.npmjs.org/@sentry/hub/-/hub-6.17.2.tgz"
integrity sha512-CMi6jU920bTwRTmGHjP4u8toOx4gm1dsx+rsxvp+FKzqRwpwoyi9mOw8oEYERVzaqaYceGdFylyRUrjdf0f77g==
dependencies:
"@sentry/types" "6.17.2"
@ -898,7 +898,7 @@
"@sentry/minimal@6.17.2":
version "6.17.2"
resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-6.17.2.tgz#3b482a0d76aa33b6c9441dd21acbcc3a113e5120"
resolved "https://registry.npmjs.org/@sentry/minimal/-/minimal-6.17.2.tgz"
integrity sha512-Cdh+iM6QhLKfxwUWWP4mk2K7+EsQj4tuF2dGQke4Zcbp7zQ7wbcMruUcZHiZfvg5kiSYxwNVkH7cXMzcO7AJsg==
dependencies:
"@sentry/hub" "6.17.2"
@ -907,7 +907,7 @@
"@sentry/node@^6.17.2":
version "6.17.2"
resolved "https://registry.yarnpkg.com/@sentry/node/-/node-6.17.2.tgz#32a5fa00b64a331073daf1e44f500c8c57184eb1"
resolved "https://registry.npmjs.org/@sentry/node/-/node-6.17.2.tgz"
integrity sha512-358z45WaejnsE8RZVpuLJJiFVCSEi0TRY7P60CljZuz8rnvniD3G0tuXChvu4djVty8NScWZHT/QoxvuJdTHgQ==
dependencies:
"@sentry/core" "6.17.2"
@ -922,7 +922,7 @@
"@sentry/react@^6.17.2":
version "6.17.2"
resolved "https://registry.yarnpkg.com/@sentry/react/-/react-6.17.2.tgz#ba2a65141ef3f3c2416313b448e06f6764a9f274"
resolved "https://registry.npmjs.org/@sentry/react/-/react-6.17.2.tgz"
integrity sha512-/5mcHLxBhdh67EI6mGj20NwGCZbBjJdEOmTNTUydvNGXa9Rvrluf1iz2hNSH4sju0d/Qt1rakxC5y8gWy1E5Kw==
dependencies:
"@sentry/browser" "6.17.2"
@ -934,7 +934,7 @@
"@sentry/tracing@6.17.2", "@sentry/tracing@^6.17.2":
version "6.17.2"
resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-6.17.2.tgz#437337071fdeffa319746905b3706518b099ec6b"
resolved "https://registry.npmjs.org/@sentry/tracing/-/tracing-6.17.2.tgz"
integrity sha512-oWY2Ga+5D5f90utvfF2Y0eQvme+eS768ZWjR+klRYgZWoY8r1v8uWwWsvroYU1g+h6X0G/xh3giFjsdOWtRENw==
dependencies:
"@sentry/hub" "6.17.2"
@ -945,12 +945,12 @@
"@sentry/types@6.17.2":
version "6.17.2"
resolved "https://registry.yarnpkg.com/@sentry/types/-/types-6.17.2.tgz#4dde3423db5953e798b19ed29618c28fc7bf2e30"
resolved "https://registry.npmjs.org/@sentry/types/-/types-6.17.2.tgz"
integrity sha512-UrFLRDz5mn253O8k/XftLxoldF+NyZdkqKLGIQmST5HEVr7ub9nQJ4Y5ZFA3zJYWpraaW8faIbuw+pgetC8hmQ==
"@sentry/utils@6.17.2":
version "6.17.2"
resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-6.17.2.tgz#e8044e753b47f86068053c8d79e4ae61a39b6732"
resolved "https://registry.npmjs.org/@sentry/utils/-/utils-6.17.2.tgz"
integrity sha512-ePWtO44KJQwUULOiU86fa1WU3Ird2TH0i39gqB2d3zNS3QyVp9qPlzSdPKSPJ9LdgadzBHw7ikEuE+GY8JTrhA==
dependencies:
"@sentry/types" "6.17.2"
@ -1219,13 +1219,6 @@
resolved "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz"
integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==
"@types/nedb@^1.8.11":
version "1.8.12"
resolved "https://registry.npmjs.org/@types/nedb/-/nedb-1.8.12.tgz"
integrity sha512-ICDoQMORMjOSqfNFXT4ENXfwwCir1BPblXNm0SPH7C4Q10ou+pvVagcFAJ+rrzf3A47tGU4K/KbzKu7wO9j45Q==
dependencies:
"@types/node" "*"
"@types/node-fetch@^2.5.8":
version "2.5.11"
resolved "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.5.11.tgz"
@ -2290,11 +2283,6 @@ async-validator@^4.0.2:
resolved "https://registry.npmjs.org/async-validator/-/async-validator-4.0.3.tgz"
integrity sha512-LVoIbJNHPKsO7FMLamo88uxdrvayGkF3vLTMTeiN3CqAbP3qSafLRc6yx3Sq9lHkiEOLNpoA2jwwnfGDdu1SMQ==
async@0.2.10:
version "0.2.10"
resolved "https://registry.npmjs.org/async/-/async-0.2.10.tgz"
integrity sha1-trvgsGdLnXGXCMo43owjfLUmw9E=
async@^1.5.0:
version "1.5.2"
resolved "https://registry.npmjs.org/async/-/async-1.5.2.tgz"
@ -2492,13 +2480,6 @@ binary-extensions@^2.0.0:
resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz"
integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==
binary-search-tree@0.2.5:
version "0.2.5"
resolved "https://registry.npmjs.org/binary-search-tree/-/binary-search-tree-0.2.5.tgz"
integrity sha1-fbs7IQ/coIJFDa0jNMMErzm9x4Q=
dependencies:
underscore "~1.4.4"
bindings@^1.5.0:
version "1.5.0"
resolved "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz"
@ -3169,7 +3150,7 @@ concat-map@0.0.1:
concurrently@^7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-7.0.0.tgz#78d31b441cec338dab03316c221a2f9a67c529b0"
resolved "https://registry.npmjs.org/concurrently/-/concurrently-7.0.0.tgz"
integrity sha512-WKM7PUsI8wyXpF80H+zjHP32fsgsHNQfPLw/e70Z5dYkV7hF+rf8q3D+ScWJIEr57CpkO3OWBko6hwhQLPR8Pw==
dependencies:
chalk "^4.1.0"
@ -3523,7 +3504,7 @@ csstype@^3.0.2:
darkreader@4.9.40:
version "4.9.40"
resolved "https://registry.yarnpkg.com/darkreader/-/darkreader-4.9.40.tgz#9217a2ae83d8aca0b4dc129bba78a0617aca5bce"
resolved "https://registry.npmjs.org/darkreader/-/darkreader-4.9.40.tgz"
integrity sha512-Dm8S5jkXSIxvq9WitcvuH4KexV9ZuzGqDMsFOm2VwXzRkMo9VIg8udjq2Mm7cM6SaQSp/zzH4VIWioX93iWayQ==
dashdash@^1.12.0:
@ -3558,7 +3539,7 @@ date-fns@2.x:
date-fns@^2.16.1:
version "2.28.0"
resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.28.0.tgz#9570d656f5fc13143e50c975a3b6bbeb46cd08b2"
resolved "https://registry.npmjs.org/date-fns/-/date-fns-2.28.0.tgz"
integrity sha512-8d35hViGYx/QH0icHYCeLmsLmMUheMmTyV9Fcm6gvNwdw31yXXH+O85sOBJ+OLnLQMKZowvpKb6FgMIQjcpvQw==
dayjs@1.x:
@ -4957,11 +4938,6 @@ ignore-walk@^3.0.1:
dependencies:
minimatch "^3.0.4"
immediate@~3.0.5:
version "3.0.6"
resolved "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz"
integrity sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=
import-cwd@^2.0.0:
version "2.1.0"
resolved "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz"
@ -6224,13 +6200,6 @@ levn@~0.3.0:
prelude-ls "~1.1.2"
type-check "~0.3.2"
lie@3.1.1:
version "3.1.1"
resolved "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz"
integrity sha1-mkNrLMd0bKWd56QfpGmz77dr2H4=
dependencies:
immediate "~3.0.5"
lines-and-columns@^1.1.6:
version "1.1.6"
resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz"
@ -6294,13 +6263,6 @@ loader-utils@^1.1.0:
emojis-list "^3.0.0"
json5 "^1.0.1"
localforage@^1.3.0:
version "1.9.0"
resolved "https://registry.npmjs.org/localforage/-/localforage-1.9.0.tgz"
integrity sha512-rR1oyNrKulpe+VM9cYmcFn6tsHuokyVHFaCM3+osEmxaHTbEk8oQu6eGDfS6DQLWi/N67XRmB8ECG37OES368g==
dependencies:
lie "3.1.1"
locate-path@^3.0.0:
version "3.0.0"
resolved "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz"
@ -6690,7 +6652,7 @@ mixin-deep@^1.2.0:
for-in "^1.0.2"
is-extendable "^1.0.1"
"mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.5, mkdirp@~0.5.1:
"mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.5:
version "0.5.5"
resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz"
integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==
@ -6761,17 +6723,6 @@ natural-compare@^1.4.0:
resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz"
integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=
nedb@^1.8.0:
version "1.8.0"
resolved "https://registry.npmjs.org/nedb/-/nedb-1.8.0.tgz"
integrity sha1-DjUCzYLABNU1WkPJ5VV3vXvZHYg=
dependencies:
async "0.2.10"
binary-search-tree "0.2.5"
localforage "^1.3.0"
mkdirp "~0.5.1"
underscore "~1.4.4"
needle@^2.2.1:
version "2.9.1"
resolved "https://registry.npmjs.org/needle/-/needle-2.9.1.tgz"
@ -9807,7 +9758,7 @@ source-map@^0.7.3, source-map@~0.7.2:
spawn-command@^0.0.2-1:
version "0.0.2-1"
resolved "https://registry.yarnpkg.com/spawn-command/-/spawn-command-0.0.2-1.tgz#62f5e9466981c1b796dc5929937e11c9c6921bd0"
resolved "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz"
integrity sha1-YvXpRmmBwbeW3Fkpk34RycaSG9A=
spdx-correct@^3.0.0:
@ -10348,6 +10299,11 @@ to-regex@^3.0.1, to-regex@^3.0.2:
regex-not "^1.0.2"
safe-regex "^1.1.0"
toad-scheduler@^1.6.0:
version "1.6.0"
resolved "https://registry.yarnpkg.com/toad-scheduler/-/toad-scheduler-1.6.0.tgz#717b867d2f5da67d13d166ec16adc39d0506c537"
integrity sha512-+TdQhHTYLKfjXxLrAi4DgEptoQd99jUcr2teJnQrGlb70MEVrwP4SlVsaQO/dxCsNIM5qmYwZmynQd9tOPDRLQ==
toggle-selection@^1.0.6:
version "1.0.6"
resolved "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz"
@ -10403,7 +10359,7 @@ tr46@^2.1.0:
tree-kill@^1.2.2:
version "1.2.2"
resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc"
resolved "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz"
integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==
triple-beam@^1.2.0, triple-beam@^1.3.0:
@ -10548,11 +10504,6 @@ undefsafe@^2.0.3:
dependencies:
debug "^2.2.0"
underscore@~1.4.4:
version "1.4.4"
resolved "https://registry.npmjs.org/underscore/-/underscore-1.4.4.tgz"
integrity sha1-YaajIBBiKvoHljvzJSA88SI51gQ=
union-value@^1.0.0:
version "1.0.1"
resolved "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz"
@ -11173,7 +11124,7 @@ yargs@^15.4.1:
yargs@^16.2.0:
version "16.2.0"
resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66"
resolved "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz"
integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==
dependencies:
cliui "^7.0.2"