如何配置log4j2 Web应用程序

时间:2015-02-05 16:23:49

标签: java web-services servlets web-applications log4j2

对于Web应用程序来说有点新鲜,最近我需要使用日志记录机制,为此我选择了Log4J2,我浏览了指南,并下载了所需的库。这是我到目前为止所做的。

1. Added following jars to web-inf/lib
   --  log4j-core2.1.jar
   --  log4j-api-2.1.jar
   --  log4j-web-2.1.jar


2. Added below xml as, log4j2.xml in java/src directory

<?xml version="1.0" encoding="UTF-8"?>
<configuration name="NONPROD" status="OFF">


    <Properties>

        <Property name="log-path">logs</Property>
    </Properties>


    <Appenders>

        <Console name="console-log" target="SYSTEM_OUT">
            <!-- <pattern>[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n -->
            <!-- </pattern> -->

            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
        </Console>


        <RollingFile name="info-log" fileName="${log-path}/web-info.log"
            filePattern="${log-path}/web-info-%d{yyyy-MM-dd}.log">
            <PatternLayout>
                <pattern>[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n
                </pattern>
            </PatternLayout>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1"
                    modulate="true" />

                <OnStartupTriggeringPolicy />
                <SizeBasedTriggeringPolicy size="20 MB" />
            </Policies>
        </RollingFile>

        <RollingFile name="error-log" fileName="${log-path}/web-error.log"
            filePattern="${log-path}/web-error-%d{yyyy-MM-dd}.log">
            <PatternLayout>
                <pattern>[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n
                </pattern>
            </PatternLayout>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1"
                    modulate="true" />

                <OnStartupTriggeringPolicy />
                <SizeBasedTriggeringPolicy size="20 MB" />
            </Policies>
        </RollingFile>


        <RollingFile name="debug-log" fileName="${log-path}/web-debug.log"
            filePattern="${log-path}/web-debug-%d{yyyy-MM-dd}.log">
            <PatternLayout>
                <pattern>[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n
                </pattern>
            </PatternLayout>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1"
                    modulate="true" />

                <OnStartupTriggeringPolicy />
                <SizeBasedTriggeringPolicy size="20 MB" />
            </Policies>
        </RollingFile>



        <RollingFile name="trace-log" fileName="${log-path}/web-trace.log"
            filePattern="${log-path}/web-trace-%d{yyyy-MM-dd}.log">
            <PatternLayout>
                <pattern>[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n
                </pattern>
            </PatternLayout>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1"
                    modulate="true" />

                <OnStartupTriggeringPolicy />
                <SizeBasedTriggeringPolicy size="20 MB" />
            </Policies>
        </RollingFile>

    </Appenders>

    <Loggers>

        <Logger name="com.demo.web.log4j2.file" level="debug"
            additivity="false">

            <appender-ref ref="trace-log" level="trace" />

            <appender-ref ref="error-log" level="error" />

            <appender-ref ref="debug-log" level="debug" />

            <appender-ref ref="info-log" level="info" />
        </Logger>

        <Logger name="com.demo.web.log4j2.console" level="all"
            additivity="false">
            <AppenderRef ref="console-log" />
        </Logger>


        <Root level="info" additivity="true">

            <AppenderRef ref="console-log" />

        </Root>

    </Loggers>


</configuration>

3. third and last i wrote an small web service to test logging

@Path("/register")
public class Register {

    private DataManager mManager;
     private static final Logger LOG = LogManager.getLogger(Register.class);

    public Register(){
        mManager = DataManager.getInstance();
    }


    @GET
    @Path("/{param}")
    public Response getMsg(@PathParam("param") String msg) {

        LOG.error("Not supported operations");
        return Response.status(Response.Status.BAD_REQUEST)
                .entity("Not supported").build();

    }

但是在控制台中,在触发获取请求时,这就是我打印的全部内容。

INFO: Server startup in 35959 ms
Not supported operations // this is not in pattern i supplied in log4j2.xml

// this is my pattern
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />

我发现这可能是由于出现了一些问题,我很难找到实际原因,对于网络编程来说是全新的,请帮我配置我的记录器。

谢谢, Techfist

2 个答案:

答案 0 :(得分:1)

您的servlet容器正在使用其他日志记录框架,该框架会记录到控制台。找出哪个日志框架并使用log4j2的桥接库之一将输出重定向到log4j2设置。

答案 1 :(得分:0)

好吧,我找到了原因,问题主要是由于两个原因而发生的。

  1. 首先我假设从catilina属性中的jarsToSkip属性中排除log4j *模式
  2. 其次,我在java / src里面的web-inf里面保留了两个log4j2.xml,它应该只出现在java / src中。不需要两个文件。
  3. 第三,但不是强制性的,在部署之前只检查log4j2.xml是否包含在web-inf / classes中,如果没有,则只需添加它。

    它,在解决了这个问题之后,我现在得到了正确的日志。