| 日志框架简单比较(slf4j、j.u.l、log4j、logback、log4j2 )| 日志级别

Log4j2中日志有六个级别(level):

当日志级别设置为某个值的时候,低于它的日志信息将不会被记录,只有高于设置的级别的信息会被记录。

| Spring Boot集成log4j2

1. pom.xml

Spring Boot默认使用LogBack,但是我们没有看到显示依赖的jar包,其实是因为所在的jar包spring-boot-starter-logging都是作为spring-boot-starter-web或者spring-boot-starter依赖的一部分。

如果这里要使用Log4j2,需要从spring-boot-starter-web中去掉spring-boot-starter-logging依赖,同时显示声明使用Log4j2的依赖jar包,具体如下:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>

<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>


<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>

2. log4j2.xml

如果不想在application.properties中指定log4j2.xml的位置,可以把log4j2.xml重命名为log4j2-spring.xml,这样也是可以按照配置打印日志信息的。

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<Appenders>
<Console name="CONSOLE" target="SYSTEM_OUT">
<PatternLayout charset="UTF-8" pattern="[%-5p] %d %c - %m%n" />
</Console>

<File name="File" fileName="logs/file.log">
<PatternLayout pattern="%m%n" />
</File>
</Appenders>

<Loggers>
<root level="info">
<AppenderRef ref="CONSOLE" />
<AppenderRef ref="File" />
</root>
</Loggers>
</configuration>

3. 打印日志

只使用log4j2的话,获取Logger对象一般是使用LogManager去获取的,但是如果使用slf4j的话,使用LoggerFactory去获取

private final static org.slf4j.Logger logger = LoggerFactory.getLogger(Log4j2Controller.class);

logger.trace("trace level");
logger.debug("debug level");
logger.info("info level");
logger.warn("warn level");
logger.error("error level");

使用lombok插件(详细安装方法请上网查询),可以简化Logger对象的获取,首先在相关的类上面添加@Slf4j注解(该注解由lombok提供),然后通过下面的方式打印日志:

log.trace("trace level");
log.debug("debug level");
log.info("info level");
log.warn("warn level");
log.error("error level");

| log4j2配置文件详解

log4j2_log4j2漏洞原理_log4j2文件名mdc

1. Configuration

Configuration为根节点,有status和monitorInterval等多个属性。

2. properties

properties:配置文件全局的参数变量,用于减少自定义配置信息的重复编码,该配置是可选的,例如定义日志的存放位置D:/logs

3. Appenders

Appenders是输出源,用于定义日志输出的地方,log4j2支持的输出源有很多,有控制台Console、文件File、RollingRandomAccessFile、MongoDB、Flume等。

RollingFile:同上,与RollingRandomAccessFile不同的是,RollingRandomAccessFile默认日志文件写入策略为异步刷盘,RollingRandomAccessFile会将日志信息先写入到缓冲区,然后缓冲区满后刷到磁盘,并清空缓冲区,默认缓冲区的大小在8-256kb,具体大小需要自己设置。

NoSql:MongoDb, 输出到MongDb数据库中

Flume:输出到Apache Flume(Flume是Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统,Flume支持在日志系统中定制各类数据发送方,用于收集数据;同时,Flume提供对数据进行简单处理,并写到各种数据接受方(可定制)的能力。)

Async:异步,需要通过AppenderRef来指定要对哪种输出源进行异步(一般用于配置RollingRandomAccessFile)

PatternLayout:控制台或文件输出源(Console、File、RollingRandomAccessFile)都必须包含一个PatternLayout节点,用于指定输出文件的格式(如日志输出的时间、文件、方法、行数等格式),例如pattern=”%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} – %msg%n”,各标记符详细含义如下:

%d{HH:mm:ss.SSS} 表示输出到毫秒的时间
%t 输出当前线程名称
%-5level 输出日志级别,-5表示左对齐并且固定输出5个字符,如果不足在右边补0
%logger 输出logger名称,因为Root Logger没有名称,所以没有输出
%msg 日志文本
%n 换行

其他常用的占位符有:
%F 输出所在的类文件名,如Log4j2Test.java
%L 输出行号
%M 输出所在方法名
%l 输出语句所在的行数, 包括类名、方法名、文件名、行数

4. Loggers

日志器分根日志器Root和自定义日志器,当根据日志名字获取不到指定的日志器时就使用Root作为默认的日志器,自定义时需要指定每个Logger的名称name(对于命名可以以包名作为日志的名字,不同的包配置不同的级别等),日志级别level,相加性additivity(是否继承下面配置的日志器), 对于一般的日志器(如Console、File、RollingRandomAccessFile)一般需要配置一个或多个输出源AppenderRef。

每个logger可以指定一个level(TRACE, DEBUG, INFO, WARN, ERROR, ALL or OFF),不指定时level默认为ERROR。

additivity指定是否同时输出log到父类的appender,缺省为true。

| 详细配置示例

<?xml version="1.0" encoding="UTF-8"?>
<configuration monitorInterval="30">
<appenders>
<console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="[%d
{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
</console>

<File name="log" fileName="logs/test.log" append="false">
<PatternLayout pattern="%d
{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
</File>

<RollingFile name="RollingFileInfo" fileName="logs/info.log"
filePattern="logs/$$
{date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log">
<Filters>

<ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
<ThresholdFilter level="WARN" onMatch="DENY" onMismatch="NEUTRAL"/>
</Filters>
<PatternLayout pattern="[%d
{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="100 MB"/>
</Policies>
</RollingFile>

<RollingFile name="RollingFileWarn" fileName="logs/warn.log"
filePattern="logs/$$
{date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log">
<Filters>
<ThresholdFilter level="WARN" onMatch="ACCEPT" onMismatch="DENY"/>
<ThresholdFilter level="ERROR" onMatch="DENY" onMismatch="NEUTRAL"/>
</Filters>
<PatternLayout pattern="[%d
{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="100 MB"/>
</Policies>

<DefaultRolloverStrategy max="20"/>
</RollingFile>

<RollingFile name="RollingFileError" fileName="logs/error.log"
filePattern="logs/$$
{date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log">
<ThresholdFilter level="ERROR"/>
<PatternLayout pattern="[%d
{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="100 MB"/>
</Policies>
</RollingFile>

</appenders>

<loggers>

<logger name="org.springframework" level="INFO">
</logger>
<logger name="org.mybatis" level="INFO">
</logger>
<root level="all">
<appender-ref ref="Console"/>
<appender-ref ref="RollingFileInfo"/>
<appender-ref ref="RollingFileWarn"/>
<appender-ref ref="RollingFileError"/>
</root>
</loggers>

</configuration>

| 多说一句

本次文章的代码中有开发和线上的配置示例,详见:

若对您有所帮助,请帮忙点一下“在看”,谢谢~

限 时 特 惠: 本站每日持续更新海量各大内部创业教程,一年会员只需98元,全站资源免费下载 点击查看详情
站 长 微 信: lzxmw777

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注