这里采用slf4j和log4j2集成的方式。

一,所需jar包或依赖:

slf4j-api


log4j-api



log4j-core



log4j-slf4j-impl(集成包)


log4j-web(web项目需要)


注意:最新的log4j2所需要的jdk版本比较高,由于这里采用的jdk1.6,所以版本最高只能使用2.3的,这里使用的具体版本如下:


slf4j-api-1.7.25.jar



log4j-api-2.3.jar



log4j-core-2.3.jar



log4j-slf4j-impl-2.3.jar



log4j-web-2.3.jar



二,log4j的配置文件:


之前log4j的1.x版本支持properties配置文件的方式,但是在log4j2这里,只支持xml配置文件的方式,或者json,jsn后缀的文件。


系统选择配置文件的优先级(从先到后)如下:


(1).classpath下的名为log4j2-test.json 或者log4j2-test.jsn的文件.


(2).classpath下的名为log4j2-test.xml的文件.


(3).classpath下名为log4j2.json 或者log4j2.jsn的文件.


(4).classpath下名为log4j2.xml的文件.


我们一般默认使用log4j2.xml进行命名。如果本地要测试,可以把log4j2-test.xml放到classpath,而正式环境使用log4j2.xml,则在打包部署的时候不要打包log4j2-test.xml即可。


log4j2.xml配置文件默认配置为:



1. <?xml version="1.0" encoding="UTF-8"?>
2. <Configuration status="WARN">
3.   <Appenders>
4.     <Console name="Console" target="SYSTEM_OUT">
5.       <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
6.     </Console>
7.   </Appenders>
8.   <Loggers>
9.     <Root level="error">
10.       <AppenderRef ref="Console"/>
11.     </Root>
12.   </Loggers>
13. </Configuration>


<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO" monitorInterval="10">
    <Properties>
        <!-- 配置日志文件输出目录 -->
        <Property name="LOG_DIR">/export/data/logs/myProject_web</Property>
    </Properties>
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss}] [%5p] %l --> %m %n"/>
        </Console>
        <RollingFile name="debug_logger_appender" fileName="${LOG_DIR}/web_debug.log"
                     filePattern="${LOG_DIR}/web_debug.log.%d{yyyy-MM-dd}">
            <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
            <ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss}] [%5p] %l --> %m %n"/>
            <Policies>
                <TimeBasedTriggeringPolicy modulate="true" interval="1"/>
            </Policies>
            <DefaultRolloverStrategy max="10"/>
        </RollingFile>
        <RollingFile name="info_logger_appender" fileName="${LOG_DIR}/web_info.log"
                     filePattern="${LOG_DIR}/web_info.log.%d{yyyy-MM-dd}">
            <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
            <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss}] [%5p] %l --> %m %n"/>
            <Policies>
                <TimeBasedTriggeringPolicy modulate="true" interval="1"/>
            </Policies>
            <DefaultRolloverStrategy max="10"/>
        </RollingFile>
        <RollingFile name="error_logger_appender" fileName="${LOG_DIR}/web_error.log"
                     filePattern="${LOG_DIR}/web_error.log.%d{yyyy-MM-dd}">
            <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
            <ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss}] [%5p] %l --> %m %n"/>
            <Policies>
                <TimeBasedTriggeringPolicy modulate="true" interval="1"/>
            </Policies>
            <DefaultRolloverStrategy max="10"/>
        </RollingFile>
    </Appenders>
    <Loggers>
        <Root level="INFO">
            <AppenderRef ref="Console"/>
            <!--<AppenderRef ref="debug_logger_appender"/>-->
            <AppenderRef ref="info_logger_appender"/>
            <AppenderRef ref="error_logger_appender"/>
        </Root>
        <!--过滤掉spring的一些无用的DEBUG信息-->
        <Logger name="org.springframework" level="ERROR"/>
    </Loggers>
</Configuration>




// log4j2方式
private static final org.apache.logging.log4j.Logger logger = org.apache.logging.log4j.LogManager.getLogger(Test.class);

// slf4j方式
private static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(Test.class);

这里要说明的一点是,使用.class为参数生成的logger,在配置文件中,与用全路径的包名或者类名,配置Logger标签相对应,例如:

<Logger name="org.springframework" level="ERROR"/>。 如果 参数是字符串,例如 org.slf4j.LoggerFactory.getLogger("test"),对应的Logger标签配置为<Logger name="test" level="ERROR"/>。



四,web项目使用log4j2注意事项

参考官网和各种资料显示,web项目需要使用

log4j-web的依赖,并且servlet3.0和servlet2.5的处理方式还有不同,不支持servlet2.4及以下版本。而servlet的版本使用,也是受到tomcat版本的约束。

下面是每个版本所支持的servlet和jsp版本对应表。

Servlet Spec

JSP Spec

EL Spec

WebSocket Spec

Apache Tomcat version

Actual release revision

Support Java Versions

4.0

TBD (2.4?)

TBD (3.1?)

TBD (1.2?)

9.0.x

None

8 and later

3.1

2.3

3.0

1.1

8.0.x

8.0.15

7 and later

3.0

2.2

2.2

1.1

7.0.x

7.0.57

6 and later

(WebSocket 1.1 requires 7 or later)

2.5

2.1

2.1

N/A

6.0.x

6.0.43

5 and later

2.4

2.0

N/A

N/A

5.5.x (archived)

5.5.36 (archived)

1.4 and later

2.3

1.2

N/A

N/A

4.1.x (archived)

4.1.40 (archived)

1.3 and later

2.2

1.1

N/A

N/A

3.3.x (archived)

3.3.2 (archived)

1.1 and later



这里使用的tomcat6.0.33版本,支持的servlet版本2.5。(找到tomcat下lib的jsp-api.jar和servlet-api.jar两个jar包,分别用winrar这类的解压软件打开,里面的META-INF文件夹下的MANIFEST.MF文件,里面有相应的版本号)




1. <listener>
2.         <listener-class>org.apache.logging.log4j.web.Log4jServletContextListener</listener-class>
3.     </listener>
4.  
5.     <filter>
6.         <filter-name>log4jServletFilter</filter-name>
7.         <filter-class>org.apache.logging.log4j.web.Log4jServletFilter</filter-class>
8.     </filter>
9.     <filter-mapping>
10.         <filter-name>log4jServletFilter</filter-name>
11.         <url-pattern>/*</url-pattern>
12.         <dispatcher>REQUEST</dispatcher>
13.         <dispatcher>FORWARD</dispatcher>
14.         <dispatcher>INCLUDE</dispatcher>
15.         <dispatcher>ERROR</dispatcher>
16.         <dispatcher>ASYNC</dispatcher><!-- Servlet 3.0 w/ disabled auto-initialization only; not supported in 2.5 -->
17.     </filter-mapping>


这里参考的文章:


https://logging.apache.org/log4j/2.x/manual/webapp.html




另外,不同版本(2.3,2.4,2.5,3.0)的Servlet web.xml 头信息可以参考文章: