log4j2 常用配置介绍

log4j2 常用配置介绍

Maven 依赖

        <!-- Log Start  -->
        <!-- 方便本地调试可以使用log4j做日志适配,日志输出统一使用Slf4j门面进行输出,需要将log4j配置文件放到class path -->
        <!--用于与slf4j保持桥接-->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j-impl</artifactId>
            <version>2.12.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>2.12.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.12.1</version>
        </dependency>
        <!-- Log End  -->

Ps:

阿里巴巴在《Java开发手册泰山版》中,对日志规约有一条[强制]要求:
在这里插入图片描述
开发手册下载地址:https://developer.aliyun.com/topic/java2020

使用SLF4J,面向接口编程,可使程序与日志解耦,如 当未来需要更换日志框架时,可直接更换,而不需要对日志记录相关的代码(logger.info(…))做更改。

log4j2 配置介绍

<?xml version="1.0" encoding="UTF-8"?>
<!--
    Configuration 后面的 status,用于设置 log4j2 自身内部的信息输出,可以不设置,当设置成 trace 级别时,可看到 log4j2 内部的各种详细输出;
    monitorInterval:设置间隔秒数,定期自动检测配置文件是否有修改,有修改则重新加载配置文件。
-->
<Configuration name="baseConf" status="info" monitorInterval="300">
    <!-- 在 <properties> 中定义了两个常量方便后面复用 -->
    <Properties>
        <property name="LOG_HOME">E:/Logs</property>
        <property name="FILE_NAME">logTest</property>
    </Properties>
    <!-- 先定义所有的 appender -->
    <Appenders>
        <!-- 输出到控制台的配置 -->
        <Console name="Console" target="SYSTEM_OUT">
            <!-- 控制台只输出 level 及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
            <ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/>
            <!-- 输出日志的格式 -->
			<!--
				Log4j提供的转换模式
					%m 输出代码中指定的消息
					%p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL
					%r 输出自应用启动到输出该log信息耗费的毫秒数
					%c 输出所属的类目,通常就是所在类的全名
					%t 输出产生该日志事件的线程名
					%n 输出一个回车换行符,Windows平台为“\r\n”,Unix平台为“\n”;如果需要在输出日志路径中使用,可使用 ${sys:file.separator} 由系统自动判断
					%d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式
						如:%d{dd MMM yyyy HH:mm:ss,SSS},输出类似:02 Nov 2012 14:34:02,781
					%l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数
						如:Testlog.main(TestLog.java:10)
					%F 输出日志消息产生时所在的文件名称
					%L 输出代码中的行号
					%x 输出和当前线程相关联的NDC(嵌套诊断环境),像java servlets多客户多线程的应用中
					%% 输出一个"%"字符
				更多转换模式详见官方文档:https://logging.apache.org/log4j/2.x/manual/layouts.html#PatternLayout
			-->
            <PatternLayout pattern="%d{ISO8601} [%t] %-5level %class{36} %L %M - %msg%xEx%n"/>
        </Console>
        <!-- 输出到日志文件的配置 -->
        <!-- 文件会打印出所有信息,由append属性决定每次运行程序时日志文件是追加写还是清空,true 表示追加写 -->
		<!--
			Appender 类型
				FileAppender(File)、RandomAccessFileAppender(RandomAccessFile)
					相同点:写入日志信息到文件
					不同点:使用的 I/O 实现类不同,前者使用 FileOutputStream,后者使用 RandomAccessFile。
				官方文档说是在 bufferedIO=true (默认是 true )的情况下,性能提升 20% ~ 200%。

				常用属性:
					fileName:来指定文件位置,文件或目录不存在则会自动创建。
					immediateFlush:是否每次写入都要立刻刷新到硬盘中。默认 true,如果使用默认值可能会影响性能。
		-->
        <RandomAccessFile name="MyFile" fileName="${LOG_HOME}${sys:file.separator}${FILE_NAME}.log" append="true">
            <PatternLayout pattern="%d{ISO8601} [%t] %-5level %class{36} %L %M - %msg%xEx%n"/>
        </RandomAccessFile>
        <!-- 按时间和大小对日志文件进行滚动作为存档,如果 filePattern 最后是 .log.gz 或 .log.zip 结尾,则会自动对滚动的日志进行压缩 -->
		<!--
			Appender 类型
				RollingFileAppender(RollingFile)、RollingRandomAccessFileAppender(RollingRandomAccessFile)#
					相同点:写入日志信息到文件
					不同点:使用的 I/O 实现类不同,前者使用 FileOutputStream,后者使用 RandomAccessFile。
			上一对的实现类不能进行[日志滚动],而带有 rolling 字样的 appender 就可以实现[滚动]功能,如满足滚动条件,则执行日志存档操作。
		-->
        <RollingRandomAccessFile name="RollingFile"
                                 fileName="${LOG_HOME}${sys:file.separator}${FILE_NAME}-RollingTest.log"
                                 filePattern="${LOG_HOME}${sys:file.separator}${FILE_NAME}-RollingTest-%d{yyyy-MM-dd}-%i.log">
            <PatternLayout pattern="%d{ISO8601} [%t] %-5level %class{36} %L %M - %msg%xEx%n"/>
			<!-- Policies 需要和 filePattern 结合使用 --> 
            <Policies>
                <!--
					注意 filePattern 中配置的文件重命名规则是 ${FILE_NAME}-RollingTest-%d{yyyy-MM-dd}-%i,最小的时间粒度是 dd,即天;
						TimeBasedTriggeringPolicy 指定的 interval 是 1,结合起来就是每1天生成一个新文件;
					如果将 %d{yyyy-MM-dd} 改成 %d{yyyy-MM-dd HH},则最小时间粒度为小时,即每隔1小时生成一个新文件;
					如果将 %d{yyyy-MM-dd} 改成 %d{yyyy-MM-dd HH-mm-ss},则最小时间粒度为秒,即每隔1秒生成一个新文件...
					
					modulate:为 true 表示在天数边界上对齐滚动(而不是每隔24h滚动一次)
				-->
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
				<!--
					按时间滚动日志,也可以使用 CronTriggeringPolicy 替代 TimeBasedTriggeringPolicy ,schedule 填写格式同 Linux 的 Crontab 格式;
					<CronTriggeringPolicy schedule="0/5 * * * * ?"/>
						表示 每隔5秒 生成一个新文件
				-->
                <!-- 指定当文件体积大于 size 指定的值时,触发Rolling -->
                <SizeBasedTriggeringPolicy size="512MB"/>
            </Policies>
            <!-- 
				DefaultRolloverStrategy 属性如不设置,则默认为最多同一文件夹下 7 个文件,即 filePattern 中 -%i 的 i 表示的数字;
				(阿里巴巴《Java开发手册》对日志规约中日志保存天数强制要求不得少于15天)
			-->
            <DefaultRolloverStrategy max="20"/>
        </RollingRandomAccessFile>
    </Appenders>
    <!-- 定义 logger ,只有定义了 logger 并引入的 appender ,appender 才会生效 -->
    <Loggers>
        <!-- 建立一个默认的 root 的 logger -->
        <Root level="trace">
			<!--
				注意:
					不同标签名中,指向的日志文件,不能是同一个文件,否则会报错;
					本地测试时,可以将日志打印到控制台或单个日志文件中,生产上只保留滚动日志文件的引用即可。
			-->
			<!-- 使用标签名为 Console 的 appender 配置定义 -->
            <Appender-ref ref="Console"/>
			<!-- 使用标签名为 MyFile 的 appender 配置定义 -->
            <Appender-ref ref="MyFile"/>
			<!-- 使用标签名为 RollingFile 的 appender 配置定义 -->
            <Appender-ref ref="RollingFile"/>
        </Root>
    </Loggers>
</Configuration>

系统介绍

可参考如下文章:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值