log4j及其log4j2的使⽤
简单的说 log4j2 是log4j2的升级版,据说采⽤了⼀些新技术(⽆锁异步、等等),使得⽇志的吞吐量、性能⽐log4j 1.x提⾼10倍,并解决了⼀些死锁的bug,⽽且配置更加简单灵活。其使⽤⽅式与使⽤配置与log4j相同。新建⼀个testlog的maven⼯程依赖相关的log4j2的jar包
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.5</version>
</dependency>
log4j2⽂件读取类型:
log4j是apache的⼀个开源项⽬,在写这篇博客的时候已经发布了2.0的beta版本,⾸先需要注意的是,log4j 2.0与以往的1.x有⼀个明显的不同,其配置⽂件只能采⽤.xml, .json或者 .jsn。在默认情况下,系统选择configuration⽂件的优先级如下:(classpath为scr⽂件夹)
1. classpath下名为 log4j-test.json 或者log4j-test.jsn⽂件
2. classpath下名为 l
3. classpath下名为 log4j.json 或者log4j.jsn⽂件
4. classpath下名为 l
新建⼀个l⽂件放在src/main/resources⽂件夹下
<?xml version="1.0" encoding="UTF-8"?>
<!-- log4j2使⽤说明:
使⽤⽅式如下:
private static final Logger logger = Logger(实际类名.Name());
2、⽇志说明:
(1)请根据实际情况配置各项参数
(2)需要注意⽇志⽂件备份数和⽇志⽂件⼤⼩,注意预留⽬录空间
(3)实际部署的时候backupFilePatch变量需要修改成linux⽬录
-->
<configuration status="error">
<Properties>
<Property name="fileName">front.log</Property>
<Property name="backupFilePatch">d:/usr/log/</Property>
</Properties>
<!--先定义所有的appender-->
<appenders>
<!--这个输出控制台的配置-->
<Console name="Console" target="SYSTEM_OUT">
<!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
<ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY" />
<!--这个都知道是输出⽇志的格式-->
<PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n" />
</Console>
<!--这个会打印出所有的信息,每次⼤⼩超过size,则这size⼤⼩的⽇志会⾃动存⼊按年份-⽉份建⽴的⽂件夹下⾯并进⾏压缩,作为存档-->
<RollingFile name="RollingFile" fileName="${backupFilePatch}/${fileName}"
filePattern="${backupFilePatch}$${date:yyyy-MM}/app-%d{yyyyMMddHHmmssSSS}.">
<PatternLayout
pattern="%d{yyyy.MM.dd 'at' HH:mm:ss.SSS z} %-5level %class{36} %L %M - %msg%xEx%n" />
<!-- ⽇志⽂件⼤⼩ -->
<SizeBasedTriggeringPolicy size="20MB" />
<!-- 最多保留⽂件数 -->
<DefaultRolloverStrategy max="20"/>
</RollingFile>
</appenders>
<!--然后定义logger,只有定义了logger并引⼊的appender,appender才会⽣效-->
<loggers>
<!--建⽴⼀个logger,此logger监听name对应的包名下的⽇志输出,level表⽰⽇志级别-->
<Logger name="testlog" level="info" additivity="true">
<AppenderRef ref="RollingFile" />
</Logger>
<!--建⽴⼀个默认的root的logger-->
<Root level="error">
<AppenderRef ref="Console" />
</Root>
</loggers>
</configuration>
Configuration标签中的常⽤元素说明:
monitorInterval:Log4j 2 定期检查和应⽤配置⽂件的时间间隔(单位:秒,如果更改配置⽂件,不⽤重启系统)。
status:Log4j内部事件记录的等级,只对Log4j本⾝的事件有效。
strict:是否使⽤XML Schema来检查配置⽂件。
schema:Shema⽂件的位置。
例⼦:
<Configuration status="warn" monitorInterval="30" strict="true" schema="Log4J-V2.2.xsd">
……
</Configuration> 
Appenders标签说明:
Appender⽤来定义不同的输出位置,可以是console、⽂件、远程socket服务器、Apache Flume、JMS以及远程 UNIX 系统⽇志守护进程。⼀个Logger可以绑定多个不同的Appender。
appenders ⽤于定义⽇志的格式,包含了Console 和 RollingFile 两种格式,分别
Console的level是trace,⽽RollingFile没有定义⾃⼰的⽇志级别level,由引⽤的loggers定义
loggers 真正的将appdender应⽤⽣效,log4j2根据Logger和Root的定义写⼊相应的appender格式的⽇志
Loggers标签说明:
它被⽤来配置LoggerConfig,包含⼀个root logger和若⼲个普通logger
普通必须有⼀个name元素,root logger不⽤name元素
每个logger可以指定⼀个level(TRACE, DEBUG, INFO, WARN, ERROR, ALL or OFF),不指定时level默认为ERROR
additivity指定是否同时输出log到⽗类的appender,缺省为true。(层级关系与java包类似,例如:com.foo是com.foo.Bar的⽗级;java是java.util的⽗级,是java.util.vector的祖先。root是最顶层。)
每个logger可以包含若⼲个属性:AppenderRef, Filter, Layout, 等
Filters标签说明:
与防⽕墙过滤的规则相似,log4j2的过滤器也将返回三类状态:Accept(接受), Deny(拒绝)或Neutr
al(中⽴)。其中,Accept意味着不⽤再调⽤其他过滤器了,这个LogEvent将被执⾏;Deny意味着马上忽略这个event,并将此event的控制权交还给过滤器的调⽤者;Neutral则意味着这个event应该传递给别的过滤器,如果再没有别的过滤器可以传递了,那么就由现在这个过滤器来处理。
新建⼀个Test.class类进⾏测试
package testlog;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class Test {
public static Logger logger = Logger(Test.class);
public static void main(String [] args) {
log4j2不打印日志<("error accu");
logger.info("test");
logger.debug("test");
}
}
控制台输出内容
17:11:19.149 ERROR testlog.Test 9 main - error accu
17:11:19.150 INFO  testlog.Test 10 main - test
⽂件输出内容:
trace:是追踪,就是程序推进以下,你就可以写个trace输出,所以trace应该会特别多,不过没关系,我们可以设置最低⽇志级别不让他输出。
    debug:调试么,我⼀般就只⽤这个作为最低级别,trace压根不⽤。是在没办法就⽤eclipse或者idea的debug功能就好了么。
    info:输出⼀下你感兴趣的或者重要的信息,这个⽤的最多了。
    warn:有些信息不是错误信息,但是也要给程序员的⼀些提⽰,类似于eclipse中代码的验证不是有error 和warn(不算错误但是也请注意,⽐如以下depressed的⽅法)。
    error:错误信息。⽤的也⽐较多。
    fatal:级别⽐较⾼了。重⼤错误,这种级别你可以直接停⽌程序了,是不应该出现的错误么!不⽤那么紧张,其实就是⼀个程度的问题。
有的时候部分系统使⽤了slf4j,此时可以将引⽤库统⼀使⽤log4j2作为底层实现,保证⽇志的统⼀
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.0.2</version>
</dependency>
使⽤⽅式:
public static Logger Logger(Test.class);例如:
package testlog;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Test {
//public static Logger logger = Logger(Test.class); public static Logger Logger(Test.class); public static void main(String [] args) {
<("error accu");
logger.info("test");
logger.debug("test");
}
}
控制台输出:
⽇志输出:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。