查看“Log4j 2 配置文件”的源代码
←
Log4j 2 配置文件
跳到导航
跳到搜索
因为以下原因,您没有权限编辑本页:
您所请求的操作仅限于该用户组的用户使用:
用户
您可以查看和复制此页面的源代码。
https://www.bilibili.com/video/BV1iJ411H74S?p=33 Log4j 2 默认加载 classpath 下的 log4j2.xml 文件中的配置<syntaxhighlight lang="xml"> <?xml version="1.0" encoding="UTF-8"?> <Configuration status="warn" monitorInterval="5"> <properties> <property name="LOG_NAME">E:/logs</property> </properties> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] [%-5level] %c{36}:%L --- %m%n" /> </Console> <File name="file" fileName="${LOG_HOME}/myfile.log"> <PatternLayout pattern="[%d{HH:mm:ss.SSS}] [%-5level] %l %c{36} - %m%n" /> </File> <RandomAccessFile name="accessFile" fileName="${LOG_HOME}/myAcclog.log"> <PatternLayout pattern="[%d{HH:mm:ss.SSS}] [%-5level] %l %c{36} - %m%n" /> </RandomAccessFile> <RollingFile name="rollingFile" fileName="${LOG_HOME}/myrolling.log" filePattern="E:/logs/$${date:yyyy-MM-dd}/myrolllog-%d{yyyy-MM-dd-HH-mm}-%i.log"> <ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY" /> <PatternLayout pattern="[%d{HH:mm:ss.SSS}] [%-5level] %l %c{36} - %m%n" /> <Policies> <OnStartupTriggeringPolicy /> <SizeBasedTriggeringPolicy size="10MB" /> <TimeBasedTriggeringPolicy /> </Policies> <DefaultRolloverStrategy max="30"/> </RollingFile> </Appenders> <Loggers> <Root level="trace"> <AppenderRef ref="Console" /> </Root> </Loggers> </Configuration> </syntaxhighlight> === Configuration 中的 status 指定日志框架本身的日志输出级别 === 修改 Configuration 中 status 的值<syntaxhighlight lang="xml"> <?xml version="1.0" encoding="UTF-8"?> <Configuration status="debug" monitorInterval="5"> …… </Configuration> </syntaxhighlight>其他不变,运行 Log4j2Test.testQuick 控制台观察日志记录:<syntaxhighlight lang="console"> 2023-02-28 11:38:55,053 main DEBUG Apache Log4j Core 2.11.1 initializing configuration XmlConfiguration[location=E:\record\2023\2\27\log4j2-demo\target\classes\log4j2.xml] 2023-02-28 11:38:55,056 main DEBUG Installed 1 script engine 2023-02-28 11:38:55,315 main DEBUG Oracle Nashorn version: 1.8.0_101, language: ECMAScript, threading: Not Thread Safe, compile: true, names: [nashorn, Nashorn, js, JS, JavaScript, javascript, ECMAScript, ecmascript], factory class: jdk.nashorn.api.scripting.NashornScriptEngineFactory 2023-02-28 11:38:55,316 main DEBUG PluginManager 'Core' found 117 plugins 2023-02-28 11:38:55,316 main DEBUG PluginManager 'Level' found 0 plugins 2023-02-28 11:38:55,319 main DEBUG Building Plugin[name=property, class=org.apache.logging.log4j.core.config.Property]. 2023-02-28 11:38:55,325 main DEBUG PluginManager 'TypeConverter' found 26 plugins 2023-02-28 11:38:55,331 main DEBUG createProperty(name="LOG_NAME", value="E:/logs") 2023-02-28 11:38:55,331 main DEBUG Building Plugin[name=properties, class=org.apache.logging.log4j.core.config.PropertiesPlugin]. 2023-02-28 11:38:55,335 main DEBUG configureSubstitutor(={LOG_NAME=E:/logs}, Configuration(E:\record\2023\2\27\log4j2-demo\target\classes\log4j2.xml)) 2023-02-28 11:38:55,335 main DEBUG PluginManager 'Lookup' found 13 plugins 2023-02-28 11:38:55,336 main DEBUG Building Plugin[name=layout, class=org.apache.logging.log4j.core.layout.PatternLayout]. 2023-02-28 11:38:55,340 main DEBUG PatternLayout$Builder(pattern="%d{HH:mm:ss.SSS} [%t] [%-5level] %c{36}:%L --- %m%n", PatternSelector=null, Configuration(E:\record\2023\2\27\log4j2-demo\target\classes\log4j2.xml), Replace=null, charset="null", alwaysWriteExceptions="null", disableAnsi="null", noConsoleNoAnsi="null", header="null", footer="null") 2023-02-28 11:38:55,341 main DEBUG PluginManager 'Converter' found 44 plugins 2023-02-28 11:38:55,341 main DEBUG Building Plugin[name=appender, class=org.apache.logging.log4j.core.appender.ConsoleAppender]. 2023-02-28 11:38:55,346 main DEBUG ConsoleAppender$Builder(target="SYSTEM_OUT", follow="null", direct="null", bufferedIo="null", bufferSize="null", immediateFlush="null", ignoreExceptions="null", PatternLayout(%d{HH:mm:ss.SSS} [%t] [%-5level] %c{36}:%L --- %m%n), name="Console", Configuration(E:\record\2023\2\27\log4j2-demo\target\classes\log4j2.xml), Filter=null) 2023-02-28 11:38:55,347 main DEBUG Starting OutputStreamManager SYSTEM_OUT.false.false 2023-02-28 11:38:55,348 main DEBUG Building Plugin[name=layout, class=org.apache.logging.log4j.core.layout.PatternLayout]. 2023-02-28 11:38:55,348 main DEBUG PatternLayout$Builder(pattern="[%d{HH:mm:ss.SSS}] [%-5level] %l %c{36} - %m%n", PatternSelector=null, Configuration(E:\record\2023\2\27\log4j2-demo\target\classes\log4j2.xml), Replace=null, charset="null", alwaysWriteExceptions="null", disableAnsi="null", noConsoleNoAnsi="null", header="null", footer="null") 2023-02-28 11:38:55,349 main DEBUG Building Plugin[name=appender, class=org.apache.logging.log4j.core.appender.FileAppender]. 2023-02-28 11:38:55,351 main DEBUG FileAppender$Builder(fileName="${LOG_HOME}/myfile.log", append="null", locking="null", advertise="null", advertiseUri="null", createOnDemand="null", filePermissions="null", fileOwner="null", fileGroup="null", bufferedIo="null", bufferSize="null", immediateFlush="null", ignoreExceptions="null", PatternLayout([%d{HH:mm:ss.SSS}] [%-5level] %l %c{36} - %m%n), name="file", Configuration(E:\record\2023\2\27\log4j2-demo\target\classes\log4j2.xml), Filter=null) 2023-02-28 11:38:55,353 main DEBUG Starting FileManager ${LOG_HOME}/myfile.log 2023-02-28 11:38:55,354 main DEBUG Building Plugin[name=layout, class=org.apache.logging.log4j.core.layout.PatternLayout]. 2023-02-28 11:38:55,355 main DEBUG PatternLayout$Builder(pattern="[%d{HH:mm:ss.SSS}] [%-5level] %l %c{36} - %m%n", PatternSelector=null, Configuration(E:\record\2023\2\27\log4j2-demo\target\classes\log4j2.xml), Replace=null, charset="null", alwaysWriteExceptions="null", disableAnsi="null", noConsoleNoAnsi="null", header="null", footer="null") 2023-02-28 11:38:55,355 main DEBUG Building Plugin[name=appender, class=org.apache.logging.log4j.core.appender.RandomAccessFileAppender]. 2023-02-28 11:38:55,356 main DEBUG RandomAccessFileAppender$Builder(fileName="${LOG_HOME}/myAcclog.log", append="null", advertise="null", advertiseURI="null", bufferedIo="null", bufferSize="null", immediateFlush="null", ignoreExceptions="null", PatternLayout([%d{HH:mm:ss.SSS}] [%-5level] %l %c{36} - %m%n), name="accessFile", Configuration(E:\record\2023\2\27\log4j2-demo\target\classes\log4j2.xml), Filter=null) 2023-02-28 11:38:55,358 main DEBUG Starting RandomAccessFileManager ${LOG_HOME}/myAcclog.log 2023-02-28 11:38:55,359 main DEBUG Building Plugin[name=filter, class=org.apache.logging.log4j.core.filter.ThresholdFilter]. 2023-02-28 11:38:55,360 main DEBUG createFilter(level="DEBUG", onMatch="ACCEPT", onMismatch="DENY") 2023-02-28 11:38:55,361 main DEBUG Building Plugin[name=layout, class=org.apache.logging.log4j.core.layout.PatternLayout]. 2023-02-28 11:38:55,361 main DEBUG PatternLayout$Builder(pattern="[%d{HH:mm:ss.SSS}] [%-5level] %l %c{36} - %m%n", PatternSelector=null, Configuration(E:\record\2023\2\27\log4j2-demo\target\classes\log4j2.xml), Replace=null, charset="null", alwaysWriteExceptions="null", disableAnsi="null", noConsoleNoAnsi="null", header="null", footer="null") 2023-02-28 11:38:55,362 main DEBUG Building Plugin[name=OnStartupTriggeringPolicy, class=org.apache.logging.log4j.core.appender.rolling.OnStartupTriggeringPolicy]. 2023-02-28 11:38:55,363 main DEBUG createPolicy(minSize="1") 2023-02-28 11:38:55,366 main DEBUG Building Plugin[name=SizeBasedTriggeringPolicy, class=org.apache.logging.log4j.core.appender.rolling.SizeBasedTriggeringPolicy]. 2023-02-28 11:38:55,366 main DEBUG createPolicy(size="10MB") 2023-02-28 11:38:55,367 main DEBUG Building Plugin[name=TimeBasedTriggeringPolicy, class=org.apache.logging.log4j.core.appender.rolling.TimeBasedTriggeringPolicy]. 2023-02-28 11:38:55,368 main DEBUG TimeBasedTriggeringPolicy$Builder(interval="null", modulate="null", maxRandomDelay="null") 2023-02-28 11:38:55,368 main DEBUG Building Plugin[name=Policies, class=org.apache.logging.log4j.core.appender.rolling.CompositeTriggeringPolicy]. 2023-02-28 11:38:55,368 main DEBUG createPolicy(={OnStartupTriggeringPolicy, SizeBasedTriggeringPolicy(size=10485760), TimeBasedTriggeringPolicy(nextRolloverMillis=0, interval=1, modulate=false)}) 2023-02-28 11:38:55,368 main DEBUG Building Plugin[name=DefaultRolloverStrategy, class=org.apache.logging.log4j.core.appender.rolling.DefaultRolloverStrategy]. 2023-02-28 11:38:55,370 main DEBUG DefaultRolloverStrategy$Builder(max="30", min="null", fileIndex="null", compressionLevel="null", ={}, stopCustomActionsOnError="null", tempCompressedFilePattern="null", Configuration(E:\record\2023\2\27\log4j2-demo\target\classes\log4j2.xml)) 2023-02-28 11:38:55,370 main DEBUG Building Plugin[name=appender, class=org.apache.logging.log4j.core.appender.RollingFileAppender]. 2023-02-28 11:38:55,372 main DEBUG RollingFileAppender$Builder(fileName="${LOG_HOME}/myrolling.log", filePattern="E:/logs/${date:yyyy-MM-dd}/myrolllog-%d{yyyy-MM-dd-HH-mm}-%i.log", append="null", locking="null", Policies(CompositeTriggeringPolicy(policies=[OnStartupTriggeringPolicy, SizeBasedTriggeringPolicy(size=10485760), TimeBasedTriggeringPolicy(nextRolloverMillis=0, interval=1, modulate=false)])), DefaultRolloverStrategy(DefaultRolloverStrategy(min=1, max=30, useMax=true)), advertise="null", advertiseUri="null", createOnDemand="null", filePermissions="null", fileOwner="null", fileGroup="null", bufferedIo="null", bufferSize="null", immediateFlush="null", ignoreExceptions="null", PatternLayout([%d{HH:mm:ss.SSS}] [%-5level] %l %c{36} - %m%n), name="rollingFile", Configuration(E:\record\2023\2\27\log4j2-demo\target\classes\log4j2.xml), ThresholdFilter(DEBUG)) 2023-02-28 11:38:55,374 main DEBUG Starting RollingFileManager ${LOG_HOME}/myrolling.log 2023-02-28 11:38:55,375 main DEBUG PluginManager 'FileConverter' found 2 plugins 2023-02-28 11:38:55,382 main DEBUG Setting prev file time to 2023-02-28T11:17:14.937+0800 2023-02-28 11:38:55,383 main DEBUG Initializing triggering policy CompositeTriggeringPolicy(policies=[OnStartupTriggeringPolicy, SizeBasedTriggeringPolicy(size=10485760), TimeBasedTriggeringPolicy(nextRolloverMillis=0, interval=1, modulate=false)]) 2023-02-28 11:38:55,384 main DEBUG Building Plugin[name=appenders, class=org.apache.logging.log4j.core.config.AppendersPlugin]. 2023-02-28 11:38:55,384 main DEBUG createAppenders(={Console, file, accessFile, rollingFile}) 2023-02-28 11:38:55,384 main DEBUG Building Plugin[name=AppenderRef, class=org.apache.logging.log4j.core.config.AppenderRef]. 2023-02-28 11:38:55,385 main DEBUG createAppenderRef(ref="Console", level="null", Filter=null) 2023-02-28 11:38:55,385 main DEBUG Building Plugin[name=root, class=org.apache.logging.log4j.core.config.LoggerConfig$RootLogger]. 2023-02-28 11:38:55,385 main DEBUG createLogger(additivity="null", level="TRACE", includeLocation="null", ={Console}, ={}, Configuration(E:\record\2023\2\27\log4j2-demo\target\classes\log4j2.xml), Filter=null) 2023-02-28 11:38:55,386 main DEBUG Building Plugin[name=loggers, class=org.apache.logging.log4j.core.config.LoggersPlugin]. 2023-02-28 11:38:55,387 main DEBUG createLoggers(={root}) 2023-02-28 11:38:55,387 main DEBUG Configuration XmlConfiguration[location=E:\record\2023\2\27\log4j2-demo\target\classes\log4j2.xml] initialized 2023-02-28 11:38:55,387 main DEBUG Starting configuration XmlConfiguration[location=E:\record\2023\2\27\log4j2-demo\target\classes\log4j2.xml] 2023-02-28 11:38:55,388 main DEBUG Log4j2 ConfigurationScheduler starting 1 threads 2023-02-28 11:38:55,389 main DEBUG Started configuration XmlConfiguration[location=E:\record\2023\2\27\log4j2-demo\target\classes\log4j2.xml] OK. 2023-02-28 11:38:55,390 main DEBUG Shutting down OutputStreamManager SYSTEM_OUT.false.false-1 2023-02-28 11:38:55,390 main DEBUG Shut down OutputStreamManager SYSTEM_OUT.false.false-1, all resources released: true 2023-02-28 11:38:55,390 main DEBUG Appender DefaultConsole-1 stopped with status true 2023-02-28 11:38:55,390 main DEBUG Stopped org.apache.logging.log4j.core.config.DefaultConfiguration@1ae369b7 OK 2023-02-28 11:38:55,417 main DEBUG Registering MBean org.apache.logging.log4j2:type=18b4aac2 2023-02-28 11:38:55,418 main DEBUG Registering MBean org.apache.logging.log4j2:type=18b4aac2,component=StatusLogger 2023-02-28 11:38:55,419 main DEBUG Registering MBean org.apache.logging.log4j2:type=18b4aac2,component=ContextSelector 2023-02-28 11:38:55,420 main DEBUG Registering MBean org.apache.logging.log4j2:type=18b4aac2,component=Loggers,name= 2023-02-28 11:38:55,420 main DEBUG Registering MBean org.apache.logging.log4j2:type=18b4aac2,component=Appenders,name=Console 2023-02-28 11:38:55,421 main DEBUG Registering MBean org.apache.logging.log4j2:type=18b4aac2,component=Appenders,name=file 2023-02-28 11:38:55,421 main DEBUG Registering MBean org.apache.logging.log4j2:type=18b4aac2,component=Appenders,name=rollingFile 2023-02-28 11:38:55,421 main DEBUG Registering MBean org.apache.logging.log4j2:type=18b4aac2,component=Appenders,name=accessFile 2023-02-28 11:38:55,422 main DEBUG org.apache.logging.log4j.core.util.SystemClock does not support precise timestamps. 2023-02-28 11:38:55,422 main DEBUG Reconfiguration complete for context[name=18b4aac2] at URI E:\record\2023\2\27\log4j2-demo\target\classes\log4j2.xml (org.apache.logging.log4j.core.LoggerContext@4a668b6e) with optional ClassLoader: null 2023-02-28 11:38:55,422 main DEBUG Shutdown hook enabled. Registering a new one. 2023-02-28 11:38:55,423 main DEBUG LoggerContext[name=18b4aac2, org.apache.logging.log4j.core.LoggerContext@4a668b6e] started OK. 11:38:55.426 [main] [FATAL] io.github.jihch.Log4j2Test:17 --- fatal 11:38:55.429 [main] [ERROR] io.github.jihch.Log4j2Test:18 --- error 11:38:55.429 [main] [WARN ] io.github.jihch.Log4j2Test:19 --- warn 11:38:55.429 [main] [INFO ] io.github.jihch.Log4j2Test:20 --- info 11:38:55.429 [main] [DEBUG] io.github.jihch.Log4j2Test:21 --- debug 11:38:55.429 [main] [TRACE] io.github.jihch.Log4j2Test:22 --- trace 2023-02-28 11:38:55,430 pool-1-thread-1 DEBUG Stopping LoggerContext[name=18b4aac2, org.apache.logging.log4j.core.LoggerContext@4a668b6e] 2023-02-28 11:38:55,431 pool-1-thread-1 DEBUG Stopping LoggerContext[name=18b4aac2, org.apache.logging.log4j.core.LoggerContext@4a668b6e]... 2023-02-28 11:38:55,432 pool-1-thread-1 DEBUG Shutting down RandomAccessFileManager ${LOG_HOME}/myAcclog.log 2023-02-28 11:38:55,432 pool-1-thread-1 DEBUG Shut down RandomAccessFileManager ${LOG_HOME}/myAcclog.log, all resources released: true 2023-02-28 11:38:55,432 pool-1-thread-1 DEBUG Appender accessFile stopped with status true 2023-02-28 11:38:55,432 pool-1-thread-1 DEBUG Shutting down RollingFileManager ${LOG_HOME}/myrolling.log 2023-02-28 11:38:55,432 pool-1-thread-1 DEBUG Shutting down RollingFileManager ${LOG_HOME}/myrolling.log 2023-02-28 11:38:55,432 pool-1-thread-1 DEBUG All asynchronous threads have terminated 2023-02-28 11:38:55,433 pool-1-thread-1 DEBUG RollingFileManager shutdown completed with status true 2023-02-28 11:38:55,433 pool-1-thread-1 DEBUG Shut down RollingFileManager ${LOG_HOME}/myrolling.log, all resources released: true 2023-02-28 11:38:55,433 pool-1-thread-1 DEBUG Appender rollingFile stopped with status true 2023-02-28 11:38:55,433 pool-1-thread-1 DEBUG Shutting down FileManager ${LOG_HOME}/myfile.log 2023-02-28 11:38:55,433 pool-1-thread-1 DEBUG Shut down FileManager ${LOG_HOME}/myfile.log, all resources released: true 2023-02-28 11:38:55,433 pool-1-thread-1 DEBUG Appender file stopped with status true 2023-02-28 11:38:55,433 pool-1-thread-1 DEBUG Shutting down OutputStreamManager SYSTEM_OUT.false.false 2023-02-28 11:38:55,433 pool-1-thread-1 DEBUG Shut down OutputStreamManager SYSTEM_OUT.false.false, all resources released: true 2023-02-28 11:38:55,433 pool-1-thread-1 DEBUG Appender Console stopped with status true 2023-02-28 11:38:55,434 pool-1-thread-1 DEBUG Log4j2 ConfigurationScheduler shutting down threads in java.util.concurrent.ScheduledThreadPoolExecutor@259ad000[Running, pool size = 1, active threads = 0, queued tasks = 1, completed tasks = 0] 2023-02-28 11:38:55,434 pool-1-thread-1 DEBUG Stopped XmlConfiguration[location=E:\record\2023\2\27\log4j2-demo\target\classes\log4j2.xml] OK 2023-02-28 11:38:55,434 pool-1-thread-1 DEBUG Stopped LoggerContext[name=18b4aac2, org.apache.logging.log4j.core.LoggerContext@4a668b6e] with status true Process finished with exit code 0 </syntaxhighlight> === Configuration 中的 monitorInterval 自动加载配置文件的间隔时间 === <syntaxhighlight lang="xml"> <?xml version="1.0" encoding="UTF-8"?> <Configuration status="debug" monitorInterval="5"> …… </Configuration> </syntaxhighlight>monitorInterval 指定自动加载配置文件的间隔时间,单位:秒,生产环境中动态调整日志输出级别无需重启应用 === 其它 === <syntaxhighlight lang="xml"> <?xml version="1.0" encoding="UTF-8"?> <!-- status="warn" 日志框架本身的日志输出级别 monitorInterval="5" 自动加载配置文件的间隔时间,不低于 5 秒 --> <Configuration status="debug" monitorInterval="5"> <!-- 集中配置属性进行管理 使用时通过:${name} --> <properties> <property name="LOG_NAME">E:/logs</property> </properties> <!-- 日志处理 --> <Appenders> <!-- 控制台输出 appender target="SYSTEM_OUT" 或 target="SYSTEM_ERR" --> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] [%-5level] %c{36}:%L --- %m%n" /> </Console> <!-- 日志文件输出的 appender --> <File name="file" fileName="${LOG_HOME}/myfile.log"> <PatternLayout pattern="[%d{HH:mm:ss.SSS}] [%-5level] %l %c{36} - %m%n" /> </File> <!-- 使用随机读写流的日志文件输出 appender,性能提高 --> <RandomAccessFile name="accessFile" fileName="${LOG_HOME}/myAcclog.log"> <PatternLayout pattern="[%d{HH:mm:ss.SSS}] [%-5level] %l %c{36} - %m%n" /> </RandomAccessFile> <!-- 按照一定规则拆分日志文件的 appender --> <RollingFile name="rollingFile" fileName="${LOG_HOME}/myrolling.log" filePattern="/logs/$${date:yyyy-MM-dd}/myrolllog-%d{yyyy-MM-dd-HH-mm}-%i.log"> <!-- 日志级别过滤器 --> <ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY" /> <!-- 日志消息格式 --> <PatternLayout pattern="[%d{HH:mm:ss.SSS}] [%-5level] %l %c{36} - %m%n" /> <Policies> <!-- 在系统启动时,触发拆分规则,生成一个新的日志文件 --> <OnStartupTriggeringPolicy /> <!-- 按照文件大小拆分,10MB --> <SizeBasedTriggeringPolicy size="10MB" /> <!-- 按照 filePattern 定义的时间节点规则进行拆分 --> <TimeBasedTriggeringPolicy /> </Policies> <!-- 在同一个目录下,文件的个数限定为 30 个,超过按照时间规则滚动覆盖--> <DefaultRolloverStrategy max="30"/> </RollingFile> </Appenders> <!-- logger 定义 --> <Loggers> <!-- 使用 rootLogger 配置日志级别 level="trace" --> <Root level="trace"> <!-- 指定 logger 使用的 appender --> <AppenderRef ref="Console" /> </Root> </Loggers> </Configuration> </syntaxhighlight>
返回至
Log4j 2 配置文件
。
导航菜单
个人工具
登录
名字空间
页面
讨论
变种
视图
阅读
查看源代码
查看历史
更多
搜索
导航
首页
Spring Boot 2 零基础入门
Spring Cloud
Spring Boot
设计模式之禅
VUE
Vuex
Maven
算法
技能树
Wireshark
IntelliJ IDEA
ElasticSearch
VirtualBox
软考
正则表达式
程序员精讲
软件设计师精讲
初级程序员 历年真题
C
SQL
Java
FFmpeg
Redis
Kafka
MySQL
Spring
Docker
JMeter
Apache
Linux
Windows
Git
ZooKeeper
设计模式
Python
MyBatis
软件
数学
PHP
IntelliJ IDEA
CS基础知识
网络
项目
未分类
MediaWiki
镜像
问题
健身
国债
英语
烹饪
常见术语
MediaWiki帮助
工具
链入页面
相关更改
特殊页面
页面信息