使用log4j2进行日志记录

时间:2017-05-11 15:09:36

标签: maven logging jboss log4j log4j2

我正在尝试从log4j1更改为log4j2。我做了什么:

  • 删除旧配置文件log4j.xml
  • 创建了新的配置文件log4j2.xml
  • 创建了jboss-deployment-structure.xml
  • 编辑过的pom

环境: 狂野10 1 EAR 4战争 web.xml未在文件中使用。之前的log4j配置日志位于EAR(仅限)

Log4j2配置文件

 <?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
        </Console>
        <File name="MyFile" fileName="all.log" immediateFlush="false" append="false">
            <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </File>
    </Appenders>
    <Loggers>
        <Root level="debug">
            <AppenderRef ref="Console" />
            <AppenderRef ref="MyFile"/>
        </Root>
    </Loggers>
</Configuration>

Jboss部署结构

    <?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2">
    <deployment>
        <!--Use log4j.xml file instaead of using the loggin subsystem configuration -->
        <exclusions>
            <module name="org.apache.log4j" />
        </exclusions>
    </deployment>
</jboss-deployment-structure>

新的maven依赖

 <!-- Apache Log4j API -->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>2.8.2</version>
        </dependency>

        <!-- Apache Log4j SLF4J Binding -->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j-impl</artifactId>
            <version>2.8.2</version>
        </dependency>

        <!-- Apache Log4j Core -->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.8.2</version>

        </dependency>

我之前说过我使用log4j1和SLF4j有外观吗?这些是我所做的改变(我试图从一个我在网上找到的简单配置文件开始)。该文件甚至没有创建,但控制台日志工作正常。

谢谢,

2 个答案:

答案 0 :(得分:1)

我使用下面的配置在JBoss 7.1.1中使用webapp。

<强> /src/main/resources/log4j2.xml

... above unchanged ...
<File name="MyFile" fileName="/Users/tima/Desktop/all.log" immediateFlush="true" append="true">
... below unchanged ...

<强> WEB-INF / JBoss的部署-structure.xml

<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.1">
    <deployment>
        <exclusions>
            <module name="org.apache.log4j" />
        </exclusions>
    </deployment>
</jboss-deployment-structure>

pom文件与你的相同。

测试控制器

@Controller
@RequestMapping("/test1")
public class HelloWorldController {

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

    @RequestMapping(method = RequestMethod.GET)
    public ResponseEntity<Map<String, Object>> printHello() {
        logger.info("entered printHello()");
        System.out.println("entered printHello() 2");

        Map<String, Object> resultMap = new HashMap<String, Object>();

        return new ResponseEntity<>(resultMap, HttpStatus.OK);
    }
}

结果

$: cat ~/Desktop/all.log
2017-05-11 15:13:35.918 [http--0.0.0.0-8080-2] INFO  com.tima.controller.HelloWorldController - entered printHello()

同样在server.log中我可以看到以下内容:

15:13:35,937 INFO  [stdout] (http--0.0.0.0-8080-2) entered printHello() 2

修改

如果您想使用org.slf4j.Logger记录器,则必须将以下行添加到jboss-deployment-structure.xml

<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.1">
    <deployment>
        <exclusions>
            <module name="org.slf4j" />
            <module name="org.slf4j.impl" />
        </exclusions>
    </deployment>
</jboss-deployment-structure>

编辑2

如果您使用的是EAR文件,则可以使用在EAR文件中的其他模块/ WAR之间共享的公共JAR来设置日志记录。

在常见的JAR中有:

  1. log4j-apilog4j-corelog4j-slf4j-impl作为pom.xml中的依赖项。
  2. log4j2.xml下的src/main/resources
  3. 将公共jar作为WAR文件中的依赖项。您可以从所有WAR文件中删除jboss-deployment-structure.xml文件。

    jboss-deployment-structure.xml文件现在位于src/main/application/META-INF/下的EAR文件中,并包含:

    <?xml version="1.0" encoding="UTF-8"?>
    <jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.1">
        <sub-deployment name="war-1.war">
            <exclusions>
                <module name="org.slf4j" />
                <module name="org.slf4j.impl" />
            </exclusions>
        </sub-deployment>
        <sub-deployment name="war-2.war">
            <exclusions>
                <module name="org.slf4j" />
                <module name="org.slf4j.impl" />
            </exclusions>
        </sub-deployment>
        ...other wars here...
    </jboss-deployment-structure>
    

    以上配置将从所有WAR文件打印到同一文件。但您可以将log4j2.xml文件配置为根据包名称打印到不同的文件。在question

    中解释了这种方法

答案 1 :(得分:0)

在jboss-deployment-structure.xml中排除日志子系统可能会更好。我本来会以此为注释,但是粘贴xml并不是很漂亮。

<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure>
 <deployment>
    <exclude-subsystems>
            <subsystem name="logging" />
        </exclude-subsystems>
 </deployment>
</jboss-deployment-structure>