diff --git a/client/src/app/+admin/system/logs/logs.component.html b/client/src/app/+admin/system/logs/logs.component.html
index c945c1fdc..d602090ef 100644
--- a/client/src/app/+admin/system/logs/logs.component.html
+++ b/client/src/app/+admin/system/logs/logs.component.html
@@ -37,19 +37,27 @@
Loading...
+
+
No log.
-
-
{{ log.level }}
+
+
+
{{ log.level }}
-
[{{ log.localeDate }}]
+
[{{ log.localeDate }}]
-
By {{ log.by }} ->
-
{{ log.domain }} -> {{ log.action }}
+
By {{ log.by }} ->
+
{{ log.domain }} -> {{ log.action }}
- {{ log.message }}
+ {{ 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 128c71e40..ae038c033 100644
--- a/client/src/app/+admin/system/logs/logs.component.scss
+++ b/client/src/app/+admin/system/logs/logs.component.scss
@@ -9,6 +9,10 @@
background: rgba(0, 0, 0, 0.03);
padding: 20px;
+ > div {
+ position: relative;
+ }
+
.log-row {
margin-top: 1px;
word-break: break-word;
@@ -81,7 +85,11 @@
&.error {
color: rgb(250, 5, 5);
}
+}
+my-copy-button {
+ position: absolute;
+ right: 5px;
}
@include on-small-main-col {
diff --git a/client/src/app/+admin/system/logs/logs.component.ts b/client/src/app/+admin/system/logs/logs.component.ts
index 18fcdbe4c..e236a81bd 100644
--- a/client/src/app/+admin/system/logs/logs.component.ts
+++ b/client/src/app/+admin/system/logs/logs.component.ts
@@ -1,28 +1,42 @@
+import { DatePipe, NgClass, NgFor, NgIf } from '@angular/common'
import { Component, ElementRef, OnInit, ViewChild } from '@angular/core'
+import { FormsModule } from '@angular/forms'
import { LocalStorageService, Notifier } from '@app/core'
+import { NgSelectModule } from '@ng-select/ng-select'
import { ServerLogLevel } from '@peertube/peertube-models'
+import { SelectTagsComponent } from '../../../shared/shared-forms/select/select-tags.component'
+import { ButtonComponent } from '../../../shared/shared-main/buttons/button.component'
+import { CopyButtonComponent } from '../../../shared/shared-main/buttons/copy-button.component'
import { LogRow } from './log-row.model'
import { LogsService } from './logs.service'
-import { ButtonComponent } from '../../../shared/shared-main/buttons/button.component'
-import { SelectTagsComponent } from '../../../shared/shared-forms/select/select-tags.component'
-import { NgSelectModule } from '@ng-select/ng-select'
-import { NgFor, NgIf, NgClass, DatePipe } from '@angular/common'
-import { FormsModule } from '@angular/forms'
@Component({
templateUrl: './logs.component.html',
styleUrls: [ './logs.component.scss' ],
standalone: true,
- imports: [ FormsModule, NgFor, NgSelectModule, NgIf, NgClass, SelectTagsComponent, ButtonComponent, DatePipe ]
+ imports: [
+ FormsModule,
+ NgFor,
+ NgSelectModule,
+ NgIf,
+ NgClass,
+ SelectTagsComponent,
+ ButtonComponent,
+ DatePipe,
+ CopyButtonComponent
+ ]
})
export class LogsComponent implements OnInit {
private static LOCAL_STORAGE_LOG_TYPE_CHOICE_KEY = 'admin-logs-log-type-choice'
@ViewChild('logsElement', { static: true }) logsElement: ElementRef
+ @ViewChild('logsContent', { static: true }) logsContent: ElementRef
loading = false
+ rawLogs: string
logs: LogRow[] = []
+
timeChoices: { id: string, label: string, dateFormat: string }[] = []
levelChoices: { id: ServerLogLevel, label: string }[] = []
logTypeChoices: { id: 'audit' | 'standard', label: string }[] = []
@@ -72,6 +86,8 @@ export class LogsComponent implements OnInit {
next: logs => {
this.logs = logs
+ this.rawLogs = this.logs.map(l => `${l.level} ${l.localeDate} ${l.message} ${l.meta}`).join('\n')
+
setTimeout(() => {
this.logsElement.nativeElement.scrollIntoView({ block: 'end', inline: 'nearest' })
})
diff --git a/client/src/app/+admin/system/logs/logs.service.ts b/client/src/app/+admin/system/logs/logs.service.ts
index 9e774d7fd..b157ae9df 100644
--- a/client/src/app/+admin/system/logs/logs.service.ts
+++ b/client/src/app/+admin/system/logs/logs.service.ts
@@ -1,9 +1,8 @@
-import { Observable } from 'rxjs'
-import { catchError, map } from 'rxjs/operators'
import { HttpClient, HttpParams } from '@angular/common/http'
import { Injectable } from '@angular/core'
import { RestExtractor, RestService } from '@app/core'
import { ServerLogLevel } from '@peertube/peertube-models'
+import { catchError, map } from 'rxjs/operators'
import { environment } from '../../../../environments/environment'
import { LogRow } from './log-row.model'
@@ -24,7 +23,7 @@ export class LogsService {
tagsOneOf?: string[]
level?: ServerLogLevel
endDate?: string
- }): Observable {
+ }) {
const { isAuditLog, startDate, endDate, tagsOneOf } = options
let params = new HttpParams()
@@ -38,7 +37,7 @@ export class LogsService {
? LogsService.BASE_AUDIT_LOG_URL
: LogsService.BASE_LOG_URL
- return this.authHttp.get(path, { params })
+ return this.authHttp.get(path, { params })
.pipe(
map(rows => rows.map(r => new LogRow(r))),
catchError(err => this.restExtractor.handleError(err))
diff --git a/client/src/app/shared/shared-main/buttons/copy-button.component.html b/client/src/app/shared/shared-main/buttons/copy-button.component.html
index a99c0a93a..149a36cc7 100644
--- a/client/src/app/shared/shared-main/buttons/copy-button.component.html
+++ b/client/src/app/shared/shared-main/buttons/copy-button.component.html
@@ -1,7 +1,7 @@