log4j2 项目日志组件的实例代码
|
在项目运行过程中,常常需要进行功能调试以及用户行为的跟踪和记录,部分人习惯使用System.out,但这并不建议,它仅仅是使用方便但不便于维护也无扩展性。相比log4j的话,log4j可以控制日志信息的输送目的地、输出格式以及级别等等,使我们能够更加细致地控制日志的生成过程。 Log4j2是对Log4j1的升级,在性能和功能上有显著的改进,包括多线程中吞吐量的增强、占位符的支持、配置文件自动重新加载等 一、入门介绍 1、下载jar包 pox.xml <dependencies> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.10.0</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.10.0</version> </dependency> </dependencies> 2、配置文件 Log4j包含四个配置工厂实现:JSON、YAML、properties、XML,本文介绍常用的方式XML。 Log4j具有在初始化期间自动配置自身的能力。当Log4j启动时,它将定位类路径下所有符合名称的文件,优先级顺序:log4j2-test.properties > log4j2-test.xml > log4j2.properties > log4j2.xml 3、一个简单的实例 xml配置:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
java代码:
private static final Logger logger = LogManager.getLogger(MyApp.class);
@Test
public void testLog4j(){
logger.info("hello world!");
}
}
控制台信息 22:17:47.146 [main] INFO MyApp - hello world! 二、模块介绍 <Configuration>
<Appenders> Log4j允许将日志请求打印到多个目的地。在log4j语言中,输出目的地称为Appender。目前,appender存在于控制台、文件、远程套接字服务器、Apache Flume、JMS、远程UNIX Syslog守护进程和各种数据库api中。以下介绍几种比较常用的appender,如需了解更多可以到官网上进行查阅。 1、ConsoleAppender 输出到控制台,<Console>
2、FileAppender 输出到文件,<File>
3、JDBCAppender JDBCAppender使用标准JDBC将日志事件写入到关系数据库表中。它可以配置为使用JNDI数据源或自定义工厂方法获得JDBC连接。无论采用哪种方法,都必须由连接池来支持。 否则,日志记录性能将受到极大的影响。 如果已配置的JDBC驱动程序支持批处理语句,并且将缓冲区大小配置为一个正数,那么日志事件将被批处理。 (1)<JDBC>
(2)使用<DataSource>来获得JDBC的连接,这里仅列出jndi:
(3)使用<Column>来指定要写入表中的哪些列,以及如何对它们进行写入。它没有SQL注入漏洞。
实例:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="error">
<Appenders>
<JDBC name="databaseAppender" tableName="dbo.application_log">
<DataSource jndiName="java:/comp/env/jdbc/LoggingDataSource" />
<Column name="eventDate" isEventTimestamp="true" />
<Column name="level" pattern="%level" />
<Column name="logger" pattern="%logger" />
<Column name="message" pattern="%message" />
<Column name="exception" pattern="%ex{full}" />
</JDBC>
</Appenders>
<Loggers>
<Root level="warn">
<AppenderRef ref="databaseAppender"/>
</Root>
</Loggers>
</Configuration>
<PatternLayout> (1)日期,%d / %date
当然你也可以自定义格式,比如 %d{yyyy-MM-dd HH:mm:ss} (2)记录器,%c / %logger
{?} - ?是正整数时表示从右边开始取n个部分,负整数表示从左边开始移除n个部分,那为什么%c{-10}是完整的名称我也不清楚,欢迎留言 (3)日志信息,%m / %msg / %message (4)日志级别,%level <Filter> log4j2自带多种filter供直接使用,也可以由我们自己来定义filter: MyFilter.java
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.Marker;
import org.apache.logging.log4j.ThreadContext;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.Logger;
import org.apache.logging.log4j.core.config.plugins.Plugin;
import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
import org.apache.logging.log4j.core.config.plugins.PluginFactory;
import org.apache.logging.log4j.core.filter.AbstractFilter;
import org.apache.logging.log4j.message.Message;
@Plugin(name = "MyFilter",category = "Core",elementType = "filter",printObject = true)
public final class MyFilter extends AbstractFilter {
private final Level level;
private MyFilter(Level level,Result onMatch,Result onMismatch) {
super(onMatch,onMismatch);
this.level = level;
}
public Result filter(Logger logger,Level level,Marker marker,String msg,Object[] params) {
return filter(level);
}
public Result filter(Logger logger,Object msg,Throwable t) {
return filter(level);
}
public Result filter(Logger logger,Message msg,Throwable t) {
return filter(level);
}
@Override
public Result filter(LogEvent event) {
return filter(event.getLevel());
}
private Result filter(Level level) {
/*
* 业务逻辑
* */
return level.isMoreSpecificThan(this.level) ? onMatch : onMismatch;
}
@Override
public String toString() {
return level.toString();
}
@PluginFactory
public static MyFilter createFilter(@PluginAttribute(value = "level",defaultString = "ERROR") Level level,@PluginAttribute(value = "onMatch",defaultString = "NEUTRAL") Result onMatch,@PluginAttribute(value = "onMismatch",defaultString = "DENY") Result onMismatch) {
return new MyFilter(level,onMatch,onMismatch);
}
}
log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" monitorInterval="5" packages="your packages" verbose="false" strict="true">
<Appenders>
<Console name="Console" target="SYSTEM_OUT" ignoreExceptions="true">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} %level %logger{10} - %msg"/>
<MyFilter level="info" onMatch="ACCEPT"/>
</Console>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
补充: 在实际应用中,有时需要对用户的访问信息进行记录,比如请求参数、用户id等等。在log4j1中我们会使用MDC和NDC来存储应用程序的上下文信息,而log4j2使用ThreadContext来实现MDC和NDC两者的功能。 (1)NDC采用类似栈的机制来存储上下文信息,线程独立。 在PatternLayout中使用 %x 来输出,注意x是小写。 实例: Test.java
ThreadContext.push("hello world!");
log4j2.xml <Column name="tip" pattern="%x" /> (2)MDC采用类似map的机制来存储信息,线程独立。 在PatternLayout中使用 %X{userId} 来输出,注意X是大写。 实例: Test.java
ThreadContext.put("userId","1");
log4j2.xml
<Column name="userId" pattern="%X{userId}" />
注意使用完后调用clearAll()清除上下文映射和堆栈。 api:http://logging.apache.org/log4j/2.x/javadoc.html 官网地址:https://logging.apache.org/log4j/2.x/index.html 以上这篇log4j2 项目日志组件的实例代码就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持编程小技巧。 (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
