【Java】web.xml中配置log4j2相关信息,解决配置文件不生效问题

由log4j升级到log4j2的过程,因spring升级4.3.X后放弃了log4j1

maven依赖的相关包

1.7.21
2.7



    org.apache.logging.log4j
    log4j-api
    ${log4j.version}



    org.apache.logging.log4j
    log4j-core
    ${log4j.version}



    org.apache.logging.log4j
    log4j-1.2-api
    ${log4j.version}



    org.apache.logging.log4j
    log4j-jcl
    ${log4j.version}




    org.apache.logging.log4j
    log4j-slf4j-impl
    ${log4j.version}



    org.slf4j
    slf4j-api
    ${slf4j.version}



    
    
    



    org.apache.logging.log4j
    log4j-web
    ${log4j.version}
    runtime



    org.slf4j
    jcl-over-slf4j
    ${slf4j.version}
    runtime



    org.slf4j
    log4j-over-slf4j
    ${slf4j.version}


需要注意的是项目中其他包用到了log4j,而不是log4j2的需要在maven依赖的包下面加上


     log4j
     log4j
 

web.xml中配置


  org.apache.logging.log4j.web.Log4jServletContextListener


    log4jServletFilter
    org.apache.logging.log4j.web.Log4jServletFilter


    log4jServletFilter
    /*
    REQUEST
    FORWARD
    INCLUDE
    ERROR


    log4jConfiguration
    classpath:/env/${env-dir}/log4j2.xml

这里需要提示下,如果加上了下面的内容(会有配置文件不生效的情况)


    isLog4jContextSelectorNamed
    true


    log4jContextName
    appWithJndiSelector

  • 如果isLog4jContextSelectorNamedtrue,则必须指定log4jContextName或必须在web.xml中指定appWithJndiSelector(名字随意,测试过好像没什么重要作用);否则,会报错。在这种情况下也应该指定log4jConfiguration,并且必须是 configuration 文件的有效 URI,否则配置无效不可用;但是,此参数不是必需的;这里需要注意的是,log4j2的配置文件,项目打包的之后一定要放到classes目录下,且文件名开头为log4j2log4j2-,不让会报错:
    ERROR StatusLogger No log4j2 configuration file found. Using default configuration: logging only errors to the console

  • 如果isLog4jContextSelectorNamed不是true,则可以选择指定log4jConfiguration,并且必须是 configuration 文件的有效 URI 或路径,或者以classpath:开头,以表示可在 classpath 上找到的 configuration 文件。如果没有此参数,Log4j 将使用标准机制来定位 configuration 文件。如果使用mvn -P dev传递指定配置文件,可以这么配置classpath:/env/${env-dir}/log4j2.xml

maven 配置

    
        dev
        
            dev
        
    

  • 默认情况下,Log4j 2 使用ServletContext的context name作为LoggerContext name,并使用标准 pattern 来定位 Log4j configuration 文件。您可以使用三个 context 参数来控制此行为。第一个isLog4jContextSelectorNamed指定是否应使用JndiContextSelector选择 context。如果未指定isLog4jContextSelectorNamedtrue以外的任何内容,则假定为false

项目中使用

package com.auto.controller;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class AutoParamController {

    private static final Logger logger = LogManager.getLogger(AutoParamController.class);

    public ModelAndView commonParm(ModelAndView modelAndView, int projectId) {
        logger.info("List CaseParamBean {} {}", lcbp.size(), "test");
    }
}

参阅源码:org.apache.logging.log4j.web.Log4jWebInitializerImpl.start 方法

参考官网:https://logging.apache.org/log4j/2.x/manual/webapp.html

The notes made by jwensh On March 14, 2020

你可能感兴趣的:(Java)