mirror of
https://github.com/0xJacky/nginx-ui.git
synced 2025-05-12 02:45:49 +02:00
fix: site log unable fetch previous pages
This commit is contained in:
parent
26938ae1bb
commit
d5fa42da3c
4 changed files with 42 additions and 53 deletions
|
@ -1,6 +1,6 @@
|
||||||
import http from '@/lib/http'
|
import http from '@/lib/http'
|
||||||
|
|
||||||
interface IData {
|
export interface INginxLogData {
|
||||||
type: string
|
type: string
|
||||||
conf_name: string
|
conf_name: string
|
||||||
server_idx: number
|
server_idx: number
|
||||||
|
@ -8,9 +8,8 @@ interface IData {
|
||||||
}
|
}
|
||||||
|
|
||||||
const nginx_log = {
|
const nginx_log = {
|
||||||
page(page = 0, data: IData) {
|
page(page = 0, data: INginxLogData) {
|
||||||
return http.post('/nginx_log?page=' + page, data)
|
return http.post('/nginx_log?page=' + page, data)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export default nginx_log
|
export default nginx_log
|
||||||
|
|
|
@ -1,31 +1,35 @@
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import {useGettext} from 'vue3-gettext'
|
import {useGettext} from 'vue3-gettext'
|
||||||
import ws from '@/lib/websocket'
|
import ws from '@/lib/websocket'
|
||||||
import {computed, nextTick, onMounted, onUnmounted, reactive, ref, watch} from 'vue'
|
import {computed, nextTick, onMounted, onUnmounted, reactive, Ref, ref, UnwrapNestedRefs, watch} from 'vue'
|
||||||
import ReconnectingWebSocket from 'reconnecting-websocket'
|
import ReconnectingWebSocket from 'reconnecting-websocket'
|
||||||
import {useRoute, useRouter} from 'vue-router'
|
import {useRoute, useRouter} from 'vue-router'
|
||||||
import FooterToolBar from '@/components/FooterToolbar/FooterToolBar.vue'
|
import FooterToolBar from '@/components/FooterToolbar/FooterToolBar.vue'
|
||||||
import nginx_log from '@/api/nginx_log'
|
import nginx_log, {INginxLogData} from '@/api/nginx_log'
|
||||||
import {debounce} from 'lodash'
|
import {debounce} from 'lodash'
|
||||||
|
|
||||||
const {$gettext} = useGettext()
|
const {$gettext} = useGettext()
|
||||||
|
const logContainer: Ref<Element> = ref()!
|
||||||
const logContainer = ref(null)
|
|
||||||
|
|
||||||
let websocket: ReconnectingWebSocket | WebSocket
|
let websocket: ReconnectingWebSocket | WebSocket
|
||||||
const route = useRoute()
|
const route = useRoute()
|
||||||
|
const buffer = ref('')
|
||||||
|
const page = ref(0)
|
||||||
|
const auto_refresh = ref(true)
|
||||||
|
const router = useRouter()
|
||||||
|
const loading = ref(false)
|
||||||
|
const filter = ref('')
|
||||||
|
|
||||||
|
const control: UnwrapNestedRefs<INginxLogData> = reactive({
|
||||||
|
type: logType(),
|
||||||
|
conf_name: route.query.conf_name as string,
|
||||||
|
server_idx: parseInt(route.query.server_idx as string),
|
||||||
|
directive_idx: parseInt(route.query.directive_idx as string)
|
||||||
|
})
|
||||||
|
|
||||||
function logType() {
|
function logType() {
|
||||||
return route.path.indexOf('access') > 0 ? 'access' : route.path.indexOf('error') > 0 ? 'error' : 'site'
|
return route.path.indexOf('access') > 0 ? 'access' : route.path.indexOf('error') > 0 ? 'error' : 'site'
|
||||||
}
|
}
|
||||||
|
|
||||||
const control = reactive({
|
|
||||||
type: logType(),
|
|
||||||
conf_name: route.query.conf_name,
|
|
||||||
server_idx: parseInt(route.query.server_idx as string),
|
|
||||||
directive_idx: parseInt(route.query.directive_idx as string)
|
|
||||||
})
|
|
||||||
|
|
||||||
function openWs() {
|
function openWs() {
|
||||||
websocket = ws('/api/nginx_log')
|
websocket = ws('/api/nginx_log')
|
||||||
|
|
||||||
|
@ -41,18 +45,13 @@ function openWs() {
|
||||||
}
|
}
|
||||||
|
|
||||||
function addLog(data: string, prepend: boolean = false) {
|
function addLog(data: string, prepend: boolean = false) {
|
||||||
// const para = document.createElement('p')
|
|
||||||
// para.appendChild(document.createTextNode(data.trim()))
|
|
||||||
//
|
|
||||||
// const node = (logContainer.value as any as Node)
|
|
||||||
|
|
||||||
if (prepend) {
|
if (prepend) {
|
||||||
buffer.value = data + buffer.value
|
buffer.value = data + buffer.value
|
||||||
} else {
|
} else {
|
||||||
buffer.value += data
|
buffer.value += data
|
||||||
}
|
}
|
||||||
nextTick(() => {
|
nextTick(() => {
|
||||||
const elem = (logContainer.value as any as Element)
|
const elem = (logContainer.value as Element)
|
||||||
elem?.scroll({
|
elem?.scroll({
|
||||||
top: elem.scrollHeight,
|
top: elem.scrollHeight,
|
||||||
left: 0
|
left: 0
|
||||||
|
@ -60,33 +59,30 @@ function addLog(data: string, prepend: boolean = false) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
const buffer = ref('')
|
|
||||||
|
|
||||||
const page = ref(0)
|
|
||||||
|
|
||||||
function init() {
|
function init() {
|
||||||
nginx_log.page(0, {
|
nginx_log.page(0, control).then(r => {
|
||||||
conf_name: (route.query.conf_name as string),
|
|
||||||
type: logType(),
|
|
||||||
server_idx: parseInt(route.query.server_idx as string),
|
|
||||||
directive_idx: parseInt(route.query.directive_idx as string)
|
|
||||||
}).then(r => {
|
|
||||||
page.value = r.page - 1
|
page.value = r.page - 1
|
||||||
addLog(r.content)
|
addLog(r.content)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function clearLog() {
|
||||||
|
logContainer.value.innerHTML = ''
|
||||||
|
}
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
init()
|
init()
|
||||||
openWs()
|
openWs()
|
||||||
})
|
})
|
||||||
|
|
||||||
const auto_refresh = ref(true)
|
onUnmounted(() => {
|
||||||
|
websocket.close()
|
||||||
|
})
|
||||||
|
|
||||||
watch(auto_refresh, (value) => {
|
watch(auto_refresh, (value) => {
|
||||||
if (value) {
|
if (value) {
|
||||||
openWs();
|
openWs()
|
||||||
(logContainer.value as any as Element).innerHTML = ''
|
clearLog()
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
websocket.close()
|
websocket.close()
|
||||||
|
@ -96,8 +92,10 @@ watch(auto_refresh, (value) => {
|
||||||
watch(route, () => {
|
watch(route, () => {
|
||||||
init()
|
init()
|
||||||
|
|
||||||
control.type = logType();
|
control.type = logType()
|
||||||
(logContainer.value as any as Element).innerHTML = ''
|
control.directive_idx = parseInt(route.query.server_idx as string)
|
||||||
|
control.server_idx = parseInt(route.query.directive_idx as string)
|
||||||
|
clearLog()
|
||||||
|
|
||||||
nextTick(() => {
|
nextTick(() => {
|
||||||
websocket.send(JSON.stringify(control))
|
websocket.send(JSON.stringify(control))
|
||||||
|
@ -105,7 +103,7 @@ watch(route, () => {
|
||||||
})
|
})
|
||||||
|
|
||||||
watch(control, () => {
|
watch(control, () => {
|
||||||
(logContainer.value as any as Element).innerHTML = ''
|
clearLog()
|
||||||
auto_refresh.value = true
|
auto_refresh.value = true
|
||||||
|
|
||||||
nextTick(() => {
|
nextTick(() => {
|
||||||
|
@ -113,24 +111,13 @@ watch(control, () => {
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
onUnmounted(() => {
|
|
||||||
websocket.close()
|
|
||||||
})
|
|
||||||
|
|
||||||
const router = useRouter()
|
|
||||||
const loading = ref(false)
|
|
||||||
|
|
||||||
function on_scroll_log() {
|
function on_scroll_log() {
|
||||||
if (!loading.value && page.value > 0) {
|
if (!loading.value && page.value > 0) {
|
||||||
loading.value = true
|
loading.value = true
|
||||||
const elem = (logContainer.value as any as Element)
|
const elem = logContainer.value
|
||||||
if (elem?.scrollTop / elem?.scrollHeight < 0.333) {
|
if (elem?.scrollTop / elem?.scrollHeight < 0.333) {
|
||||||
nginx_log.page(page.value, {
|
nginx_log.page(page.value, control).then(r => {
|
||||||
conf_name: (route.query.conf_name as string),
|
|
||||||
type: logType(),
|
|
||||||
server_idx: 0,
|
|
||||||
directive_idx: 0
|
|
||||||
}).then(r => {
|
|
||||||
page.value = r.page - 1
|
page.value = r.page - 1
|
||||||
addLog(r.content, true)
|
addLog(r.content, true)
|
||||||
}).finally(() => {
|
}).finally(() => {
|
||||||
|
@ -142,7 +129,9 @@ function on_scroll_log() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const filter = ref('')
|
function debounce_scroll_log() {
|
||||||
|
return debounce(on_scroll_log, 100)()
|
||||||
|
}
|
||||||
|
|
||||||
const computedBuffer = computed(() => {
|
const computedBuffer = computed(() => {
|
||||||
if (filter.value) {
|
if (filter.value) {
|
||||||
|
@ -165,7 +154,7 @@ const computedBuffer = computed(() => {
|
||||||
|
|
||||||
<a-card>
|
<a-card>
|
||||||
<pre class="nginx-log-container" ref="logContainer"
|
<pre class="nginx-log-container" ref="logContainer"
|
||||||
@scroll="debounce(on_scroll_log,100, null)()" v-html="computedBuffer"/>
|
@scroll="debounce_scroll_log" v-html="computedBuffer"/>
|
||||||
</a-card>
|
</a-card>
|
||||||
<footer-tool-bar v-if="control.type==='site'">
|
<footer-tool-bar v-if="control.type==='site'">
|
||||||
<a-button @click="router.go(-1)">
|
<a-button @click="router.go(-1)">
|
||||||
|
|
|
@ -19,6 +19,7 @@ server {
|
||||||
ssl_certificate_key /etc/nginx/ssl/amstourship.jackyu.cn_t.jackyu.cn/private.key;
|
ssl_certificate_key /etc/nginx/ssl/amstourship.jackyu.cn_t.jackyu.cn/private.key;
|
||||||
root /var/www/amstourship;
|
root /var/www/amstourship;
|
||||||
index index.html;
|
index index.html;
|
||||||
|
access_log /var/www/logs/amstourship.jackyu.cn.log;
|
||||||
location /.well-known/acme-challenge {
|
location /.well-known/acme-challenge {
|
||||||
proxy_set_header Host $host;
|
proxy_set_header Host $host;
|
||||||
proxy_set_header X-Real_IP $remote_addr;
|
proxy_set_header X-Real_IP $remote_addr;
|
||||||
|
|
|
@ -207,7 +207,7 @@ func tailNginxLog(ws *websocket.Conn, controlChan chan controlStruct, errChan ch
|
||||||
|
|
||||||
err = ws.WriteMessage(websocket.TextMessage, []byte(line.Text))
|
err = ws.WriteMessage(websocket.TextMessage, []byte(line.Text))
|
||||||
|
|
||||||
if err != nil {
|
if err != nil && websocket.IsUnexpectedCloseError(err, websocket.CloseNormalClosure) {
|
||||||
errChan <- errors.Wrap(err, "error NginxAccessLog write message")
|
errChan <- errors.Wrap(err, "error NginxAccessLog write message")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue