测试代码:
@Test public void test1(){ Logger myLogger = LogManager.getLogger("myLogger");//rootlogger Logger myLogger2 = LogManager.getLogger("fileAndConsole");//fileAndConsole for (int i = 0;i < 50;i++){ myLogger.debug("debug msg1"); } for (int i = 0;i < 50;i++){ myLogger2.debug("debug msg2"); } }msg1将只出现在控制台,而msg2同时出现在控制台和日志文件;
Filter节点:Filter用于对日志进行过滤,一些情况下我们可能需要对日志进行更加个性化的限制,
例如:
输出日志消息包含某个字符串的
输出指定两个不相关的级别error,debug
日志的生命周期 :一个日志事件(LogEvent)产生后到最终输出到目的地会经过以下环节:
全局过滤器->Logger 过滤器->logger - appender过滤器->appender输出
无论哪个环节的过滤器,每个过滤器在匹配或是不匹配时都要明确该日志事件的处理方式,包含三种:
ACCEPT接受(继续传递该LogEvent)
DENY拒绝(直接丢弃该LogEvent)
NEUTRAL中立(不清楚该怎么办继续往后传递LogEvent)
全局过滤器:评估结果为接受时,其他全局过滤器将不会再对该事件进行评估,且不再交给Logger过滤器评估
Logger过滤器:评估为拒绝时不再交给Appdener过滤器
Appdener过滤器:最终决定改日志是否输出
通常需要根据实际需求来配置过滤器:
下例配置列出了三种过滤器的示例(无实意义):
<?xml version="1.0" encoding="UTF-8"?> <Configuration status="TRACE" monitorInterval="5" packages="com.kanq.extend.cat.log4j2"> <Filters> <!-- 全局级别Filter --> <BurstFilter level="INFO" rate="16" maxBurst="100"/> </Filters> <Appenders> <RollingFile fileName="logs/app.log" filePattern="logs/app-%d{MM-dd-yyyy}.log.gz"> <!-- Appender级别的Filter --> <BurstFilter level="INFO" rate="16" maxBurst="100"/> <PatternLayout> <pattern>%d %p %c{1.} [%t] %m%n</pattern> </PatternLayout> <TimeBasedTriggeringPolicy /> </RollingFile> </Appenders> <Loggers> <!-- Logger级别的Filter --> <Root level="error"> <BurstFilter level="INFO" rate="16" maxBurst="100"/> <AppenderRef ref="RollingFile"/> </Root> </Loggers> </Configuration> 过滤器案例:通过时间过滤器实现将白天和夜晚的是指写入不同位置:
<Configuration status="WARN"> <Appenders> <Console target="SYSTEM_OUT"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> </Console> <File fileName="logs/appDay.log" append="true"> <TimeFilter start="06:00:00" end="24:00:00" onMatch="ACCEPT" onMismatch="DENY"/> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger - %msg%n"/> </File> <File fileName="logs/appNight.log" append="true"> <TimeFilter start="24:00:00" end="06:00:00" onMatch="ACCEPT" onMismatch="DENY"/> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger - %msg%n"/> </File> </Appenders> <Loggers> <Root level="all"> <AppenderRef ref="Console" /> <AppenderRef ref="DayAppender" /> <AppenderRef ref="NightAppender" /> </Root> </Loggers> </Configuration>当然官网还有其他的过滤器,如正则过滤等,大家根据需求选择即可;地址:官方手册
web项目中的使用web环境下需要额外的依赖包:
<!-- web容器中需要添加log4j-web --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-web</artifactId> <version>2.5</version> </dependency>controller中的使用:
@Controller @RequestMapping("/customer") public class CustomerController { //为controller添加属性 用于获取一个日志记录器(Logger) private Logger logger = LogManager.getLogger(this.getClass().getPackage().getName()); @RequestMapping("/list") public String getCustomerList(Model model, SearchInfo searchInfo){ logger.info("request this /list interface"); //... } }若配置文件名称不是默认的跨域通过以下代码来加载:
File file = new File("/Users/jerry/LOGfj/src/main/resources/log4j3.xml"); BufferedInputStream in = new BufferedInputStream(new FileInputStream(file)); ConfigurationSource source = new ConfigurationSource(in); Configurator.initialize(null, source);