refactor: Simplify log data management and improve search functionality

This commit is contained in:
wonfen 2025-02-19 13:06:15 +08:00
parent f948da748e
commit 48d68f5766
3 changed files with 31 additions and 33 deletions

View File

@ -85,9 +85,9 @@ const LogItem = ({ value, searchState }: Props) => {
return ( return (
<Item> <Item>
<div> <div>
<span className="time">{value.time}</span> <span className="time">{renderHighlightText(value.time || "")}</span>
<span className="type" data-type={value.type.toLowerCase()}> <span className="type" data-type={value.type.toLowerCase()}>
{value.type} {renderHighlightText(value.type)}
</span> </span>
</div> </div>
<div> <div>

View File

@ -34,34 +34,25 @@ const buildWSUrl = (server: string, secret: string, logLevel: LogLevel) => {
}; };
interface LogStore { interface LogStore {
logs: Record<LogLevel, ILogItem[]>; logs: ILogItem[];
clearLogs: (level?: LogLevel) => void; clearLogs: () => void;
appendLog: (level: LogLevel, log: ILogItem) => void; appendLog: (log: ILogItem) => void;
} }
const useLogStore = create<LogStore>( const useLogStore = create<LogStore>(
(set: (fn: (state: LogStore) => Partial<LogStore>) => void) => ({ (set: (fn: (state: LogStore) => Partial<LogStore>) => void) => ({
logs: { logs: [],
warning: [], clearLogs: () =>
info: [], set(() => ({
debug: [], logs: [],
error: [],
all: [],
},
clearLogs: (level?: LogLevel) =>
set((state: LogStore) => ({
logs: level
? { ...state.logs, [level]: [] }
: { warning: [], info: [], debug: [], error: [], all: [] },
})), })),
appendLog: (level: LogLevel, log: ILogItem) => appendLog: (log: ILogItem) =>
set((state: LogStore) => { set((state: LogStore) => {
const currentLogs = state.logs[level];
const newLogs = const newLogs =
currentLogs.length >= MAX_LOG_NUM state.logs.length >= MAX_LOG_NUM
? [...currentLogs.slice(1), log] ? [...state.logs.slice(1), log]
: [...currentLogs, log]; : [...state.logs, log];
return { logs: { ...state.logs, [level]: newLogs } }; return { logs: newLogs };
}), }),
}), }),
); );
@ -84,7 +75,7 @@ export const useLogData = (logLevel: LogLevel) => {
if (!isActive) return; if (!isActive) return;
const data = JSON.parse(event.data) as ILogItem; const data = JSON.parse(event.data) as ILogItem;
const time = dayjs().format("MM-DD HH:mm:ss"); const time = dayjs().format("MM-DD HH:mm:ss");
appendLog(logLevel, { ...data, time }); appendLog({ ...data, time });
}, },
onerror() { onerror() {
if (!isActive) return; if (!isActive) return;
@ -98,10 +89,13 @@ export const useLogData = (logLevel: LogLevel) => {
}; };
}, [clashInfo, enableLog, logLevel]); }, [clashInfo, enableLog, logLevel]);
return logs[logLevel]; // 根据当前选择的日志等级过滤日志
return logLevel === "all"
? logs
: logs.filter((log) => log.type.toLowerCase() === logLevel);
}; };
// 导出清空日志的方法 // 导出清空日志的方法
export const clearLogs = (level?: LogLevel) => { export const clearLogs = () => {
useLogStore.getState().clearLogs(level); useLogStore.getState().clearLogs();
}; };

View File

@ -32,11 +32,15 @@ const LogPage = () => {
const filterLogs = useMemo(() => { const filterLogs = useMemo(() => {
return logData return logData
? logData.filter((data) => ? logData.filter((data) => {
logLevel === "all" // 构建完整的搜索文本,包含时间、类型和内容
? match(data.payload) const searchText =
: data.type.includes(logLevel) && match(data.payload), `${data.time || ""} ${data.type} ${data.payload}`.toLowerCase();
)
return logLevel === "all"
? match(searchText)
: data.type.toLowerCase() === logLevel && match(searchText);
})
: []; : [];
}, [logData, logLevel, match]); }, [logData, logLevel, match]);
@ -70,7 +74,7 @@ const LogPage = () => {
size="small" size="small"
variant="contained" variant="contained"
onClick={() => { onClick={() => {
clearLogs(logLevel); clearLogs();
}} }}
> >
{t("Clear")} {t("Clear")}