feat: add logrotate to cron in nestjs (#839)

* feat: add logrotate to cron in nestjs

* fix: set max size to 5m and remove old logs

* fix: logrotate command invalid
This commit is contained in:
Eli Bosley
2024-01-11 17:17:23 -05:00
committed by GitHub
parent 764f65ff61
commit a0dfbb4e15
8 changed files with 104 additions and 11 deletions

View File

@@ -1,5 +1,5 @@
[api]
version="3.3.0+89cb2544"
version="3.3.0+eff31423"
extraOrigins="https://google.com,https://test.com"
[local]
[notifier]

View File

@@ -1,5 +1,5 @@
[api]
version="3.3.0+89cb2544"
version="3.3.0+eff31423"
extraOrigins="https://google.com,https://test.com"
[local]
[notifier]
@@ -21,4 +21,4 @@ dynamicRemoteAccessType="DISABLED"
[upc]
apikey="unupc_fab6ff6ffe51040595c6d9ffb63a353ba16cc2ad7d93f813a2e80a5810"
[connectionStatus]
minigraph="PRE_INIT"
minigraph="ERROR_RETRYING"

67
api/package-lock.json generated
View File

@@ -22,6 +22,7 @@
"@nestjs/graphql": "^12.0.11",
"@nestjs/passport": "^10.0.2",
"@nestjs/platform-fastify": "^10.2.9",
"@nestjs/schedule": "^4.0.0",
"@reduxjs/toolkit": "^1.9.5",
"@reflet/cron": "^1.3.1",
"@runonflux/nat-upnp": "^1.0.2",
@@ -3555,6 +3556,29 @@
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
"integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="
},
"node_modules/@nestjs/schedule": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/@nestjs/schedule/-/schedule-4.0.0.tgz",
"integrity": "sha512-zz4h54m/F/1qyQKvMJCRphmuwGqJltDAkFxUXCVqJBXEs5kbPt93Pza3heCQOcMH22MZNhGlc9DmDMLXVHmgVQ==",
"dependencies": {
"cron": "3.1.3",
"uuid": "9.0.1"
},
"peerDependencies": {
"@nestjs/common": "^8.0.0 || ^9.0.0 || ^10.0.0",
"@nestjs/core": "^8.0.0 || ^9.0.0 || ^10.0.0",
"reflect-metadata": "^0.1.12"
}
},
"node_modules/@nestjs/schedule/node_modules/cron": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/cron/-/cron-3.1.3.tgz",
"integrity": "sha512-KVxeKTKYj2eNzN4ElnT6nRSbjbfhyxR92O/Jdp6SH3pc05CDJws59jBrZWEMQlxevCiE6QUTrXy+Im3vC3oD3A==",
"dependencies": {
"@types/luxon": "~3.3.0",
"luxon": "~3.4.0"
}
},
"node_modules/@nestjs/testing": {
"version": "10.3.0",
"resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-10.3.0.tgz",
@@ -4295,6 +4319,11 @@
"version": "4.0.2",
"license": "MIT"
},
"node_modules/@types/luxon": {
"version": "3.3.8",
"resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.3.8.tgz",
"integrity": "sha512-jYvz8UMLDgy3a5SkGJne8H7VA7zPV2Lwohjx0V8V31+SqAjNmurWMkk9cQhfvlcnXWudBpK9xPM1n4rljOcHYQ=="
},
"node_modules/@types/mime": {
"version": "3.0.1",
"license": "MIT"
@@ -11295,6 +11324,14 @@
"node": ">=12"
}
},
"node_modules/luxon": {
"version": "3.4.4",
"resolved": "https://registry.npmjs.org/luxon/-/luxon-3.4.4.tgz",
"integrity": "sha512-zobTr7akeGHnv7eBOXcRgMeCP6+uyYsczwmeRCauvpvaAltgNyTbLH/+VaEAPUeWBT+1GuNmz4wC/6jtQzbbVA==",
"engines": {
"node": ">=12"
}
},
"node_modules/magic-string": {
"version": "0.30.2",
"dev": true,
@@ -19524,6 +19561,26 @@
}
}
},
"@nestjs/schedule": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/@nestjs/schedule/-/schedule-4.0.0.tgz",
"integrity": "sha512-zz4h54m/F/1qyQKvMJCRphmuwGqJltDAkFxUXCVqJBXEs5kbPt93Pza3heCQOcMH22MZNhGlc9DmDMLXVHmgVQ==",
"requires": {
"cron": "3.1.3",
"uuid": "9.0.1"
},
"dependencies": {
"cron": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/cron/-/cron-3.1.3.tgz",
"integrity": "sha512-KVxeKTKYj2eNzN4ElnT6nRSbjbfhyxR92O/Jdp6SH3pc05CDJws59jBrZWEMQlxevCiE6QUTrXy+Im3vC3oD3A==",
"requires": {
"@types/luxon": "~3.3.0",
"luxon": "~3.4.0"
}
}
}
},
"@nestjs/testing": {
"version": "10.3.0",
"resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-10.3.0.tgz",
@@ -20009,6 +20066,11 @@
"@types/long": {
"version": "4.0.2"
},
"@types/luxon": {
"version": "3.3.8",
"resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.3.8.tgz",
"integrity": "sha512-jYvz8UMLDgy3a5SkGJne8H7VA7zPV2Lwohjx0V8V31+SqAjNmurWMkk9cQhfvlcnXWudBpK9xPM1n4rljOcHYQ=="
},
"@types/mime": {
"version": "3.0.1"
},
@@ -24583,6 +24645,11 @@
"lru-cache": {
"version": "7.18.3"
},
"luxon": {
"version": "3.4.4",
"resolved": "https://registry.npmjs.org/luxon/-/luxon-3.4.4.tgz",
"integrity": "sha512-zobTr7akeGHnv7eBOXcRgMeCP6+uyYsczwmeRCauvpvaAltgNyTbLH/+VaEAPUeWBT+1GuNmz4wC/6jtQzbbVA=="
},
"magic-string": {
"version": "0.30.2",
"dev": true,

View File

@@ -72,6 +72,7 @@
"@nestjs/graphql": "^12.0.11",
"@nestjs/passport": "^10.0.2",
"@nestjs/platform-fastify": "^10.2.9",
"@nestjs/schedule": "^4.0.0",
"@reduxjs/toolkit": "^1.9.5",
"@reflet/cron": "^1.3.1",
"@runonflux/nat-upnp": "^1.0.2",

View File

@@ -13,17 +13,16 @@ const makeLoggingDirectoryIfNotExists = () => {
}
chmodSync(getters.paths()['log-base'], 0o644);
console.log('here');
if (
existsSync(`${getters.paths()['log-base']}/stdout.log`) &&
statSync(`${getters.paths()['log-base']}/stdout.log`).size > 50_000
statSync(`${getters.paths()['log-base']}/stdout.log`).size > 5_000_000
) {
rmSync(`${getters.paths()['log-base']}/stdout.log`);
}
try {
rmSync(`${getters.paths()['log-base']}/stdout.log.*`);
} catch (e) {
console.log('No old logs to remove');
// Ignore Error
}
};

View File

@@ -8,17 +8,19 @@ import { Module } from '@nestjs/common';
import { Reflector } from '@nestjs/core';
import { ACGuard, AccessControlModule } from 'nest-access-control';
import { LoggerModule } from 'nestjs-pino';
import { CronModule } from '@app/unraid-api/cron/cron.module';
@Module({
imports: [
LoggerModule.forRoot({
pinoHttp: {
logger: apiLogger,
autoLogging: false
autoLogging: false,
},
}),
AccessControlModule.forRoles(setupPermissions()),
AuthModule,
CronModule,
GraphModule,
RestModule,
],
@@ -26,10 +28,7 @@ import { LoggerModule } from 'nestjs-pino';
providers: [
{
provide: 'APP_GUARD',
useFactory: () =>
new GraphqlAuthGuard(
new Reflector(),
),
useFactory: () => new GraphqlAuthGuard(new Reflector()),
},
{
provide: 'APP_GUARD',

View File

@@ -0,0 +1,9 @@
import { LogCleanupService } from '@app/unraid-api/cron/log-cleanup.service';
import { Module } from '@nestjs/common';
import { ScheduleModule } from '@nestjs/schedule';
@Module({
imports: [ScheduleModule.forRoot()],
providers: [LogCleanupService],
})
export class CronModule {}

View File

@@ -0,0 +1,18 @@
import { Injectable, Logger } from '@nestjs/common';
import { Cron } from '@nestjs/schedule';
import { execa } from 'execa';
@Injectable()
export class LogCleanupService {
private readonly logger = new Logger(LogCleanupService.name);
@Cron('* * * * *')
async handleCron() {
try {
this.logger.debug('Running logrotate');
await execa(`/usr/sbin/logrotate`, ['/etc/logrotate.conf']);
} catch (error) {
this.logger.error(error);
}
}
}