关于配置文件基础内容请参考别的文章,本文就具体一份文件进行讲解,需要的人可以参照着学习
Log4j2.xml文件
这段代码可以直接复制到文件中看 格式是正确的
<?xml version="1.0" encoding="UTF-8"?>
<!--日志等级 All < Trace < Debug < Info < Warn < Error < Fatal < OFF-->
<!--Status配置WARN后 Log4j2本身只打印WARN以上的日志 减去了很多Log4j2本身的Info日志(这个status不是为了限制用户的打印)-->
<Configuration status="WARN">
<Properties>
<!-- Property就是定义一个变量,在整个配置范围内生效-->
<!-- 例如这里的变量gatherPath就代表了路径/log/TestPath-->
<Property name="gatherPath">/log/TestPath</Property>
</Properties>
<Appenders>
<!--节点信息,特殊节点 表示控制台的输出 只能这么写 记住name的值-->
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout
charset="UTF-8"
pattern="%highlight{%d{yyyy-MM-dd HH:mm:ss.SSS} [%t][%X{logId}] %-5level %logger{3} - %msg%n}"/>
</Console>
<!-- 表示这个节点是个异步节点, 在打印日志的时候是异步线程打印的 通过ref字段和上面的Console进行关联-->
<Async name="Async">
<AppenderRef ref="Console"/>
</Async>
<!--filePattern 是文件名的输出格式 决定了一个小时生成一个日志文件-->
<!--这个fileName deviceLog.log指的是每次写日志的时候都是写入到这个文件中的,然后按照CronTriggeringPolicy设置的时间-->
<!--将这个文件内的内容 按照PatternLayout设置的pattern生成一个新的文件 然后清空deviceLog.log等待之后的写入 这就是文件滚动更新-->
<!-- needGatherDeviceLog 是这个节点的名称-->
<RollingRandomAccessFile name="needGatherDeviceLog" fileName="${gatherPath}/deviceLog.log"
filePattern="${gatherPath}/deviceLog.log.%d{yyyyMMddHHmm}">
<!--这里的pattern设置的打印日志的格式-->
<PatternLayout
pattern="%d{MM-dd HH:mm:ss.SSS} [%t][%X{logId}] %-5level %logger{1}-%msg%n"
charset="utf-8"/>
<!--CronTriggeringPolicy 设置的含义就是 这个时间段内打印的日志 会在时间结束后一起写入输入文件-->
<!--下一个时间段的日志会覆盖上一个时间段的日志-->
<!--因此这个schedule时间的设置 应该和你期望的多长时间生成一个日志文件一致 即你希望一小时生成一个日志文件,这里就应该设置一小时-->
<!--不然就会被一个文件名相同的全新日志文件覆盖-->
<CronTriggeringPolicy schedule="0 * * * * ?"/>
<!--文件滚动时的策略 这里就是30天之前 命名符合这个规则的日志 就会被自动删除-->
<!-- 需要注意 这里如果写${gatherDeviceLogPath} 相对日志 jarvis在部署到线上时 删除会失效 必须用绝对路径-->
<DefaultRolloverStrategy>
<Delete basePath="${gatherPath}" maxDepth="1">
<IfFileName glob="deviceLog.log.*"/>
<IfLastModified age="30d"/>
</Delete>
</DefaultRolloverStrategy>
</RollingRandomAccessFile>
<!-- 同样的该节点是异步节点-->
<Async name="gatherDeviceLogAsync">
<AppenderRef ref="needGatherDeviceLog"/>
</Async>
</Appenders>
<Loggers>
<!--没有单独指明采用哪个Logger就会用root节点来输出-->
<!--INFO级别的日志不特殊指明时会用name为Async的节点 存入日志文件中-->
<Root level="INFO">
<AppenderRef ref="Async"/>
</Root>
<!--指定数据库的debug级别的日志会存入日志文件中-->
<Logger name="org.hibernate.SQL" level="debug"></Logger>
<!-- 通过name字段可以使用该节点进行日志输出-->
<Logger name="DEVICE_LOG_LOGGER" additivity="false" level="INFO">
<AppenderRef ref="gatherDeviceLogAsync" />
</Logger>
</Loggers>
</Configuration>
两个节点不同的用法
root节点
默认是root节点 根据配置该节点的日志是输出到控制台
private static final Logger LOGGER = LoggerFactory.getLogger(类名.class);
LOGGER.info("这里会现显示到控制台");
自定义节点
通过指定的字符串初始化
private static final Logger OTHER_LOGGER = LoggerFactory.getLogger("DEVICE_LOG_LOGGER");
OTHER_LOGGER.info("这部分打印出来的内容根据配置就会生成到deviceLog.log文件中")
通过自定义节点的方式可以在项目中用来将某些数据保存到文件中, 本身log4j2的实现会比你自己写入txt要高效很多.同时还有各种文件滚动机制,用起来很方便,基本能满足业务需求