summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsyuilo <Syuilotan@yahoo.co.jp>2021-10-22 20:41:15 +0900
committersyuilo <Syuilotan@yahoo.co.jp>2021-10-22 20:41:15 +0900
commit632af91878b37409afbfe3603967a552011f3fd1 (patch)
treedf7d3c9577daa485013db1ca2f543a2d8c696273
parentclient: change url /instance -> /admin (diff)
downloadsharkey-632af91878b37409afbfe3603967a552011f3fd1.tar.gz
sharkey-632af91878b37409afbfe3603967a552011f3fd1.tar.bz2
sharkey-632af91878b37409afbfe3603967a552011f3fd1.zip
データベースにログを保存するのを廃止
Close #7878
-rw-r--r--CHANGELOG.md4
-rw-r--r--migration/1634902659689-delete-log.ts13
-rw-r--r--src/client/pages/admin/index.vue6
-rw-r--r--src/client/pages/admin/logs.vue97
-rw-r--r--src/db/postgre.ts2
-rw-r--r--src/models/entities/log.ts46
-rw-r--r--src/models/index.ts2
-rw-r--r--src/server/api/endpoints/admin/logs.ts126
-rw-r--r--src/services/logger.ts16
9 files changed, 17 insertions, 295 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index a4996cfe47..1a67411848 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -27,6 +27,10 @@
- クライアント: リモートノートで意図せずローカルカスタム絵文字が使われてしまうことがあるのを修正
- ActivityPub: not reacted な Undo.Like がinboxに滞留するのを修正
+### Changes
+- データベースにログを保存しないようになりました
+ - ログを永続化したい場合はsyslogを利用してください
+
## 12.92.0 (2021/10/16)
### Improvements
diff --git a/migration/1634902659689-delete-log.ts b/migration/1634902659689-delete-log.ts
new file mode 100644
index 0000000000..5264d585c7
--- /dev/null
+++ b/migration/1634902659689-delete-log.ts
@@ -0,0 +1,13 @@
+import {MigrationInterface, QueryRunner} from "typeorm";
+
+export class deleteLog1634902659689 implements MigrationInterface {
+ name = 'deleteLog1634902659689'
+
+ public async up(queryRunner: QueryRunner): Promise<void> {
+ await queryRunner.query(`DROP TABLE "log"`);
+ }
+
+ public async down(queryRunner: QueryRunner): Promise<void> {
+ }
+
+}
diff --git a/src/client/pages/admin/index.vue b/src/client/pages/admin/index.vue
index 7094f2d4bf..416e68206c 100644
--- a/src/client/pages/admin/index.vue
+++ b/src/client/pages/admin/index.vue
@@ -201,11 +201,6 @@ export default defineComponent({
text: i18n.locale.database,
to: '/admin/database',
active: page.value === 'database',
- }, {
- icon: 'fas fa-stream',
- text: i18n.locale.logs,
- to: '/admin/logs',
- active: page.value === 'logs',
}],
}]);
const component = computed(() => {
@@ -220,7 +215,6 @@ export default defineComponent({
case 'announcements': return defineAsyncComponent(() => import('./announcements.vue'));
case 'ads': return defineAsyncComponent(() => import('./ads.vue'));
case 'database': return defineAsyncComponent(() => import('./database.vue'));
- case 'logs': return defineAsyncComponent(() => import('./logs.vue'));
case 'abuses': return defineAsyncComponent(() => import('./abuses.vue'));
case 'settings': return defineAsyncComponent(() => import('./settings.vue'));
case 'files-settings': return defineAsyncComponent(() => import('./files-settings.vue'));
diff --git a/src/client/pages/admin/logs.vue b/src/client/pages/admin/logs.vue
deleted file mode 100644
index 74aea0fc45..0000000000
--- a/src/client/pages/admin/logs.vue
+++ /dev/null
@@ -1,97 +0,0 @@
-<template>
-<div class="_section">
- <div class="_inputs">
- <MkInput v-model="logDomain" :debounce="true">
- <template #label>{{ $ts.domain }}</template>
- </MkInput>
- <MkSelect v-model="logLevel">
- <template #label>Level</template>
- <option value="all">All</option>
- <option value="info">Info</option>
- <option value="success">Success</option>
- <option value="warning">Warning</option>
- <option value="error">Error</option>
- <option value="debug">Debug</option>
- </MkSelect>
- </div>
-
- <div class="logs">
- <code v-for="log in logs" :key="log.id" :class="log.level">
- <details>
- <summary><MkTime :time="log.createdAt"/> [{{ log.domain.join('.') }}] {{ log.message }}</summary>
- <!--<vue-json-pretty v-if="log.data" :data="log.data"></vue-json-pretty>-->
- </details>
- </code>
- </div>
-
- <MkButton @click="deleteAllLogs()" primary><i class="fas fa-trash-alt"></i> {{ $ts.deleteAll }}</MkButton>
-</div>
-</template>
-
-<script lang="ts">
-import { defineComponent } from 'vue';
-import MkButton from '@client/components/ui/button.vue';
-import MkInput from '@client/components/form/input.vue';
-import MkSelect from '@client/components/form/select.vue';
-import MkTextarea from '@client/components/form/textarea.vue';
-import * as os from '@client/os';
-import * as symbols from '@client/symbols';
-
-export default defineComponent({
- components: {
- MkButton,
- MkInput,
- MkSelect,
- MkTextarea,
- },
-
- emits: ['info'],
-
- data() {
- return {
- [symbols.PAGE_INFO]: {
- title: this.$ts.serverLogs,
- icon: 'fas fa-stream'
- },
- logs: [],
- logLevel: 'all',
- logDomain: '',
- }
- },
-
- watch: {
- logLevel() {
- this.logs = [];
- this.fetchLogs();
- },
- logDomain() {
- this.logs = [];
- this.fetchLogs();
- }
- },
-
- created() {
- this.fetchLogs();
- },
-
- mounted() {
- this.$emit('info', this[symbols.PAGE_INFO]);
- },
-
- methods: {
- fetchLogs() {
- os.api('admin/logs', {
- level: this.logLevel === 'all' ? null : this.logLevel,
- domain: this.logDomain === '' ? null : this.logDomain,
- limit: 30
- }).then(logs => {
- this.logs = logs.reverse();
- });
- },
-
- deleteAllLogs() {
- os.apiWithDialog('admin/delete-logs');
- },
- }
-});
-</script>
diff --git a/src/db/postgre.ts b/src/db/postgre.ts
index 0b635ea18e..4f4047b613 100644
--- a/src/db/postgre.ts
+++ b/src/db/postgre.ts
@@ -8,7 +8,6 @@ import { entities as charts } from '@/services/chart/entities';
import { dbLogger } from './logger';
import * as highlight from 'cli-highlight';
-import { Log } from '@/models/entities/log';
import { User } from '@/models/entities/user';
import { DriveFile } from '@/models/entities/drive-file';
import { DriveFolder } from '@/models/entities/drive-folder';
@@ -144,7 +143,6 @@ export const entities = [
PageLike,
GalleryPost,
GalleryLike,
- Log,
DriveFile,
DriveFolder,
Poll,
diff --git a/src/models/entities/log.ts b/src/models/entities/log.ts
deleted file mode 100644
index 182a9fbed8..0000000000
--- a/src/models/entities/log.ts
+++ /dev/null
@@ -1,46 +0,0 @@
-import { Entity, PrimaryColumn, Index, Column } from 'typeorm';
-import { id } from '../id';
-
-@Entity()
-export class Log {
- @PrimaryColumn(id())
- public id: string;
-
- @Index()
- @Column('timestamp with time zone', {
- comment: 'The created date of the Log.'
- })
- public createdAt: Date;
-
- @Index()
- @Column('varchar', {
- length: 64, array: true, default: '{}'
- })
- public domain: string[];
-
- @Index()
- @Column('enum', {
- enum: ['error', 'warning', 'info', 'success', 'debug']
- })
- public level: string;
-
- @Column('varchar', {
- length: 8
- })
- public worker: string;
-
- @Column('varchar', {
- length: 128
- })
- public machine: string;
-
- @Column('varchar', {
- length: 2048
- })
- public message: string;
-
- @Column('jsonb', {
- default: {}
- })
- public data: Record<string, any>;
-}
diff --git a/src/models/index.ts b/src/models/index.ts
index 059a3d7b87..4c6f19eaff 100644
--- a/src/models/index.ts
+++ b/src/models/index.ts
@@ -13,7 +13,6 @@ import { UserRepository } from './repositories/user';
import { NoteRepository } from './repositories/note';
import { DriveFileRepository } from './repositories/drive-file';
import { DriveFolderRepository } from './repositories/drive-folder';
-import { Log } from './entities/log';
import { AccessToken } from './entities/access-token';
import { UserNotePining } from './entities/user-note-pining';
import { SigninRepository } from './repositories/signin';
@@ -108,7 +107,6 @@ export const Signins = getCustomRepository(SigninRepository);
export const MessagingMessages = getCustomRepository(MessagingMessageRepository);
export const ReversiGames = getCustomRepository(ReversiGameRepository);
export const ReversiMatchings = getCustomRepository(ReversiMatchingRepository);
-export const Logs = getRepository(Log);
export const Pages = getCustomRepository(PageRepository);
export const PageLikes = getCustomRepository(PageLikeRepository);
export const GalleryPosts = getCustomRepository(GalleryPostRepository);
diff --git a/src/server/api/endpoints/admin/logs.ts b/src/server/api/endpoints/admin/logs.ts
deleted file mode 100644
index 776403a62e..0000000000
--- a/src/server/api/endpoints/admin/logs.ts
+++ /dev/null
@@ -1,126 +0,0 @@
-import $ from 'cafy';
-import define from '../../define';
-import { Logs } from '@/models/index';
-import { Brackets } from 'typeorm';
-
-export const meta = {
- tags: ['admin'],
-
- requireCredential: true as const,
- requireModerator: true,
-
- params: {
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 30
- },
-
- level: {
- validator: $.optional.nullable.str,
- default: null
- },
-
- domain: {
- validator: $.optional.nullable.str,
- default: null
- }
- },
-
- res: {
- type: 'array' as const,
- optional: false as const, nullable: false as const,
- items: {
- type: 'object' as const,
- optional: false as const, nullable: false as const,
- properties: {
- id: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- format: 'id',
- example: 'xxxxxxxxxx',
- },
- createdAt: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- format: 'date-time',
- },
- domain: {
- type: 'array' as const,
- optional: false as const, nullable: false as const,
- items: {
- type: 'string' as const,
- optional: true as const, nullable: false as const
- }
- },
- level: {
- type: 'string' as const,
- optional: false as const, nullable: false as const
- },
- worker: {
- type: 'string' as const,
- optional: false as const, nullable: false as const
- },
- machine: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- },
- message: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- },
- data: {
- type: 'object' as const,
- optional: false as const, nullable: false as const
- }
- }
- }
- }
-};
-
-export default define(meta, async (ps) => {
- const query = Logs.createQueryBuilder('log');
-
- if (ps.level) query.andWhere('log.level = :level', { level: ps.level });
-
- if (ps.domain) {
- const whiteDomains = ps.domain.split(' ').filter(x => !x.startsWith('-'));
- const blackDomains = ps.domain.split(' ').filter(x => x.startsWith('-')).map(x => x.substr(1));
-
- if (whiteDomains.length > 0) {
- query.andWhere(new Brackets(qb => {
- for (const whiteDomain of whiteDomains) {
- let i = 0;
- for (const subDomain of whiteDomain.split('.')) {
- const p = `whiteSubDomain_${subDomain}_${i}`;
- // SQL is 1 based, so we need '+ 1'
- qb.orWhere(`log.domain[${i + 1}] = :${p}`, { [p]: subDomain });
- i++;
- }
- }
- }));
- }
-
- if (blackDomains.length > 0) {
- query.andWhere(new Brackets(qb => {
- for (const blackDomain of blackDomains) {
- qb.andWhere(new Brackets(qb => {
- const subDomains = blackDomain.split('.');
- let i = 0;
- for (const subDomain of subDomains) {
- const p = `blackSubDomain_${subDomain}_${i}`;
- // 全体で否定できないのでド・モルガンの法則で
- // !(P && Q) を !P || !Q で表す
- // SQL is 1 based, so we need '+ 1'
- qb.orWhere(`log.domain[${i + 1}] != :${p}`, { [p]: subDomain });
- i++;
- }
- }));
- }
- }));
- }
- }
-
- const logs = await query.orderBy('log.createdAt', 'DESC').take(ps.limit!).getMany();
-
- return logs;
-});
diff --git a/src/services/logger.ts b/src/services/logger.ts
index 8e783e67f6..67ee441254 100644
--- a/src/services/logger.ts
+++ b/src/services/logger.ts
@@ -1,11 +1,7 @@
import * as cluster from 'cluster';
-import * as os from 'os';
import * as chalk from 'chalk';
import * as dateformat from 'dateformat';
import { envOption } from '../env';
-import { getRepository } from 'typeorm';
-import { Log } from '@/models/entities/log';
-import { genId } from '@/misc/gen-id';
import config from '@/config/index';
import * as SyslogPro from 'syslog-pro';
@@ -95,18 +91,6 @@ export default class Logger {
null as never;
send.bind(this.syslogClient)(message).catch(() => {});
- } else {
- const Logs = getRepository(Log);
- Logs.insert({
- id: genId(),
- createdAt: new Date(),
- machine: os.hostname(),
- worker: worker.toString(),
- domain: [this.domain].concat(subDomains).map(d => d.name),
- level: level,
- message: message.substr(0, 1000), // 1024を超えるとログが挿入できずエラーになり無限ループする
- data: data,
- } as Log).catch(() => {});
}
}
}