Skip to content

Commit 0d00fbb

Browse files
committed
fix(#5370): fix logfile view styling issues and make sure that links are rendered with an underline similarly to what already happens in other views
1 parent b3662bd commit 0d00fbb

3 files changed

Lines changed: 38 additions & 11 deletions

File tree

spring-boot-admin-samples/spring-boot-admin-sample-servlet/src/main/java/de/codecentric/boot/admin/sample/QuartzJobsConfiguration.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
2424
import org.quartz.SimpleScheduleBuilder;
2525
import org.quartz.Trigger;
2626
import org.quartz.TriggerBuilder;
27+
import org.slf4j.Logger;
28+
import org.slf4j.LoggerFactory;
2729
import org.springframework.context.annotation.Bean;
2830
import org.springframework.context.annotation.Configuration;
2931
import org.springframework.scheduling.quartz.QuartzJobBean;
@@ -108,9 +110,11 @@ public Trigger hourlyTestTrigger() {
108110
*/
109111
public static class SampleJob extends QuartzJobBean {
110112

113+
private static final Logger logger = LoggerFactory.getLogger(SampleJob.class);
114+
111115
@Override
112116
protected void executeInternal(org.quartz.JobExecutionContext context) {
113-
System.out.println("Sample Quartz Job executed at " + new java.util.Date());
117+
logger.info("Sample Quartz Job executed at {}", new java.util.Date());
114118
}
115119

116120
}
@@ -120,9 +124,11 @@ protected void executeInternal(org.quartz.JobExecutionContext context) {
120124
*/
121125
public static class AnotherSampleJob extends QuartzJobBean {
122126

127+
private static final Logger logger = LoggerFactory.getLogger(AnotherSampleJob.class);
128+
123129
@Override
124130
protected void executeInternal(org.quartz.JobExecutionContext context) {
125-
System.out.println("Another Quartz Job executed at " + new java.util.Date());
131+
logger.info("Another Quartz Job executed at {}", new java.util.Date());
126132
}
127133

128134
}

spring-boot-admin-server-ui/src/main/frontend/utils/logtail.ts

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import { EMPTY, Observable, catchError, concatMap, of, timer } from './rxjs';
1818
export default (getFn, interval, initialSize = 300 * 1024) => {
1919
let range = `bytes=-${initialSize}`;
2020
let size = 0;
21+
let atTheEnd = false;
2122

2223
return timer(0, interval).pipe(
2324
concatMap(() => {
@@ -46,7 +47,10 @@ export default (getFn, interval, initialSize = 300 * 1024) => {
4647
size = contentLength;
4748
range = `bytes=${size - 1}-`;
4849
} else if (response.status === 206) {
49-
size = parseInt(response.headers['content-range'].split('/')[1]);
50+
const contentRangeParts = response.headers['content-range'].split('/');
51+
size = parseInt(contentRangeParts[1]);
52+
// The end value of the range is always one byte less than the size when at the end
53+
atTheEnd = parseInt(contentRangeParts[0].split('-')[1]) == size - 1;
5054
range = `bytes=${size - 1}-`;
5155
} else if (response.status === 416) {
5256
size = 0;
@@ -68,15 +72,17 @@ export default (getFn, interval, initialSize = 300 * 1024) => {
6872
skipped = size - addendum.length;
6973
}
7074
} else if (response.data.length > 1) {
71-
// Remove the first byte which has been part of the previos response.
75+
// Remove the first byte which has been part of the previous response.
7276
addendum = response.data.substring(1);
7377
}
7478

7579
return addendum
7680
? of({
7781
totalBytes: size,
7882
skipped,
79-
addendum,
83+
// The log file always temporarily ends with a new line until the next one is written.
84+
// Therefore, if we're at the end of it, we drop such a new line.
85+
addendum: atTheEnd ? addendum.trimEnd() : addendum,
8086
})
8187
: EMPTY;
8288
}),

spring-boot-admin-server-ui/src/main/frontend/views/instances/logfile/index.vue

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@
9595
:class="{ 'wrap-lines': wrapLines }"
9696
class="log-viewer overflow-x-auto text-sm -mx-6 -my-20 pt-14"
9797
>
98-
<table class="table-striped" />
98+
<table ref="logContainer" class="table-striped min-w-full" />
9999
</div>
100100
</sba-instance-section>
101101
</template>
@@ -191,14 +191,20 @@ export default {
191191
.subscribe({
192192
next: (lines) => {
193193
this.hasLoaded = true;
194+
const logContainer = this.$refs.logContainer;
194195
lines.forEach((line) => {
196+
let content;
197+
if (line) {
198+
content = document.createElement('pre');
199+
content.innerHTML = autolink(this.ansiUp.ansi_to_html(line));
200+
} else {
201+
content = document.createElement('br');
202+
}
195203
const row = document.createElement('tr');
196204
const col = document.createElement('td');
197-
const pre = document.createElement('pre');
198-
pre.innerHTML = autolink(this.ansiUp.ansi_to_html(line));
199-
col.appendChild(pre);
205+
col.appendChild(content);
200206
row.appendChild(col);
201-
document.querySelector('.log-viewer > table')?.appendChild(row);
207+
logContainer.appendChild(row);
202208
});
203209
204210
if (this.atBottom) {
@@ -269,15 +275,24 @@ export default {
269275
max-height: 100%;
270276
}
271277
278+
.log-viewer tr,
279+
.log-viewer td {
280+
@apply w-full;
281+
}
282+
272283
.log-viewer pre {
273284
padding: 0 0.75em;
274285
margin-bottom: 1px;
275286
}
276287
277-
.log-viewer pre:hover {
288+
.log-viewer td:hover {
278289
background: #dbdbdb;
279290
}
280291
292+
.log-viewer a[href] {
293+
@apply underline;
294+
}
295+
281296
.log-viewer.wrap-lines pre {
282297
@apply whitespace-pre-wrap;
283298
word-break: break-all;

0 commit comments

Comments
 (0)