From 566c125d6eee3bd907404523d94e1e0b5e403a46 Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Wed, 11 Dec 2019 14:14:01 +0100 Subject: Serve audit logs to client --- .../src/app/+admin/system/jobs/jobs.component.html | 2 +- client/src/app/+admin/system/logs/log-row.model.ts | 19 +++++++++++++++++ .../src/app/+admin/system/logs/logs.component.html | 13 ++++++++++-- .../src/app/+admin/system/logs/logs.component.scss | 10 +++++++++ .../src/app/+admin/system/logs/logs.component.ts | 24 +++++++++++++++++++++- client/src/app/+admin/system/logs/logs.service.ts | 20 ++++++++++++++---- 6 files changed, 80 insertions(+), 8 deletions(-) (limited to 'client/src/app/+admin/system') diff --git a/client/src/app/+admin/system/jobs/jobs.component.html b/client/src/app/+admin/system/jobs/jobs.component.html index cd26257dd..de43b6448 100644 --- a/client/src/app/+admin/system/jobs/jobs.component.html +++ b/client/src/app/+admin/system/jobs/jobs.component.html @@ -38,7 +38,7 @@ - + diff --git a/client/src/app/+admin/system/logs/log-row.model.ts b/client/src/app/+admin/system/logs/log-row.model.ts index 9bc7dafdd..b22581b5a 100644 --- a/client/src/app/+admin/system/logs/log-row.model.ts +++ b/client/src/app/+admin/system/logs/log-row.model.ts @@ -8,6 +8,10 @@ export class LogRow { message: string meta: string + by: string + domain: string + action: string + constructor (row: any) { this.date = new Date(row.timestamp) this.localeDate = this.date.toLocaleString() @@ -17,5 +21,20 @@ export class LogRow { const metaObj = omit(row, 'timestamp', 'level', 'message', 'label') if (Object.keys(metaObj).length !== 0) this.meta = JSON.stringify(metaObj, undefined, 2) + + if (row.level === 'audit') { + try { + const message = JSON.parse(row.message) + + this.by = message.user + this.domain = message.domain + this.action = message.action + + this.meta = JSON.stringify(message, null, 2) + this.message = '' + } catch (err) { + console.error('Cannot parse audit message.', err) + } + } } } diff --git a/client/src/app/+admin/system/logs/logs.component.html b/client/src/app/+admin/system/logs/logs.component.html index 45723a655..ddad1314f 100644 --- a/client/src/app/+admin/system/logs/logs.component.html +++ b/client/src/app/+admin/system/logs/logs.component.html @@ -1,11 +1,17 @@
+
+ +
+
-
+
@@ -23,9 +29,12 @@ [{{ log.localeDate }}] + By {{ log.by }} -> + {{ log.domain }} -> {{ log.action }} + {{ log.message }} - {{ log.meta }} +
{{ log.meta }}
diff --git a/client/src/app/+admin/system/logs/logs.component.scss b/client/src/app/+admin/system/logs/logs.component.scss index 7ad2e853c..dae8b21c7 100644 --- a/client/src/app/+admin/system/logs/logs.component.scss +++ b/client/src/app/+admin/system/logs/logs.component.scss @@ -23,6 +23,10 @@ margin-right: 5px; } + .log-by { + margin: 0 5px; + } + .warn { color: $orange-color; } @@ -30,6 +34,12 @@ .error { color: $red; } + + pre { + margin-bottom: 5px; + white-space: pre-wrap; + word-wrap: break-word; + } } .header { diff --git a/client/src/app/+admin/system/logs/logs.component.ts b/client/src/app/+admin/system/logs/logs.component.ts index b2aca8461..b63f11953 100644 --- a/client/src/app/+admin/system/logs/logs.component.ts +++ b/client/src/app/+admin/system/logs/logs.component.ts @@ -17,9 +17,11 @@ export class LogsComponent implements OnInit { logs: LogRow[] = [] timeChoices: { id: string, label: string }[] = [] levelChoices: { id: LogLevel, label: string }[] = [] + logTypeChoices: { id: 'audit' | 'standard', label: string }[] = [] startDate: string level: LogLevel + logType: 'audit' | 'standard' constructor ( private logsService: LogsService, @@ -30,6 +32,7 @@ export class LogsComponent implements OnInit { ngOnInit (): void { this.buildTimeChoices() this.buildLevelChoices() + this.buildLogTypeChoices() this.load() } @@ -42,7 +45,7 @@ export class LogsComponent implements OnInit { load () { this.loading = true - this.logsService.getLogs(this.level, this.startDate) + this.logsService.getLogs({ isAuditLog: this.isAuditLog(), level: this.level, startDate: this.startDate }) .subscribe( logs => { this.logs = logs @@ -58,6 +61,10 @@ export class LogsComponent implements OnInit { ) } + isAuditLog () { + return this.logType === 'audit' + } + buildTimeChoices () { const lastHour = new Date() lastHour.setHours(lastHour.getHours() - 1) @@ -108,4 +115,19 @@ export class LogsComponent implements OnInit { this.level = 'warn' } + + buildLogTypeChoices () { + this.logTypeChoices = [ + { + id: 'standard', + label: this.i18n('Standard logs') + }, + { + id: 'audit', + label: this.i18n('Audit logs') + } + ] + + this.logType = 'audit' + } } diff --git a/client/src/app/+admin/system/logs/logs.service.ts b/client/src/app/+admin/system/logs/logs.service.ts index 24b9cb6d1..41b38c7ba 100644 --- a/client/src/app/+admin/system/logs/logs.service.ts +++ b/client/src/app/+admin/system/logs/logs.service.ts @@ -10,6 +10,7 @@ import { LogLevel } from '@shared/models/server/log-level.type' @Injectable() export class LogsService { private static BASE_LOG_URL = environment.apiUrl + '/api/v1/server/logs' + private static BASE_AUDIT_LOG_URL = environment.apiUrl + '/api/v1/server/audit-logs' constructor ( private authHttp: HttpClient, @@ -17,14 +18,25 @@ export class LogsService { private restExtractor: RestExtractor ) {} - getLogs (level: LogLevel, startDate: string, endDate?: string): Observable { + getLogs (options: { + isAuditLog: boolean, + startDate: string, + level?: LogLevel, + endDate?: string + }): Observable { + const { isAuditLog, startDate } = options + let params = new HttpParams() params = params.append('startDate', startDate) - params = params.append('level', level) - if (endDate) params.append('endDate', endDate) + if (!isAuditLog) params = params.append('level', options.level) + if (options.endDate) params.append('endDate', options.endDate) + + const path = isAuditLog + ? LogsService.BASE_AUDIT_LOG_URL + : LogsService.BASE_LOG_URL - return this.authHttp.get(LogsService.BASE_LOG_URL, { params }) + return this.authHttp.get(path, { params }) .pipe( map(rows => rows.map(r => new LogRow(r))), catchError(err => this.restExtractor.handleError(err)) -- cgit v1.2.3