ffplayout/frontend/pages/logging.vue

210 lines
5.1 KiB
Vue
Raw Normal View History

2020-04-17 09:02:21 -04:00
<template>
<div class="w-full flex flex-col">
2024-04-16 12:13:28 -04:00
<div class="flex justify-end p-3 h-14">
2024-04-29 04:48:51 -04:00
<div class="join">
<select v-model="errorLevel" class="join-item select select-sm select-bordered w-full max-w-xs">
<option
2024-09-03 10:12:29 -04:00
v-for="(index, value) in indexStore.severityLevels"
:key="index"
:value="value"
2024-09-03 10:12:29 -04:00
:selected="value === errorLevel"
>
{{ value }}
</option>
</select>
2024-04-16 12:13:28 -04:00
<VueDatePicker
v-model="listDate"
:clearable="false"
:hide-navigation="['time']"
:action-row="{ showCancel: false, showSelect: false, showPreview: false }"
:format="calendarFormat"
model-type="yyyy-MM-dd"
auto-apply
2024-04-13 18:01:45 -04:00
:locale="locale"
2024-04-09 11:21:13 -04:00
:dark="colorMode.value === 'dark'"
:ui="{ input: 'join-item input !input-sm !input-bordered !w-[170px] text-right !pe-3' }"
required
/>
2024-10-03 11:54:24 -04:00
<button class="btn btn-sm btn-primary join-item" :title="t('log.reload')" @click="getLog()">
<i class="bi-arrow-repeat" />
</button>
<button class="btn btn-sm btn-primary join-item" :title="t('log.download')" @click="downloadLog">
2024-04-29 04:48:51 -04:00
<i class="bi-download" />
</button>
2024-04-16 12:13:28 -04:00
</div>
</div>
<div class="px-3 inline-block h-[calc(100vh-140px)] text-[13px]">
<div id="log-container" class="bg-base-300 whitespace-pre h-full font-mono overflow-auto p-3">
<div id="log-content" v-html="filterLogsBySeverity(formatLog(currentLog), errorLevel)" />
</div>
2023-01-11 04:54:25 -05:00
</div>
2024-04-05 12:51:50 -04:00
</div>
2020-04-17 09:02:21 -04:00
</template>
2023-01-11 04:54:25 -05:00
<script setup lang="ts">
2023-03-22 11:01:58 -04:00
import { storeToRefs } from 'pinia'
2023-01-11 04:54:25 -05:00
const colorMode = useColorMode()
2024-04-16 08:07:50 -04:00
const { locale, t } = useI18n()
2024-09-03 10:12:29 -04:00
const indexStore = useIndex()
2023-01-11 04:54:25 -05:00
useHead({
2024-04-16 08:07:50 -04:00
title: `${t('button.logging')} | ffplayout`,
2023-01-11 04:54:25 -05:00
})
const { i } = storeToRefs(useConfig())
2023-01-11 04:54:25 -05:00
const { $dayjs } = useNuxtApp()
const authStore = useAuth()
const configStore = useConfig()
const currentLog = ref('')
const listDate = ref($dayjs().utcOffset(configStore.utcOffset).format('YYYY-MM-DD'))
const { formatLog } = stringFormatter()
2024-09-03 10:12:29 -04:00
const levelCookie = useCookie('error_level', {
path: '/',
maxAge: 60 * 60 * 24 * 365,
sameSite: 'lax',
})
const errorLevel = computed({
get() {
return levelCookie.value || 'INFO'
},
set(value) {
levelCookie.value = value
},
})
2024-08-22 11:22:20 -04:00
onMounted(async () => {
await getLog()
2023-03-22 11:01:58 -04:00
})
watch([listDate, i], () => {
getLog()
})
const calendarFormat = (date: Date) => {
return $dayjs(date).locale(locale.value).format('ddd L')
}
function scrollTo() {
const parent = document.getElementById('log-container')
const child = document.getElementById('log-content')
if (child && parent) {
parent.scrollTop = child.scrollHeight
}
}
function filterLogsBySeverity(logString: string, minSeverity: string): string {
2024-09-03 10:12:29 -04:00
const minLevel = indexStore.severityLevels[minSeverity]
const logLines = logString.trim().split(/\r?\n/)
const filteredLogs = logLines.filter((log) => {
const match = log.match(/\[ ?(DEBUG|INFO|WARN|ERROR)\]/)
if (match) {
const logLevel = match[1]
2024-09-03 10:12:29 -04:00
return indexStore.severityLevels[logLevel] >= minLevel
}
return true
})
return filteredLogs.join('\n')
}
2023-01-11 04:54:25 -05:00
async function getLog() {
let date = listDate.value
if (date === $dayjs().utcOffset(configStore.utcOffset).format('YYYY-MM-DD')) {
date = ''
2020-04-17 09:02:21 -04:00
}
2023-01-11 04:54:25 -05:00
await fetch(`/api/log/${configStore.channels[configStore.i].id}?date=${date}`, {
2023-01-11 04:54:25 -05:00
method: 'GET',
headers: authStore.authHeader,
})
.then((response) => response.text())
.then((data) => {
currentLog.value = data
nextTick(() => {
scrollTo()
})
2023-01-11 04:54:25 -05:00
})
.catch(() => {
currentLog.value = ''
})
2020-04-17 09:02:21 -04:00
}
2024-04-29 04:48:51 -04:00
function downloadLog() {
const file = new File(
[formatLog(currentLog.value).replace(/<\/?[^>]+(>|$)/g, '')],
`playout_${listDate.value}.log`,
{
type: 'text/plain',
}
)
const link = document.createElement('a')
const url = URL.createObjectURL(file)
link.href = url
link.download = file.name
document.body.appendChild(link)
link.click()
document.body.removeChild(link)
window.URL.revokeObjectURL(url)
}
2020-04-17 09:02:21 -04:00
</script>
<style>
.log-time {
color: #666864;
}
.log-number {
2024-04-15 11:39:41 -04:00
color: var(--my-yellow);
}
.log-addr {
2024-04-15 11:39:41 -04:00
color: var(--my-purple);
font-weight: 500;
}
.log-cmd {
2024-04-15 11:39:41 -04:00
color: var(--my-blue);
}
2020-04-27 10:07:28 -04:00
.log-info {
2024-04-15 11:39:41 -04:00
color: var(--my-green);
2020-04-27 10:07:28 -04:00
}
.log-warning {
color: #ff8700;
2020-04-27 10:07:28 -04:00
}
.log-error {
color: #d32828;
2020-04-27 10:07:28 -04:00
}
.log-debug {
color: #6e99c7;
2020-04-27 10:07:28 -04:00
}
2022-01-25 04:32:29 -05:00
.log-decoder {
color: #56efff;
2022-01-25 04:32:29 -05:00
}
.log-encoder {
color: #45ccee;
2022-01-25 04:32:29 -05:00
}
.log-server {
color: #23cbdd;
2022-01-25 04:32:29 -05:00
}
2020-04-17 09:02:21 -04:00
</style>