set log level

This commit is contained in:
pompurin404 2024-08-10 14:08:54 +08:00
parent 282c06992c
commit 08c00ae77f
No known key found for this signature in database
4 changed files with 63 additions and 31 deletions

View File

@ -245,12 +245,14 @@ export const stopMihomoLogs = (): void => {
} }
const mihomoLogs = (): void => { const mihomoLogs = (): void => {
let server = getControledMihomoConfig()['external-controller'] const { secret = '', 'log-level': level = 'info' } = getControledMihomoConfig()
const secret = getControledMihomoConfig().secret ?? '' let { 'external-controller': server } = getControledMihomoConfig()
if (server?.startsWith(':')) server = `127.0.0.1${server}` if (server?.startsWith(':')) server = `127.0.0.1${server}`
stopMihomoLogs() stopMihomoLogs()
mihomoLogsWs = new WebSocket(`ws://${server}/logs?token=${encodeURIComponent(secret)}`) mihomoLogsWs = new WebSocket(
`ws://${server}/logs?token=${encodeURIComponent(secret)}&level=${level}`
)
mihomoLogsWs.onmessage = (e): void => { mihomoLogsWs.onmessage = (e): void => {
const data = e.data as string const data = e.data as string

View File

@ -1,28 +1,38 @@
import BasePage from '@renderer/components/base/base-page' import BasePage from '@renderer/components/base/base-page'
import { startMihomoLogs, stopMihomoLogs } from '@renderer/utils/ipc' import { startMihomoLogs, stopMihomoLogs } from '@renderer/utils/ipc'
import LogItem from '@renderer/components/logs/log-item' import LogItem from '@renderer/components/logs/log-item'
import { useEffect, useMemo, useState } from 'react' import { useEffect, useMemo, useRef, useState } from 'react'
import { Input } from '@nextui-org/react' import { Button, Input } from '@nextui-org/react'
import { Virtuoso, VirtuosoHandle } from 'react-virtuoso'
const Logs: React.FC = () => { const Logs: React.FC = () => {
const [logs, setLogs] = useState<IMihomoLogInfo[]>([]) const [logs, setLogs] = useState<IMihomoLogInfo[]>([])
const [filter, setFilter] = useState('') const [filter, setFilter] = useState('')
const [trace, setTrace] = useState(true)
const virtuosoRef = useRef<VirtuosoHandle>(null)
const filteredLogs = useMemo(() => { const filteredLogs = useMemo(() => {
if (filter === '') return logs if (filter === '') return logs
return logs.filter((log) => { return logs.filter((log) => {
return log.payload.includes(filter) return log.payload.includes(filter) || log.type.includes(filter)
}) })
}, [logs, filter]) }, [logs, filter])
useEffect(() => {
if (!trace) return
virtuosoRef.current?.scrollToIndex({
index: filteredLogs.length - 1,
behavior: 'smooth',
align: 'end',
offset: 0
})
}, [filteredLogs, trace])
useEffect(() => { useEffect(() => {
startMihomoLogs() startMihomoLogs()
window.electron.ipcRenderer.on('mihomoLogs', (_e, log: IMihomoLogInfo) => { window.electron.ipcRenderer.on('mihomoLogs', (_e, log: IMihomoLogInfo) => {
log.time = new Date().toISOString() log.time = new Date().toLocaleString()
setLogs((prevLogs) => { setLogs((prevLogs) => {
if (prevLogs.length >= 200) {
prevLogs.shift()
}
return [...prevLogs, log] return [...prevLogs, log]
}) })
}) })
@ -35,7 +45,8 @@ const Logs: React.FC = () => {
return ( return (
<BasePage title="实时日志"> <BasePage title="实时日志">
<div className="sticky top-[48px] z-40 backdrop-blur bg-background/40 flex p-2"> <div className="sticky top-[49px] z-40 backdrop-blur bg-background/40 flex p-2">
<div className="w-full flex">
<Input <Input
variant="bordered" variant="bordered"
size="sm" size="sm"
@ -43,8 +54,26 @@ const Logs: React.FC = () => {
placeholder="筛选过滤" placeholder="筛选过滤"
onValueChange={setFilter} onValueChange={setFilter}
/> />
<Button
size="sm"
className="ml-2"
color={trace ? 'primary' : 'default'}
variant={trace ? 'solid' : 'bordered'}
onPress={() => {
setTrace((prev) => !prev)
}}
>
</Button>
</div> </div>
{filteredLogs.map((log, index) => { </div>
<Virtuoso
autoFocus
ref={virtuosoRef}
style={{ height: 'calc(100vh - 100px)' }}
totalCount={filteredLogs.length}
itemContent={(index) => {
const log = filteredLogs[index]
return ( return (
<LogItem <LogItem
key={log.payload + index} key={log.payload + index}
@ -53,7 +82,8 @@ const Logs: React.FC = () => {
payload={log.payload} payload={log.payload}
/> />
) )
})} }}
/>
</BasePage> </BasePage>
) )
} }

View File

@ -297,9 +297,9 @@ const Mihomo: React.FC = () => {
}} }}
> >
<SelectItem key="silent"></SelectItem> <SelectItem key="silent"></SelectItem>
<SelectItem key="info"></SelectItem>
<SelectItem key="warning"></SelectItem>
<SelectItem key="error"></SelectItem> <SelectItem key="error"></SelectItem>
<SelectItem key="warning"></SelectItem>
<SelectItem key="info"></SelectItem>
<SelectItem key="debug"></SelectItem> <SelectItem key="debug"></SelectItem>
</Select> </Select>
</SettingItem> </SettingItem>

View File

@ -23,7 +23,7 @@ const Rules: React.FC = () => {
return ( return (
<BasePage title="分流规则"> <BasePage title="分流规则">
<div className="sticky top-[48px] z-40 backdrop-blur bg-background/40 flex p-2"> <div className="sticky top-[49px] z-40 backdrop-blur bg-background/40 flex p-2">
<Input <Input
variant="bordered" variant="bordered"
size="sm" size="sm"