mirror of
https://activitypub.software/TransFem-org/Sharkey
synced 2024-11-25 23:45:13 +00:00
refactor(backend): refactor logger
This commit is contained in:
parent
1cb85c5c76
commit
dd35f2cce6
31 changed files with 202 additions and 75 deletions
|
@ -50,6 +50,7 @@ import { WebhookService } from './WebhookService.js';
|
||||||
import { ProxyAccountService } from './ProxyAccountService.js';
|
import { ProxyAccountService } from './ProxyAccountService.js';
|
||||||
import { UtilityService } from './UtilityService.js';
|
import { UtilityService } from './UtilityService.js';
|
||||||
import { FileInfoService } from './FileInfoService.js';
|
import { FileInfoService } from './FileInfoService.js';
|
||||||
|
import { ChartLoggerService } from './chart/ChartLoggerService.js';
|
||||||
import FederationChart from './chart/charts/federation.js';
|
import FederationChart from './chart/charts/federation.js';
|
||||||
import NotesChart from './chart/charts/notes.js';
|
import NotesChart from './chart/charts/notes.js';
|
||||||
import UsersChart from './chart/charts/users.js';
|
import UsersChart from './chart/charts/users.js';
|
||||||
|
@ -113,9 +114,11 @@ import { ApPersonService } from './remote/activitypub/models/ApPersonService.js'
|
||||||
import { ApQuestionService } from './remote/activitypub/models/ApQuestionService.js';
|
import { ApQuestionService } from './remote/activitypub/models/ApQuestionService.js';
|
||||||
import { QueueModule } from './queue/QueueModule.js';
|
import { QueueModule } from './queue/QueueModule.js';
|
||||||
import { QueueService } from './QueueService.js';
|
import { QueueService } from './QueueService.js';
|
||||||
|
import { LoggerService } from './LoggerService.js';
|
||||||
import type { Provider } from '@nestjs/common';
|
import type { Provider } from '@nestjs/common';
|
||||||
|
|
||||||
//#region 文字列ベースでのinjection用(循環参照対応のため)
|
//#region 文字列ベースでのinjection用(循環参照対応のため)
|
||||||
|
const $LoggerService: Provider = { provide: 'LoggerService', useExisting: LoggerService };
|
||||||
const $AccountUpdateService: Provider = { provide: 'AccountUpdateService', useExisting: AccountUpdateService };
|
const $AccountUpdateService: Provider = { provide: 'AccountUpdateService', useExisting: AccountUpdateService };
|
||||||
const $AiService: Provider = { provide: 'AiService', useExisting: AiService };
|
const $AiService: Provider = { provide: 'AiService', useExisting: AiService };
|
||||||
const $AntennaService: Provider = { provide: 'AntennaService', useExisting: AntennaService };
|
const $AntennaService: Provider = { provide: 'AntennaService', useExisting: AntennaService };
|
||||||
|
@ -166,6 +169,7 @@ const $VideoProcessingService: Provider = { provide: 'VideoProcessingService', u
|
||||||
const $WebhookService: Provider = { provide: 'WebhookService', useExisting: WebhookService };
|
const $WebhookService: Provider = { provide: 'WebhookService', useExisting: WebhookService };
|
||||||
const $UtilityService: Provider = { provide: 'UtilityService', useExisting: UtilityService };
|
const $UtilityService: Provider = { provide: 'UtilityService', useExisting: UtilityService };
|
||||||
const $FileInfoService: Provider = { provide: 'FileInfoService', useExisting: FileInfoService };
|
const $FileInfoService: Provider = { provide: 'FileInfoService', useExisting: FileInfoService };
|
||||||
|
const $ChartLoggerService: Provider = { provide: 'ChartLoggerService', useExisting: ChartLoggerService };
|
||||||
const $FederationChart: Provider = { provide: 'FederationChart', useExisting: FederationChart };
|
const $FederationChart: Provider = { provide: 'FederationChart', useExisting: FederationChart };
|
||||||
const $NotesChart: Provider = { provide: 'NotesChart', useExisting: NotesChart };
|
const $NotesChart: Provider = { provide: 'NotesChart', useExisting: NotesChart };
|
||||||
const $UsersChart: Provider = { provide: 'UsersChart', useExisting: UsersChart };
|
const $UsersChart: Provider = { provide: 'UsersChart', useExisting: UsersChart };
|
||||||
|
@ -236,6 +240,7 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting
|
||||||
QueueModule,
|
QueueModule,
|
||||||
],
|
],
|
||||||
providers: [
|
providers: [
|
||||||
|
LoggerService,
|
||||||
AccountUpdateService,
|
AccountUpdateService,
|
||||||
AiService,
|
AiService,
|
||||||
AntennaService,
|
AntennaService,
|
||||||
|
@ -286,6 +291,7 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting
|
||||||
WebhookService,
|
WebhookService,
|
||||||
UtilityService,
|
UtilityService,
|
||||||
FileInfoService,
|
FileInfoService,
|
||||||
|
ChartLoggerService,
|
||||||
FederationChart,
|
FederationChart,
|
||||||
NotesChart,
|
NotesChart,
|
||||||
UsersChart,
|
UsersChart,
|
||||||
|
@ -350,6 +356,7 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting
|
||||||
QueueService,
|
QueueService,
|
||||||
|
|
||||||
//#region 文字列ベースでのinjection用(循環参照対応のため)
|
//#region 文字列ベースでのinjection用(循環参照対応のため)
|
||||||
|
$LoggerService,
|
||||||
$AccountUpdateService,
|
$AccountUpdateService,
|
||||||
$AiService,
|
$AiService,
|
||||||
$AntennaService,
|
$AntennaService,
|
||||||
|
@ -400,6 +407,7 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting
|
||||||
$WebhookService,
|
$WebhookService,
|
||||||
$UtilityService,
|
$UtilityService,
|
||||||
$FileInfoService,
|
$FileInfoService,
|
||||||
|
$ChartLoggerService,
|
||||||
$FederationChart,
|
$FederationChart,
|
||||||
$NotesChart,
|
$NotesChart,
|
||||||
$UsersChart,
|
$UsersChart,
|
||||||
|
@ -465,6 +473,7 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting
|
||||||
],
|
],
|
||||||
exports: [
|
exports: [
|
||||||
QueueModule,
|
QueueModule,
|
||||||
|
LoggerService,
|
||||||
AccountUpdateService,
|
AccountUpdateService,
|
||||||
AiService,
|
AiService,
|
||||||
AntennaService,
|
AntennaService,
|
||||||
|
@ -579,6 +588,7 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting
|
||||||
QueueService,
|
QueueService,
|
||||||
|
|
||||||
//#region 文字列ベースでのinjection用(循環参照対応のため)
|
//#region 文字列ベースでのinjection用(循環参照対応のため)
|
||||||
|
$LoggerService,
|
||||||
$AccountUpdateService,
|
$AccountUpdateService,
|
||||||
$AiService,
|
$AiService,
|
||||||
$AntennaService,
|
$AntennaService,
|
||||||
|
|
|
@ -8,10 +8,11 @@ import got, * as Got from 'got';
|
||||||
import chalk from 'chalk';
|
import chalk from 'chalk';
|
||||||
import { DI } from '@/di-symbols.js';
|
import { DI } from '@/di-symbols.js';
|
||||||
import { Config } from '@/config.js';
|
import { Config } from '@/config.js';
|
||||||
import Logger from '@/logger.js';
|
|
||||||
import { HttpRequestService } from '@/core/HttpRequestService.js';
|
import { HttpRequestService } from '@/core/HttpRequestService.js';
|
||||||
import { createTemp } from '@/misc/create-temp.js';
|
import { createTemp } from '@/misc/create-temp.js';
|
||||||
import { StatusError } from '@/misc/status-error.js';
|
import { StatusError } from '@/misc/status-error.js';
|
||||||
|
import { LoggerService } from '@/core/LoggerService.js';
|
||||||
|
import type Logger from '@/logger.js';
|
||||||
|
|
||||||
const pipeline = util.promisify(stream.pipeline);
|
const pipeline = util.promisify(stream.pipeline);
|
||||||
|
|
||||||
|
@ -24,8 +25,9 @@ export class DownloadService {
|
||||||
private config: Config,
|
private config: Config,
|
||||||
|
|
||||||
private httpRequestService: HttpRequestService,
|
private httpRequestService: HttpRequestService,
|
||||||
|
private loggerService: LoggerService,
|
||||||
) {
|
) {
|
||||||
this.#logger = new Logger('download');
|
this.#logger = this.loggerService.getLogger('download');
|
||||||
}
|
}
|
||||||
|
|
||||||
public async downloadUrl(url: string, path: string): Promise<void> {
|
public async downloadUrl(url: string, path: string): Promise<void> {
|
||||||
|
|
|
@ -4,8 +4,9 @@ import { validate as validateEmail } from 'deep-email-validator';
|
||||||
import { MetaService } from '@/core/MetaService.js';
|
import { MetaService } from '@/core/MetaService.js';
|
||||||
import { DI } from '@/di-symbols.js';
|
import { DI } from '@/di-symbols.js';
|
||||||
import { Config } from '@/config.js';
|
import { Config } from '@/config.js';
|
||||||
import Logger from '@/logger.js';
|
import type Logger from '@/logger.js';
|
||||||
import { UserProfilesRepository } from '@/models/index.js';
|
import { UserProfilesRepository } from '@/models/index.js';
|
||||||
|
import { LoggerService } from '@/core/LoggerService.js';
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class EmailService {
|
export class EmailService {
|
||||||
|
@ -19,8 +20,9 @@ export class EmailService {
|
||||||
private userProfilesRepository: UserProfilesRepository,
|
private userProfilesRepository: UserProfilesRepository,
|
||||||
|
|
||||||
private metaService: MetaService,
|
private metaService: MetaService,
|
||||||
|
private loggerService: LoggerService,
|
||||||
) {
|
) {
|
||||||
this.#logger = new Logger('email');
|
this.#logger = this.loggerService.getLogger('email');
|
||||||
}
|
}
|
||||||
|
|
||||||
public async sendEmail(to: string, subject: string, html: string, text: string) {
|
public async sendEmail(to: string, subject: string, html: string, text: string) {
|
||||||
|
|
|
@ -6,13 +6,12 @@ import tinycolor from 'tinycolor2';
|
||||||
import type { Instance } from '@/models/entities/Instance.js';
|
import type { Instance } from '@/models/entities/Instance.js';
|
||||||
import { InstancesRepository } from '@/models/index.js';
|
import { InstancesRepository } from '@/models/index.js';
|
||||||
import { AppLockService } from '@/core/AppLockService.js';
|
import { AppLockService } from '@/core/AppLockService.js';
|
||||||
import Logger from '@/logger.js';
|
import type Logger from '@/logger.js';
|
||||||
import { DI } from '@/di-symbols.js';
|
import { DI } from '@/di-symbols.js';
|
||||||
|
import { LoggerService } from '@/core/LoggerService.js';
|
||||||
import { HttpRequestService } from './HttpRequestService.js';
|
import { HttpRequestService } from './HttpRequestService.js';
|
||||||
import type { DOMWindow } from 'jsdom';
|
import type { DOMWindow } from 'jsdom';
|
||||||
|
|
||||||
const logger = new Logger('metadata', 'cyan');
|
|
||||||
|
|
||||||
type NodeInfo = {
|
type NodeInfo = {
|
||||||
openRegistrations?: any;
|
openRegistrations?: any;
|
||||||
software?: {
|
software?: {
|
||||||
|
@ -33,13 +32,17 @@ type NodeInfo = {
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class FetchInstanceMetadataService {
|
export class FetchInstanceMetadataService {
|
||||||
|
#logger: Logger;
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
@Inject(DI.instancesRepository)
|
@Inject(DI.instancesRepository)
|
||||||
private instancesRepository: InstancesRepository,
|
private instancesRepository: InstancesRepository,
|
||||||
|
|
||||||
private appLockService: AppLockService,
|
private appLockService: AppLockService,
|
||||||
private httpRequestService: HttpRequestService,
|
private httpRequestService: HttpRequestService,
|
||||||
|
private loggerService: LoggerService,
|
||||||
) {
|
) {
|
||||||
|
this.#logger = this.loggerService.getLogger('metadata', 'cyan');
|
||||||
}
|
}
|
||||||
|
|
||||||
public async fetchInstanceMetadata(instance: Instance, force = false): Promise<void> {
|
public async fetchInstanceMetadata(instance: Instance, force = false): Promise<void> {
|
||||||
|
@ -54,7 +57,7 @@ export class FetchInstanceMetadataService {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
logger.info(`Fetching metadata of ${instance.host} ...`);
|
this.#logger.info(`Fetching metadata of ${instance.host} ...`);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const [info, dom, manifest] = await Promise.all([
|
const [info, dom, manifest] = await Promise.all([
|
||||||
|
@ -71,7 +74,7 @@ export class FetchInstanceMetadataService {
|
||||||
this.#getDescription(info, dom, manifest).catch(() => null),
|
this.#getDescription(info, dom, manifest).catch(() => null),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
logger.succ(`Successfuly fetched metadata of ${instance.host}`);
|
this.#logger.succ(`Successfuly fetched metadata of ${instance.host}`);
|
||||||
|
|
||||||
const updates = {
|
const updates = {
|
||||||
infoUpdatedAt: new Date(),
|
infoUpdatedAt: new Date(),
|
||||||
|
@ -93,16 +96,16 @@ export class FetchInstanceMetadataService {
|
||||||
|
|
||||||
await this.instancesRepository.update(instance.id, updates);
|
await this.instancesRepository.update(instance.id, updates);
|
||||||
|
|
||||||
logger.succ(`Successfuly updated metadata of ${instance.host}`);
|
this.#logger.succ(`Successfuly updated metadata of ${instance.host}`);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
logger.error(`Failed to update metadata of ${instance.host}: ${e}`);
|
this.#logger.error(`Failed to update metadata of ${instance.host}: ${e}`);
|
||||||
} finally {
|
} finally {
|
||||||
unlock();
|
unlock();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async #fetchNodeinfo(instance: Instance): Promise<NodeInfo> {
|
async #fetchNodeinfo(instance: Instance): Promise<NodeInfo> {
|
||||||
logger.info(`Fetching nodeinfo of ${instance.host} ...`);
|
this.#logger.info(`Fetching nodeinfo of ${instance.host} ...`);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const wellknown = await this.httpRequestService.getJson('https://' + instance.host + '/.well-known/nodeinfo')
|
const wellknown = await this.httpRequestService.getJson('https://' + instance.host + '/.well-known/nodeinfo')
|
||||||
|
@ -134,18 +137,18 @@ export class FetchInstanceMetadataService {
|
||||||
throw err.statusCode ?? err.message;
|
throw err.statusCode ?? err.message;
|
||||||
});
|
});
|
||||||
|
|
||||||
logger.succ(`Successfuly fetched nodeinfo of ${instance.host}`);
|
this.#logger.succ(`Successfuly fetched nodeinfo of ${instance.host}`);
|
||||||
|
|
||||||
return info as NodeInfo;
|
return info as NodeInfo;
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
logger.error(`Failed to fetch nodeinfo of ${instance.host}: ${err}`);
|
this.#logger.error(`Failed to fetch nodeinfo of ${instance.host}: ${err}`);
|
||||||
|
|
||||||
throw err;
|
throw err;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async #fetchDom(instance: Instance): Promise<DOMWindow['document']> {
|
async #fetchDom(instance: Instance): Promise<DOMWindow['document']> {
|
||||||
logger.info(`Fetching HTML of ${instance.host} ...`);
|
this.#logger.info(`Fetching HTML of ${instance.host} ...`);
|
||||||
|
|
||||||
const url = 'https://' + instance.host;
|
const url = 'https://' + instance.host;
|
||||||
|
|
||||||
|
|
33
packages/backend/src/core/LoggerService.ts
Normal file
33
packages/backend/src/core/LoggerService.ts
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
import { Inject, Injectable } from '@nestjs/common';
|
||||||
|
import * as SyslogPro from 'syslog-pro';
|
||||||
|
import { DI } from '@/di-symbols.js';
|
||||||
|
import { Config } from '@/config.js';
|
||||||
|
import Logger from '@/logger.js';
|
||||||
|
|
||||||
|
@Injectable()
|
||||||
|
export class LoggerService {
|
||||||
|
#syslogClient;
|
||||||
|
|
||||||
|
constructor(
|
||||||
|
@Inject(DI.config)
|
||||||
|
private config: Config,
|
||||||
|
) {
|
||||||
|
if (this.config.syslog) {
|
||||||
|
this.#syslogClient = new SyslogPro.RFC5424({
|
||||||
|
applacationName: 'Misskey',
|
||||||
|
timestamp: true,
|
||||||
|
encludeStructuredData: true,
|
||||||
|
color: true,
|
||||||
|
extendedColor: true,
|
||||||
|
server: {
|
||||||
|
target: config.syslog.host,
|
||||||
|
port: config.syslog.port,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public getLogger(domain: string, color?: string | undefined, store?: boolean) {
|
||||||
|
return new Logger(domain, color, store, this.#syslogClient);
|
||||||
|
}
|
||||||
|
}
|
14
packages/backend/src/core/chart/ChartLoggerService.ts
Normal file
14
packages/backend/src/core/chart/ChartLoggerService.ts
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
import { Inject, Injectable } from '@nestjs/common';
|
||||||
|
import type Logger from '@/logger.js';
|
||||||
|
import { LoggerService } from '@/core/LoggerService.js';
|
||||||
|
|
||||||
|
@Injectable()
|
||||||
|
export class ChartLoggerService {
|
||||||
|
public logger: Logger;
|
||||||
|
|
||||||
|
constructor(
|
||||||
|
private loggerService: LoggerService,
|
||||||
|
) {
|
||||||
|
this.logger = this.loggerService.getLogger('chart', 'white', process.env.NODE_ENV !== 'test');
|
||||||
|
}
|
||||||
|
}
|
|
@ -4,6 +4,7 @@ import { AppLockService } from '@/core/AppLockService.js';
|
||||||
import type { User } from '@/models/entities/User.js';
|
import type { User } from '@/models/entities/User.js';
|
||||||
import { DI } from '@/di-symbols.js';
|
import { DI } from '@/di-symbols.js';
|
||||||
import Chart from '../core.js';
|
import Chart from '../core.js';
|
||||||
|
import { ChartLoggerService } from '../ChartLoggerService.js';
|
||||||
import { name, schema } from './entities/active-users.js';
|
import { name, schema } from './entities/active-users.js';
|
||||||
import type { KVs } from '../core.js';
|
import type { KVs } from '../core.js';
|
||||||
|
|
||||||
|
@ -22,8 +23,9 @@ export default class ActiveUsersChart extends Chart<typeof schema> {
|
||||||
private db: DataSource,
|
private db: DataSource,
|
||||||
|
|
||||||
private appLockService: AppLockService,
|
private appLockService: AppLockService,
|
||||||
|
private chartLoggerService: ChartLoggerService,
|
||||||
) {
|
) {
|
||||||
super(db, (k) => appLockService.getChartInsertLock(k), name, schema);
|
super(db, (k) => appLockService.getChartInsertLock(k), chartLoggerService.logger, name, schema);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected async tickMajor(): Promise<Partial<KVs<typeof schema>>> {
|
protected async tickMajor(): Promise<Partial<KVs<typeof schema>>> {
|
||||||
|
|
|
@ -3,6 +3,7 @@ import { DataSource } from 'typeorm';
|
||||||
import { AppLockService } from '@/core/AppLockService.js';
|
import { AppLockService } from '@/core/AppLockService.js';
|
||||||
import { DI } from '@/di-symbols.js';
|
import { DI } from '@/di-symbols.js';
|
||||||
import Chart from '../core.js';
|
import Chart from '../core.js';
|
||||||
|
import { ChartLoggerService } from '../ChartLoggerService.js';
|
||||||
import { name, schema } from './entities/ap-request.js';
|
import { name, schema } from './entities/ap-request.js';
|
||||||
import type { KVs } from '../core.js';
|
import type { KVs } from '../core.js';
|
||||||
|
|
||||||
|
@ -17,8 +18,9 @@ export default class ApRequestChart extends Chart<typeof schema> {
|
||||||
private db: DataSource,
|
private db: DataSource,
|
||||||
|
|
||||||
private appLockService: AppLockService,
|
private appLockService: AppLockService,
|
||||||
|
private chartLoggerService: ChartLoggerService,
|
||||||
) {
|
) {
|
||||||
super(db, (k) => appLockService.getChartInsertLock(k), name, schema);
|
super(db, (k) => appLockService.getChartInsertLock(k), chartLoggerService.logger, name, schema);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected async tickMajor(): Promise<Partial<KVs<typeof schema>>> {
|
protected async tickMajor(): Promise<Partial<KVs<typeof schema>>> {
|
||||||
|
|
|
@ -4,6 +4,7 @@ import type { DriveFile } from '@/models/entities/DriveFile.js';
|
||||||
import { AppLockService } from '@/core/AppLockService.js';
|
import { AppLockService } from '@/core/AppLockService.js';
|
||||||
import { DI } from '@/di-symbols.js';
|
import { DI } from '@/di-symbols.js';
|
||||||
import Chart from '../core.js';
|
import Chart from '../core.js';
|
||||||
|
import { ChartLoggerService } from '../ChartLoggerService.js';
|
||||||
import { name, schema } from './entities/drive.js';
|
import { name, schema } from './entities/drive.js';
|
||||||
import type { KVs } from '../core.js';
|
import type { KVs } from '../core.js';
|
||||||
|
|
||||||
|
@ -18,8 +19,9 @@ export default class DriveChart extends Chart<typeof schema> {
|
||||||
private db: DataSource,
|
private db: DataSource,
|
||||||
|
|
||||||
private appLockService: AppLockService,
|
private appLockService: AppLockService,
|
||||||
|
private chartLoggerService: ChartLoggerService,
|
||||||
) {
|
) {
|
||||||
super(db, (k) => appLockService.getChartInsertLock(k), name, schema);
|
super(db, (k) => appLockService.getChartInsertLock(k), chartLoggerService.logger, name, schema);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected async tickMajor(): Promise<Partial<KVs<typeof schema>>> {
|
protected async tickMajor(): Promise<Partial<KVs<typeof schema>>> {
|
||||||
|
|
|
@ -5,6 +5,7 @@ import { AppLockService } from '@/core/AppLockService.js';
|
||||||
import { DI } from '@/di-symbols.js';
|
import { DI } from '@/di-symbols.js';
|
||||||
import { MetaService } from '@/core/MetaService.js';
|
import { MetaService } from '@/core/MetaService.js';
|
||||||
import Chart from '../core.js';
|
import Chart from '../core.js';
|
||||||
|
import { ChartLoggerService } from '../ChartLoggerService.js';
|
||||||
import { name, schema } from './entities/federation.js';
|
import { name, schema } from './entities/federation.js';
|
||||||
import type { KVs } from '../core.js';
|
import type { KVs } from '../core.js';
|
||||||
|
|
||||||
|
@ -26,8 +27,9 @@ export default class FederationChart extends Chart<typeof schema> {
|
||||||
|
|
||||||
private metaService: MetaService,
|
private metaService: MetaService,
|
||||||
private appLockService: AppLockService,
|
private appLockService: AppLockService,
|
||||||
|
private chartLoggerService: ChartLoggerService,
|
||||||
) {
|
) {
|
||||||
super(db, (k) => appLockService.getChartInsertLock(k), name, schema);
|
super(db, (k) => appLockService.getChartInsertLock(k), chartLoggerService.logger, name, schema);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected async tickMajor(): Promise<Partial<KVs<typeof schema>>> {
|
protected async tickMajor(): Promise<Partial<KVs<typeof schema>>> {
|
||||||
|
|
|
@ -5,6 +5,7 @@ import { AppLockService } from '@/core/AppLockService.js';
|
||||||
import { DI } from '@/di-symbols.js';
|
import { DI } from '@/di-symbols.js';
|
||||||
import { UserEntityService } from '@/core/entities/UserEntityService.js';
|
import { UserEntityService } from '@/core/entities/UserEntityService.js';
|
||||||
import Chart from '../core.js';
|
import Chart from '../core.js';
|
||||||
|
import { ChartLoggerService } from '../ChartLoggerService.js';
|
||||||
import { name, schema } from './entities/hashtag.js';
|
import { name, schema } from './entities/hashtag.js';
|
||||||
import type { KVs } from '../core.js';
|
import type { KVs } from '../core.js';
|
||||||
|
|
||||||
|
@ -20,8 +21,9 @@ export default class HashtagChart extends Chart<typeof schema> {
|
||||||
|
|
||||||
private appLockService: AppLockService,
|
private appLockService: AppLockService,
|
||||||
private userEntityService: UserEntityService,
|
private userEntityService: UserEntityService,
|
||||||
|
private chartLoggerService: ChartLoggerService,
|
||||||
) {
|
) {
|
||||||
super(db, (k) => appLockService.getChartInsertLock(k), name, schema, true);
|
super(db, (k) => appLockService.getChartInsertLock(k), chartLoggerService.logger, name, schema, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected async tickMajor(): Promise<Partial<KVs<typeof schema>>> {
|
protected async tickMajor(): Promise<Partial<KVs<typeof schema>>> {
|
||||||
|
|
|
@ -7,6 +7,7 @@ import { AppLockService } from '@/core/AppLockService.js';
|
||||||
import { DI } from '@/di-symbols.js';
|
import { DI } from '@/di-symbols.js';
|
||||||
import { UtilityService } from '@/core/UtilityService.js';
|
import { UtilityService } from '@/core/UtilityService.js';
|
||||||
import Chart from '../core.js';
|
import Chart from '../core.js';
|
||||||
|
import { ChartLoggerService } from '../ChartLoggerService.js';
|
||||||
import { name, schema } from './entities/instance.js';
|
import { name, schema } from './entities/instance.js';
|
||||||
import type { KVs } from '../core.js';
|
import type { KVs } from '../core.js';
|
||||||
|
|
||||||
|
@ -34,8 +35,9 @@ export default class InstanceChart extends Chart<typeof schema> {
|
||||||
|
|
||||||
private utilityService: UtilityService,
|
private utilityService: UtilityService,
|
||||||
private appLockService: AppLockService,
|
private appLockService: AppLockService,
|
||||||
|
private chartLoggerService: ChartLoggerService,
|
||||||
) {
|
) {
|
||||||
super(db, (k) => appLockService.getChartInsertLock(k), name, schema, true);
|
super(db, (k) => appLockService.getChartInsertLock(k), chartLoggerService.logger, name, schema, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected async tickMajor(group: string): Promise<Partial<KVs<typeof schema>>> {
|
protected async tickMajor(group: string): Promise<Partial<KVs<typeof schema>>> {
|
||||||
|
|
|
@ -5,6 +5,7 @@ import type { Note } from '@/models/entities/Note.js';
|
||||||
import { AppLockService } from '@/core/AppLockService.js';
|
import { AppLockService } from '@/core/AppLockService.js';
|
||||||
import { DI } from '@/di-symbols.js';
|
import { DI } from '@/di-symbols.js';
|
||||||
import Chart from '../core.js';
|
import Chart from '../core.js';
|
||||||
|
import { ChartLoggerService } from '../ChartLoggerService.js';
|
||||||
import { name, schema } from './entities/notes.js';
|
import { name, schema } from './entities/notes.js';
|
||||||
import type { KVs } from '../core.js';
|
import type { KVs } from '../core.js';
|
||||||
|
|
||||||
|
@ -22,8 +23,9 @@ export default class NotesChart extends Chart<typeof schema> {
|
||||||
private notesRepository: NotesRepository,
|
private notesRepository: NotesRepository,
|
||||||
|
|
||||||
private appLockService: AppLockService,
|
private appLockService: AppLockService,
|
||||||
|
private chartLoggerService: ChartLoggerService,
|
||||||
) {
|
) {
|
||||||
super(db, (k) => appLockService.getChartInsertLock(k), name, schema);
|
super(db, (k) => appLockService.getChartInsertLock(k), chartLoggerService.logger, name, schema);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected async tickMajor(): Promise<Partial<KVs<typeof schema>>> {
|
protected async tickMajor(): Promise<Partial<KVs<typeof schema>>> {
|
||||||
|
|
|
@ -6,6 +6,7 @@ import { AppLockService } from '@/core/AppLockService.js';
|
||||||
import { DI } from '@/di-symbols.js';
|
import { DI } from '@/di-symbols.js';
|
||||||
import { DriveFileEntityService } from '@/core/entities/DriveFileEntityService.js';
|
import { DriveFileEntityService } from '@/core/entities/DriveFileEntityService.js';
|
||||||
import Chart from '../core.js';
|
import Chart from '../core.js';
|
||||||
|
import { ChartLoggerService } from '../ChartLoggerService.js';
|
||||||
import { name, schema } from './entities/per-user-drive.js';
|
import { name, schema } from './entities/per-user-drive.js';
|
||||||
import type { KVs } from '../core.js';
|
import type { KVs } from '../core.js';
|
||||||
|
|
||||||
|
@ -24,8 +25,9 @@ export default class PerUserDriveChart extends Chart<typeof schema> {
|
||||||
|
|
||||||
private appLockService: AppLockService,
|
private appLockService: AppLockService,
|
||||||
private driveFileEntityService: DriveFileEntityService,
|
private driveFileEntityService: DriveFileEntityService,
|
||||||
|
private chartLoggerService: ChartLoggerService,
|
||||||
) {
|
) {
|
||||||
super(db, (k) => appLockService.getChartInsertLock(k), name, schema, true);
|
super(db, (k) => appLockService.getChartInsertLock(k), chartLoggerService.logger, name, schema, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected async tickMajor(group: string): Promise<Partial<KVs<typeof schema>>> {
|
protected async tickMajor(group: string): Promise<Partial<KVs<typeof schema>>> {
|
||||||
|
|
|
@ -6,6 +6,7 @@ import { DI } from '@/di-symbols.js';
|
||||||
import { UserEntityService } from '@/core/entities/UserEntityService.js';
|
import { UserEntityService } from '@/core/entities/UserEntityService.js';
|
||||||
import { FollowingsRepository } from '@/models/index.js';
|
import { FollowingsRepository } from '@/models/index.js';
|
||||||
import Chart from '../core.js';
|
import Chart from '../core.js';
|
||||||
|
import { ChartLoggerService } from '../ChartLoggerService.js';
|
||||||
import { name, schema } from './entities/per-user-following.js';
|
import { name, schema } from './entities/per-user-following.js';
|
||||||
import type { KVs } from '../core.js';
|
import type { KVs } from '../core.js';
|
||||||
|
|
||||||
|
@ -24,8 +25,9 @@ export default class PerUserFollowingChart extends Chart<typeof schema> {
|
||||||
|
|
||||||
private appLockService: AppLockService,
|
private appLockService: AppLockService,
|
||||||
private userEntityService: UserEntityService,
|
private userEntityService: UserEntityService,
|
||||||
|
private chartLoggerService: ChartLoggerService,
|
||||||
) {
|
) {
|
||||||
super(db, (k) => appLockService.getChartInsertLock(k), name, schema, true);
|
super(db, (k) => appLockService.getChartInsertLock(k), chartLoggerService.logger, name, schema, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected async tickMajor(group: string): Promise<Partial<KVs<typeof schema>>> {
|
protected async tickMajor(group: string): Promise<Partial<KVs<typeof schema>>> {
|
||||||
|
|
|
@ -6,6 +6,7 @@ import { AppLockService } from '@/core/AppLockService.js';
|
||||||
import { DI } from '@/di-symbols.js';
|
import { DI } from '@/di-symbols.js';
|
||||||
import { NotesRepository } from '@/models/index.js';
|
import { NotesRepository } from '@/models/index.js';
|
||||||
import Chart from '../core.js';
|
import Chart from '../core.js';
|
||||||
|
import { ChartLoggerService } from '../ChartLoggerService.js';
|
||||||
import { name, schema } from './entities/per-user-notes.js';
|
import { name, schema } from './entities/per-user-notes.js';
|
||||||
import type { KVs } from '../core.js';
|
import type { KVs } from '../core.js';
|
||||||
|
|
||||||
|
@ -23,8 +24,9 @@ export default class PerUserNotesChart extends Chart<typeof schema> {
|
||||||
private notesRepository: NotesRepository,
|
private notesRepository: NotesRepository,
|
||||||
|
|
||||||
private appLockService: AppLockService,
|
private appLockService: AppLockService,
|
||||||
|
private chartLoggerService: ChartLoggerService,
|
||||||
) {
|
) {
|
||||||
super(db, (k) => appLockService.getChartInsertLock(k), name, schema, true);
|
super(db, (k) => appLockService.getChartInsertLock(k), chartLoggerService.logger, name, schema, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected async tickMajor(group: string): Promise<Partial<KVs<typeof schema>>> {
|
protected async tickMajor(group: string): Promise<Partial<KVs<typeof schema>>> {
|
||||||
|
|
|
@ -6,6 +6,7 @@ import { AppLockService } from '@/core/AppLockService.js';
|
||||||
import { DI } from '@/di-symbols.js';
|
import { DI } from '@/di-symbols.js';
|
||||||
import { UserEntityService } from '@/core/entities/UserEntityService.js';
|
import { UserEntityService } from '@/core/entities/UserEntityService.js';
|
||||||
import Chart from '../core.js';
|
import Chart from '../core.js';
|
||||||
|
import { ChartLoggerService } from '../ChartLoggerService.js';
|
||||||
import { name, schema } from './entities/per-user-reactions.js';
|
import { name, schema } from './entities/per-user-reactions.js';
|
||||||
import type { KVs } from '../core.js';
|
import type { KVs } from '../core.js';
|
||||||
|
|
||||||
|
@ -21,8 +22,9 @@ export default class PerUserReactionsChart extends Chart<typeof schema> {
|
||||||
|
|
||||||
private appLockService: AppLockService,
|
private appLockService: AppLockService,
|
||||||
private userEntityService: UserEntityService,
|
private userEntityService: UserEntityService,
|
||||||
|
private chartLoggerService: ChartLoggerService,
|
||||||
) {
|
) {
|
||||||
super(db, (k) => appLockService.getChartInsertLock(k), name, schema, true);
|
super(db, (k) => appLockService.getChartInsertLock(k), chartLoggerService.logger, name, schema, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected async tickMajor(group: string): Promise<Partial<KVs<typeof schema>>> {
|
protected async tickMajor(group: string): Promise<Partial<KVs<typeof schema>>> {
|
||||||
|
|
|
@ -3,6 +3,7 @@ import { DataSource } from 'typeorm';
|
||||||
import { AppLockService } from '@/core/AppLockService.js';
|
import { AppLockService } from '@/core/AppLockService.js';
|
||||||
import { DI } from '@/di-symbols.js';
|
import { DI } from '@/di-symbols.js';
|
||||||
import Chart from '../core.js';
|
import Chart from '../core.js';
|
||||||
|
import { ChartLoggerService } from '../ChartLoggerService.js';
|
||||||
import { name, schema } from './entities/test-grouped.js';
|
import { name, schema } from './entities/test-grouped.js';
|
||||||
import type { KVs } from '../core.js';
|
import type { KVs } from '../core.js';
|
||||||
|
|
||||||
|
@ -19,8 +20,9 @@ export default class TestGroupedChart extends Chart<typeof schema> {
|
||||||
private db: DataSource,
|
private db: DataSource,
|
||||||
|
|
||||||
private appLockService: AppLockService,
|
private appLockService: AppLockService,
|
||||||
|
private chartLoggerService: ChartLoggerService,
|
||||||
) {
|
) {
|
||||||
super(db, (k) => appLockService.getChartInsertLock(k), name, schema, true);
|
super(db, (k) => appLockService.getChartInsertLock(k), chartLoggerService.logger, name, schema, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected async tickMajor(group: string): Promise<Partial<KVs<typeof schema>>> {
|
protected async tickMajor(group: string): Promise<Partial<KVs<typeof schema>>> {
|
||||||
|
|
|
@ -3,6 +3,7 @@ import { DataSource } from 'typeorm';
|
||||||
import { AppLockService } from '@/core/AppLockService.js';
|
import { AppLockService } from '@/core/AppLockService.js';
|
||||||
import { DI } from '@/di-symbols.js';
|
import { DI } from '@/di-symbols.js';
|
||||||
import Chart from '../core.js';
|
import Chart from '../core.js';
|
||||||
|
import { ChartLoggerService } from '../ChartLoggerService.js';
|
||||||
import { name, schema } from './entities/test-intersection.js';
|
import { name, schema } from './entities/test-intersection.js';
|
||||||
import type { KVs } from '../core.js';
|
import type { KVs } from '../core.js';
|
||||||
|
|
||||||
|
@ -17,8 +18,9 @@ export default class TestIntersectionChart extends Chart<typeof schema> {
|
||||||
private db: DataSource,
|
private db: DataSource,
|
||||||
|
|
||||||
private appLockService: AppLockService,
|
private appLockService: AppLockService,
|
||||||
|
private chartLoggerService: ChartLoggerService,
|
||||||
) {
|
) {
|
||||||
super(db, (k) => appLockService.getChartInsertLock(k), name, schema);
|
super(db, (k) => appLockService.getChartInsertLock(k), chartLoggerService.logger, name, schema);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected async tickMajor(): Promise<Partial<KVs<typeof schema>>> {
|
protected async tickMajor(): Promise<Partial<KVs<typeof schema>>> {
|
||||||
|
|
|
@ -3,6 +3,7 @@ import { DataSource } from 'typeorm';
|
||||||
import { AppLockService } from '@/core/AppLockService.js';
|
import { AppLockService } from '@/core/AppLockService.js';
|
||||||
import { DI } from '@/di-symbols.js';
|
import { DI } from '@/di-symbols.js';
|
||||||
import Chart from '../core.js';
|
import Chart from '../core.js';
|
||||||
|
import { ChartLoggerService } from '../ChartLoggerService.js';
|
||||||
import { name, schema } from './entities/test-unique.js';
|
import { name, schema } from './entities/test-unique.js';
|
||||||
import type { KVs } from '../core.js';
|
import type { KVs } from '../core.js';
|
||||||
|
|
||||||
|
@ -17,8 +18,9 @@ export default class TestUniqueChart extends Chart<typeof schema> {
|
||||||
private db: DataSource,
|
private db: DataSource,
|
||||||
|
|
||||||
private appLockService: AppLockService,
|
private appLockService: AppLockService,
|
||||||
|
private chartLoggerService: ChartLoggerService,
|
||||||
) {
|
) {
|
||||||
super(db, (k) => appLockService.getChartInsertLock(k), name, schema);
|
super(db, (k) => appLockService.getChartInsertLock(k), chartLoggerService.logger, name, schema);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected async tickMajor(): Promise<Partial<KVs<typeof schema>>> {
|
protected async tickMajor(): Promise<Partial<KVs<typeof schema>>> {
|
||||||
|
|
|
@ -3,6 +3,7 @@ import { DataSource } from 'typeorm';
|
||||||
import { AppLockService } from '@/core/AppLockService.js';
|
import { AppLockService } from '@/core/AppLockService.js';
|
||||||
import { DI } from '@/di-symbols.js';
|
import { DI } from '@/di-symbols.js';
|
||||||
import Chart from '../core.js';
|
import Chart from '../core.js';
|
||||||
|
import { ChartLoggerService } from '../ChartLoggerService.js';
|
||||||
import { name, schema } from './entities/test.js';
|
import { name, schema } from './entities/test.js';
|
||||||
import type { KVs } from '../core.js';
|
import type { KVs } from '../core.js';
|
||||||
|
|
||||||
|
@ -19,8 +20,9 @@ export default class TestChart extends Chart<typeof schema> {
|
||||||
private db: DataSource,
|
private db: DataSource,
|
||||||
|
|
||||||
private appLockService: AppLockService,
|
private appLockService: AppLockService,
|
||||||
|
private chartLoggerService: ChartLoggerService,
|
||||||
) {
|
) {
|
||||||
super(db, (k) => appLockService.getChartInsertLock(k), name, schema);
|
super(db, (k) => appLockService.getChartInsertLock(k), chartLoggerService.logger, name, schema);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected async tickMajor(): Promise<Partial<KVs<typeof schema>>> {
|
protected async tickMajor(): Promise<Partial<KVs<typeof schema>>> {
|
||||||
|
|
|
@ -6,6 +6,7 @@ import { DI } from '@/di-symbols.js';
|
||||||
import { UserEntityService } from '@/core/entities/UserEntityService.js';
|
import { UserEntityService } from '@/core/entities/UserEntityService.js';
|
||||||
import { UsersRepository } from '@/models/index.js';
|
import { UsersRepository } from '@/models/index.js';
|
||||||
import Chart from '../core.js';
|
import Chart from '../core.js';
|
||||||
|
import { ChartLoggerService } from '../ChartLoggerService.js';
|
||||||
import { name, schema } from './entities/users.js';
|
import { name, schema } from './entities/users.js';
|
||||||
import type { KVs } from '../core.js';
|
import type { KVs } from '../core.js';
|
||||||
|
|
||||||
|
@ -24,8 +25,9 @@ export default class UsersChart extends Chart<typeof schema> {
|
||||||
|
|
||||||
private appLockService: AppLockService,
|
private appLockService: AppLockService,
|
||||||
private userEntityService: UserEntityService,
|
private userEntityService: UserEntityService,
|
||||||
|
private chartLoggerService: ChartLoggerService,
|
||||||
) {
|
) {
|
||||||
super(db, (k) => appLockService.getChartInsertLock(k), name, schema);
|
super(db, (k) => appLockService.getChartInsertLock(k), chartLoggerService.logger, name, schema);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected async tickMajor(): Promise<Partial<KVs<typeof schema>>> {
|
protected async tickMajor(): Promise<Partial<KVs<typeof schema>>> {
|
||||||
|
|
|
@ -7,11 +7,9 @@
|
||||||
import * as nestedProperty from 'nested-property';
|
import * as nestedProperty from 'nested-property';
|
||||||
import { EntitySchema, LessThan, Between } from 'typeorm';
|
import { EntitySchema, LessThan, Between } from 'typeorm';
|
||||||
import { dateUTC, isTimeSame, isTimeBefore, subtractTime, addTime } from '@/misc/prelude/time.js';
|
import { dateUTC, isTimeSame, isTimeBefore, subtractTime, addTime } from '@/misc/prelude/time.js';
|
||||||
import Logger from '@/logger.js';
|
import type Logger from '@/logger.js';
|
||||||
import type { Repository, DataSource } from 'typeorm';
|
import type { Repository, DataSource } from 'typeorm';
|
||||||
|
|
||||||
const logger = new Logger('chart', 'white', process.env.NODE_ENV !== 'test');
|
|
||||||
|
|
||||||
const columnPrefix = '___' as const;
|
const columnPrefix = '___' as const;
|
||||||
const uniqueTempColumnPrefix = 'unique_temp___' as const;
|
const uniqueTempColumnPrefix = 'unique_temp___' as const;
|
||||||
const columnDot = '_' as const;
|
const columnDot = '_' as const;
|
||||||
|
@ -111,6 +109,8 @@ export function getJsonSchema<S extends Schema>(schema: S): ToJsonSchema<Unflatt
|
||||||
*/
|
*/
|
||||||
// eslint-disable-next-line import/no-default-export
|
// eslint-disable-next-line import/no-default-export
|
||||||
export default abstract class Chart<T extends Schema> {
|
export default abstract class Chart<T extends Schema> {
|
||||||
|
#logger: Logger;
|
||||||
|
|
||||||
public schema: T;
|
public schema: T;
|
||||||
|
|
||||||
private name: string;
|
private name: string;
|
||||||
|
@ -231,10 +231,18 @@ export default abstract class Chart<T extends Schema> {
|
||||||
|
|
||||||
private lock: (key: string) => Promise<() => void>;
|
private lock: (key: string) => Promise<() => void>;
|
||||||
|
|
||||||
constructor(db: DataSource, lock: (key: string) => Promise<() => void>, name: string, schema: T, grouped = false) {
|
constructor(
|
||||||
|
db: DataSource,
|
||||||
|
lock: (key: string) => Promise<() => void>,
|
||||||
|
logger: Logger,
|
||||||
|
name: string,
|
||||||
|
schema: T,
|
||||||
|
grouped = false,
|
||||||
|
) {
|
||||||
this.name = name;
|
this.name = name;
|
||||||
this.schema = schema;
|
this.schema = schema;
|
||||||
this.lock = lock;
|
this.lock = lock;
|
||||||
|
this.#logger = logger;
|
||||||
|
|
||||||
const { hour, day } = Chart.schemaToEntity(name, schema, grouped);
|
const { hour, day } = Chart.schemaToEntity(name, schema, grouped);
|
||||||
this.repositoryForHour = db.getRepository<{ id: number; group?: string | null; date: number; }>(hour);
|
this.repositoryForHour = db.getRepository<{ id: number; group?: string | null; date: number; }>(hour);
|
||||||
|
@ -325,7 +333,7 @@ export default abstract class Chart<T extends Schema> {
|
||||||
// 初期ログデータを作成
|
// 初期ログデータを作成
|
||||||
data = this.getNewLog(null);
|
data = this.getNewLog(null);
|
||||||
|
|
||||||
logger.info(`${this.name + (group ? `:${group}` : '')}(${span}): Initial commit created`);
|
this.#logger.info(`${this.name + (group ? `:${group}` : '')}(${span}): Initial commit created`);
|
||||||
}
|
}
|
||||||
|
|
||||||
const date = Chart.dateToTimestamp(current);
|
const date = Chart.dateToTimestamp(current);
|
||||||
|
@ -355,7 +363,7 @@ export default abstract class Chart<T extends Schema> {
|
||||||
...columns,
|
...columns,
|
||||||
}).then(x => repository.findOneByOrFail(x.identifiers[0])) as RawRecord<T>;
|
}).then(x => repository.findOneByOrFail(x.identifiers[0])) as RawRecord<T>;
|
||||||
|
|
||||||
logger.info(`${this.name + (group ? `:${group}` : '')}(${span}): New commit created`);
|
this.#logger.info(`${this.name + (group ? `:${group}` : '')}(${span}): New commit created`);
|
||||||
|
|
||||||
return log;
|
return log;
|
||||||
} finally {
|
} finally {
|
||||||
|
@ -374,7 +382,7 @@ export default abstract class Chart<T extends Schema> {
|
||||||
|
|
||||||
public async save(): Promise<void> {
|
public async save(): Promise<void> {
|
||||||
if (this.buffer.length === 0) {
|
if (this.buffer.length === 0) {
|
||||||
logger.info(`${this.name}: Write skipped`);
|
this.#logger.info(`${this.name}: Write skipped`);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -473,7 +481,7 @@ export default abstract class Chart<T extends Schema> {
|
||||||
.execute(),
|
.execute(),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
logger.info(`${this.name + (logHour.group ? `:${logHour.group}` : '')}: Updated`);
|
this.#logger.info(`${this.name + (logHour.group ? `:${logHour.group}` : '')}: Updated`);
|
||||||
|
|
||||||
// TODO: この一連の処理が始まった後に新たにbufferに入ったものは消さないようにする
|
// TODO: この一連の処理が始まった後に新たにbufferに入ったものは消さないようにする
|
||||||
this.buffer = this.buffer.filter(q => q.group != null && (q.group !== logHour.group));
|
this.buffer = this.buffer.filter(q => q.group != null && (q.group !== logHour.group));
|
||||||
|
|
|
@ -1,12 +1,14 @@
|
||||||
import { Inject, Injectable } from '@nestjs/common';
|
import { Inject, Injectable } from '@nestjs/common';
|
||||||
import Logger from '@/logger.js';
|
import type Logger from '@/logger.js';
|
||||||
|
import { LoggerService } from '@/core/LoggerService.js';
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class RemoteLoggerService {
|
export class RemoteLoggerService {
|
||||||
public logger: Logger;
|
public logger: Logger;
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
|
private loggerService: LoggerService,
|
||||||
) {
|
) {
|
||||||
this.logger = new Logger('remote', 'cyan');
|
this.logger = this.loggerService.getLogger('remote', 'cyan');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,12 +1,14 @@
|
||||||
import { Inject, Injectable } from '@nestjs/common';
|
import { Inject, Injectable } from '@nestjs/common';
|
||||||
import Logger from '@/logger.js';
|
import type Logger from '@/logger.js';
|
||||||
|
import { LoggerService } from '@/core/LoggerService.js';
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class QueueLoggerService {
|
export class QueueLoggerService {
|
||||||
public logger: Logger;
|
public logger: Logger;
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
|
private loggerService: LoggerService,
|
||||||
) {
|
) {
|
||||||
this.logger = new Logger('queue', 'orange');
|
this.logger = this.loggerService.getLogger('queue', 'orange');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,29 +13,24 @@ import { DI } from '@/di-symbols.js';
|
||||||
import { createTemp } from '@/misc/create-temp.js';
|
import { createTemp } from '@/misc/create-temp.js';
|
||||||
import { FILE_TYPE_BROWSERSAFE } from '@/const.js';
|
import { FILE_TYPE_BROWSERSAFE } from '@/const.js';
|
||||||
import { StatusError } from '@/misc/status-error.js';
|
import { StatusError } from '@/misc/status-error.js';
|
||||||
import Logger from '@/logger.js';
|
import type Logger from '@/logger.js';
|
||||||
import { DownloadService } from '@/core/DownloadService.js';
|
import { DownloadService } from '@/core/DownloadService.js';
|
||||||
import { ImageProcessingService } from '@/core/ImageProcessingService.js';
|
import { ImageProcessingService } from '@/core/ImageProcessingService.js';
|
||||||
import { VideoProcessingService } from '@/core/VideoProcessingService.js';
|
import { VideoProcessingService } from '@/core/VideoProcessingService.js';
|
||||||
import { InternalStorageService } from '@/core/InternalStorageService.js';
|
import { InternalStorageService } from '@/core/InternalStorageService.js';
|
||||||
import { contentDisposition } from '@/misc/content-disposition.js';
|
import { contentDisposition } from '@/misc/content-disposition.js';
|
||||||
import { FileInfoService } from '@/core/FileInfoService.js';
|
import { FileInfoService } from '@/core/FileInfoService.js';
|
||||||
|
import { LoggerService } from '@/core/LoggerService.js';
|
||||||
const serverLogger = new Logger('server', 'gray', false);
|
|
||||||
|
|
||||||
const _filename = fileURLToPath(import.meta.url);
|
const _filename = fileURLToPath(import.meta.url);
|
||||||
const _dirname = dirname(_filename);
|
const _dirname = dirname(_filename);
|
||||||
|
|
||||||
const assets = `${_dirname}/../../server/file/assets/`;
|
const assets = `${_dirname}/../../server/file/assets/`;
|
||||||
|
|
||||||
const commonReadableHandlerGenerator = (ctx: Koa.Context) => (e: Error): void => {
|
|
||||||
serverLogger.error(e);
|
|
||||||
ctx.status = 500;
|
|
||||||
ctx.set('Cache-Control', 'max-age=300');
|
|
||||||
};
|
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class FileServerService {
|
export class FileServerService {
|
||||||
|
#logger: Logger;
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
@Inject(DI.config)
|
@Inject(DI.config)
|
||||||
private config: Config,
|
private config: Config,
|
||||||
|
@ -48,9 +43,19 @@ export class FileServerService {
|
||||||
private imageProcessingService: ImageProcessingService,
|
private imageProcessingService: ImageProcessingService,
|
||||||
private videoProcessingService: VideoProcessingService,
|
private videoProcessingService: VideoProcessingService,
|
||||||
private internalStorageService: InternalStorageService,
|
private internalStorageService: InternalStorageService,
|
||||||
|
private loggerService: LoggerService,
|
||||||
) {
|
) {
|
||||||
|
this.#logger = this.loggerService.getLogger('server', 'gray', false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public commonReadableHandlerGenerator(ctx: Koa.Context) {
|
||||||
|
return (e: Error): void => {
|
||||||
|
this.#logger.error(e);
|
||||||
|
ctx.status = 500;
|
||||||
|
ctx.set('Cache-Control', 'max-age=300');
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
public createServer() {
|
public createServer() {
|
||||||
const app = new Koa();
|
const app = new Koa();
|
||||||
app.use(cors());
|
app.use(cors());
|
||||||
|
@ -134,7 +139,7 @@ export class FileServerService {
|
||||||
ctx.set('Content-Type', FILE_TYPE_BROWSERSAFE.includes(image.type) ? image.type : 'application/octet-stream');
|
ctx.set('Content-Type', FILE_TYPE_BROWSERSAFE.includes(image.type) ? image.type : 'application/octet-stream');
|
||||||
ctx.set('Cache-Control', 'max-age=31536000, immutable');
|
ctx.set('Cache-Control', 'max-age=31536000, immutable');
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
serverLogger.error(`${err}`);
|
this.#logger.error(`${err}`);
|
||||||
|
|
||||||
if (err instanceof StatusError && err.isClientError) {
|
if (err instanceof StatusError && err.isClientError) {
|
||||||
ctx.status = err.statusCode;
|
ctx.status = err.statusCode;
|
||||||
|
|
|
@ -13,13 +13,14 @@ import { ImageProcessingService } from '@/core/ImageProcessingService.js';
|
||||||
import type { IImage } from '@/core/ImageProcessingService.js';
|
import type { IImage } from '@/core/ImageProcessingService.js';
|
||||||
import { FILE_TYPE_BROWSERSAFE } from '@/const.js';
|
import { FILE_TYPE_BROWSERSAFE } from '@/const.js';
|
||||||
import { StatusError } from '@/misc/status-error.js';
|
import { StatusError } from '@/misc/status-error.js';
|
||||||
import Logger from '@/logger.js';
|
import type Logger from '@/logger.js';
|
||||||
import { FileInfoService } from '@/core/FileInfoService.js';
|
import { FileInfoService } from '@/core/FileInfoService.js';
|
||||||
|
import { LoggerService } from '@/core/LoggerService.js';
|
||||||
const serverLogger = new Logger('server', 'gray', false);
|
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class MediaProxyServerService {
|
export class MediaProxyServerService {
|
||||||
|
#logger: Logger;
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
@Inject(DI.config)
|
@Inject(DI.config)
|
||||||
private config: Config,
|
private config: Config,
|
||||||
|
@ -27,7 +28,9 @@ export class MediaProxyServerService {
|
||||||
private fileInfoService: FileInfoService,
|
private fileInfoService: FileInfoService,
|
||||||
private downloadService: DownloadService,
|
private downloadService: DownloadService,
|
||||||
private imageProcessingService: ImageProcessingService,
|
private imageProcessingService: ImageProcessingService,
|
||||||
|
private loggerService: LoggerService,
|
||||||
) {
|
) {
|
||||||
|
this.#logger = this.loggerService.getLogger('server', 'gray', false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public createServer() {
|
public createServer() {
|
||||||
|
@ -123,7 +126,7 @@ export class MediaProxyServerService {
|
||||||
ctx.set('Cache-Control', 'max-age=31536000, immutable');
|
ctx.set('Cache-Control', 'max-age=31536000, immutable');
|
||||||
ctx.body = image.data;
|
ctx.body = image.data;
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
serverLogger.error(`${err}`);
|
this.#logger.error(`${err}`);
|
||||||
|
|
||||||
if (err instanceof StatusError && (err.statusCode === 302 || err.isClientError)) {
|
if (err instanceof StatusError && (err.statusCode === 302 || err.isClientError)) {
|
||||||
ctx.status = err.statusCode;
|
ctx.status = err.statusCode;
|
||||||
|
|
|
@ -12,12 +12,13 @@ import { GlobalEventService } from '@/core/GlobalEventService.js';
|
||||||
import { Config } from '@/config.js';
|
import { Config } from '@/config.js';
|
||||||
import { UserProfilesRepository, UsersRepository } from '@/models/index.js';
|
import { UserProfilesRepository, UsersRepository } from '@/models/index.js';
|
||||||
import { DI } from '@/di-symbols.js';
|
import { DI } from '@/di-symbols.js';
|
||||||
import Logger from '@/logger.js';
|
import type Logger from '@/logger.js';
|
||||||
import { envOption } from '@/env.js';
|
import { envOption } from '@/env.js';
|
||||||
import * as Acct from '@/misc/acct.js';
|
import * as Acct from '@/misc/acct.js';
|
||||||
import { genIdenticon } from '@/misc/gen-identicon.js';
|
import { genIdenticon } from '@/misc/gen-identicon.js';
|
||||||
import { createTemp } from '@/misc/create-temp.js';
|
import { createTemp } from '@/misc/create-temp.js';
|
||||||
import { UserEntityService } from '@/core/entities/UserEntityService.js';
|
import { UserEntityService } from '@/core/entities/UserEntityService.js';
|
||||||
|
import { LoggerService } from '@/core/LoggerService.js';
|
||||||
import { ActivityPubServerService } from './ActivityPubServerService.js';
|
import { ActivityPubServerService } from './ActivityPubServerService.js';
|
||||||
import { NodeinfoServerService } from './NodeinfoServerService.js';
|
import { NodeinfoServerService } from './NodeinfoServerService.js';
|
||||||
import { ApiServerService } from './api/ApiServerService.js';
|
import { ApiServerService } from './api/ApiServerService.js';
|
||||||
|
@ -27,10 +28,10 @@ import { MediaProxyServerService } from './MediaProxyServerService.js';
|
||||||
import { FileServerService } from './FileServerService.js';
|
import { FileServerService } from './FileServerService.js';
|
||||||
import { ClientServerService } from './web/ClientServerService.js';
|
import { ClientServerService } from './web/ClientServerService.js';
|
||||||
|
|
||||||
const serverLogger = new Logger('server', 'gray', false);
|
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class ServerService {
|
export class ServerService {
|
||||||
|
#logger: Logger;
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
@Inject(DI.config)
|
@Inject(DI.config)
|
||||||
private config: Config,
|
private config: Config,
|
||||||
|
@ -51,7 +52,9 @@ export class ServerService {
|
||||||
private mediaProxyServerService: MediaProxyServerService,
|
private mediaProxyServerService: MediaProxyServerService,
|
||||||
private clientServerService: ClientServerService,
|
private clientServerService: ClientServerService,
|
||||||
private globalEventService: GlobalEventService,
|
private globalEventService: GlobalEventService,
|
||||||
|
private loggerService: LoggerService,
|
||||||
) {
|
) {
|
||||||
|
this.#logger = this.loggerService.getLogger('server', 'gray', false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public launch() {
|
public launch() {
|
||||||
|
@ -62,7 +65,7 @@ export class ServerService {
|
||||||
if (!['production', 'test'].includes(process.env.NODE_ENV ?? '')) {
|
if (!['production', 'test'].includes(process.env.NODE_ENV ?? '')) {
|
||||||
// Logger
|
// Logger
|
||||||
koa.use(koaLogger(str => {
|
koa.use(koaLogger(str => {
|
||||||
serverLogger.info(str);
|
this.#logger.info(str);
|
||||||
}));
|
}));
|
||||||
|
|
||||||
// Delay
|
// Delay
|
||||||
|
@ -151,16 +154,16 @@ export class ServerService {
|
||||||
|
|
||||||
this.streamingApiServerService.attachStreamingApi(server);
|
this.streamingApiServerService.attachStreamingApi(server);
|
||||||
|
|
||||||
server.on('error', e => {
|
server.on('error', err => {
|
||||||
switch ((e as any).code) {
|
switch ((err as any).code) {
|
||||||
case 'EACCES':
|
case 'EACCES':
|
||||||
serverLogger.error(`You do not have permission to listen on port ${this.config.port}.`);
|
this.#logger.error(`You do not have permission to listen on port ${this.config.port}.`);
|
||||||
break;
|
break;
|
||||||
case 'EADDRINUSE':
|
case 'EADDRINUSE':
|
||||||
serverLogger.error(`Port ${this.config.port} is already in use by another process.`);
|
this.#logger.error(`Port ${this.config.port} is already in use by another process.`);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
serverLogger.error(e);
|
this.#logger.error(err);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,12 +1,14 @@
|
||||||
import { Inject, Injectable } from '@nestjs/common';
|
import { Inject, Injectable } from '@nestjs/common';
|
||||||
import Logger from '@/logger.js';
|
import type Logger from '@/logger.js';
|
||||||
|
import { LoggerService } from '@/core/LoggerService.js';
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class ApiLoggerService {
|
export class ApiLoggerService {
|
||||||
public logger: Logger;
|
public logger: Logger;
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
|
private loggerService: LoggerService,
|
||||||
) {
|
) {
|
||||||
this.logger = new Logger('api');
|
this.logger = this.loggerService.getLogger('api');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,17 +2,21 @@ import { Inject, Injectable } from '@nestjs/common';
|
||||||
import Limiter from 'ratelimiter';
|
import Limiter from 'ratelimiter';
|
||||||
import Redis from 'ioredis';
|
import Redis from 'ioredis';
|
||||||
import { DI } from '@/di-symbols.js';
|
import { DI } from '@/di-symbols.js';
|
||||||
import Logger from '@/logger.js';
|
import type Logger from '@/logger.js';
|
||||||
|
import { LoggerService } from '@/core/LoggerService.js';
|
||||||
import type { IEndpointMeta } from './endpoints.js';
|
import type { IEndpointMeta } from './endpoints.js';
|
||||||
|
|
||||||
const logger = new Logger('limiter');
|
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class RateLimiterService {
|
export class RateLimiterService {
|
||||||
|
#logger: Logger;
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
@Inject(DI.redis)
|
@Inject(DI.redis)
|
||||||
private redisClient: Redis.Redis,
|
private redisClient: Redis.Redis,
|
||||||
|
|
||||||
|
private loggerService: LoggerService,
|
||||||
) {
|
) {
|
||||||
|
this.#logger = this.loggerService.getLogger('limiter');
|
||||||
}
|
}
|
||||||
|
|
||||||
public limit(limitation: IEndpointMeta['limit'] & { key: NonNullable<string> }, actor: string) {
|
public limit(limitation: IEndpointMeta['limit'] & { key: NonNullable<string> }, actor: string) {
|
||||||
|
@ -33,7 +37,7 @@ export class RateLimiterService {
|
||||||
return reject('ERR');
|
return reject('ERR');
|
||||||
}
|
}
|
||||||
|
|
||||||
logger.debug(`${actor} ${limitation.key} min remaining: ${info.remaining}`);
|
this.#logger.debug(`${actor} ${limitation.key} min remaining: ${info.remaining}`);
|
||||||
|
|
||||||
if (info.remaining === 0) {
|
if (info.remaining === 0) {
|
||||||
reject('BRIEF_REQUEST_INTERVAL');
|
reject('BRIEF_REQUEST_INTERVAL');
|
||||||
|
@ -61,7 +65,7 @@ export class RateLimiterService {
|
||||||
return reject('ERR');
|
return reject('ERR');
|
||||||
}
|
}
|
||||||
|
|
||||||
logger.debug(`${actor} ${limitation.key} max remaining: ${info.remaining}`);
|
this.#logger.debug(`${actor} ${limitation.key} max remaining: ${info.remaining}`);
|
||||||
|
|
||||||
if (info.remaining === 0) {
|
if (info.remaining === 0) {
|
||||||
reject('RATE_LIMIT_EXCEEDED');
|
reject('RATE_LIMIT_EXCEEDED');
|
||||||
|
|
|
@ -5,8 +5,9 @@ import { UsersRepository } from '@/models/index.js';
|
||||||
import { Config } from '@/config.js';
|
import { Config } from '@/config.js';
|
||||||
import { MetaService } from '@/core/MetaService.js';
|
import { MetaService } from '@/core/MetaService.js';
|
||||||
import { HttpRequestService } from '@/core/HttpRequestService.js';
|
import { HttpRequestService } from '@/core/HttpRequestService.js';
|
||||||
import Logger from '@/logger.js';
|
import type Logger from '@/logger.js';
|
||||||
import { query } from '@/misc/prelude/url.js';
|
import { query } from '@/misc/prelude/url.js';
|
||||||
|
import { LoggerService } from '@/core/LoggerService.js';
|
||||||
import type Koa from 'koa';
|
import type Koa from 'koa';
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
|
@ -22,8 +23,9 @@ export class UrlPreviewService {
|
||||||
|
|
||||||
private metaService: MetaService,
|
private metaService: MetaService,
|
||||||
private httpRequestService: HttpRequestService,
|
private httpRequestService: HttpRequestService,
|
||||||
|
private loggerService: LoggerService,
|
||||||
) {
|
) {
|
||||||
this.#logger = new Logger('url-preview');
|
this.#logger = this.loggerService.getLogger('url-preview');
|
||||||
}
|
}
|
||||||
|
|
||||||
#wrap(url?: string): string | null {
|
#wrap(url?: string): string | null {
|
||||||
|
|
Loading…
Reference in a new issue