Wiki.js 操作日志怎么配?安全监控 4 步闭环指南
【免费下载链接】wiki-Wiki.js | Next Generation Open Source Wiki项目地址: https://gitcode.com/GitHub_Trending/wiki78/wiki-
凌晨三点,某账号 10 分钟登录失败 40 次,安全组要你 1 分钟说清:哪个 IP、动了哪条记录。靠记忆答不上来——这正是 Wiki.js 操作日志与安全监控该兜底的场景。下面按最短路径走一遍:拉基线、分事件、定响应。
5 分钟把日志基线跑起来
这节解决:默认装完你只有一条控制台日志,debug 级别什么都看不见,先把基线拉起来。
Wiki.js 启动时会构建 winston logger(见 server/core/logger.js):默认只挂一个 Console 输出,级别读配置里的logLevel(默认info),格式读logFormat。也就是说默认状态下 debug、verbose 全被吞掉。
跑起来分三步:
- 照 config.sample.yml 改两行:
logLevel: debug、logFormat: json。json 格式让每条日志是一行独立 JSON,后面接日志聚合工具时省事。 - 重启服务(docker 部署直接
docker restart容器即可)。 - 看终端:启动、配置加载、模块初始化会各打一行带时间戳和级别的内容,看到
[default] info: ...这种输出,说明基线已通。
级别与格式的核心配置就是这一段(精简版):
const logger = winston.createLogger({ level: 'debug', // 默认 info,调低后 debug/verbose 都会打出来 format: winston.format.combine( winston.format.label({ label: 'default' }), winston.format.timestamp(), winston.format.json() ) })顺手开一下后台「Logging」页面:实时控制台走 GraphQL 订阅loggingLiveTrail滚动输出,不用 ssh 进服务器盯终端。排障完记得把logLevel调回info,debug别留在生产环境过夜。
三类事件,各记各的
这节解决:你想查某类事件时,不用猜它落在哪儿——一张表说清记什么、存在哪、去哪看。
| 事件类型 | 记什么 | 落在哪 | 在哪看 |
|---|---|---|---|
| 用户行为 | 登录/登出、页面编辑与删除、标签和分组变更 | console(启用 disk 模块后另有文件) | 终端,或后台日志实时控制台 |
| 系统事件 | 启动、配置加载、模块初始化、定时任务 | console | 终端;级别 info 起就可见 |
| 安全审计 | 登录失败、权限变更、用户创建等敏感操作 | 文件 + 实时 trail(level/output/timestamp 三字段) | 实时:后台控制台;历史:GraphQL 查询 |
三点补充:
- 用户行为和系统事件本质是同一条 winston 流,靠级别和 label 区分,不存在独立存储,按消息文本过滤即可。
- 安全审计多一层:trail 行结构定义在 server/graph/schemas/logging.graphql,实时走订阅推、历史走查询拉。
- 想把日志落到文件而不是随终端消失,就在后台 Logging 设置里启用 server/modules/logging/disk/ 下的 disk 模块(把
isEnabled置为 true)。内置模块实现较薄,更稳的做法是直接采集控制台 JSON 输出给 filebeat/fluentd。
安全事件来了,四步闭环
这节解决:真出事时别慌着乱翻,按这四步走,每步 5 分钟内能收口。
1. 发现——盯两个地方:后台日志控制台的实时滚动(loggingLiveTrail订阅),和终端里grep '"level":"warn"'。短时间内 warn/error 密度突增,就是第一信号。
2. 定位——用 GraphQL 拉审计状态,拿到时间戳、操作人、动作摘要(需系统管理权限):
query { logging { loggers(orderBy: "level") { key isEnabled level config { key value } } } }再对照时间轴:哪个模块在哪个级别打的这行、从几点开始,就是谁、在何时。
3. 处置——按清单顺序做,不跳步:
- 撤销涉事账号权限(先降为只读,止血优先)
- 恢复被改坏的内容(从历史版本回滚)
- 拉取该账号近 24 小时全部操作,确认影响面
- 归档事件记录并通知相关方,原始日志一条不删
4. 复盘——把这次漏掉的条件写回配置:本该告警却没报的事件,把对应模块级别提到warn以上。下周例会过一遍近期告警率,闭环才算真正合上。
自定义日志模块怎么加
这节解决:想把日志推给 ELK/Splunk 时,怎么自己扩。三件套放进modules/logging目录,下次启动自动加载:
definition.yml:声明模块 key、默认级别与配置项,后台按它渲染设置页index.js:写处理逻辑,接 ELK / Splunk / syslog 就从这里插schema.graphql:可选,向管理界面暴露自定义字段
三个高频坑:
- 📦 日志量过大:生产
logLevel回到info,只让 error 落文件 - ⏱️ 查询慢:按时间分区,或导出到外部工具
- 🔍 漏报:安全类事件级别至少
warn,每季度审计一次配置
今天就先改一行logLevel拉到 debug 看一眼。最重要的习惯:出事后 1 分钟内能翻到日志——翻不到,等于没配。
【免费下载链接】wiki-Wiki.js | Next Generation Open Source Wiki项目地址: https://gitcode.com/GitHub_Trending/wiki78/wiki-
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考