当前位置: 首页 > 知识库问答 >
问题:

配置多个log4j2记录器

巫马淳
2023-03-14
package demo;
import java.io.IOException;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class Logdemo {
private final static Logger logger = LogManager.getLogger();
private final static Logger userLog = LogManager.getLogger("demo.userMsg");

public static void main(String[] args) throws IOException {
    try {
        ((Object) null).toString();
    } catch (Exception e) {
        logger.error("error message", e);
    }
    try {
        ((Object) null).toString();
    } catch (Exception e) {
        logger.fatal( "User level Red message" ,e);
    }
    try {
        ((Object) null).toString();
    } catch (Exception e) {
        userLog.error( "User level Amber message" ,e); 
    }
    logger.info("Errors Logged");
    userLog.info("Lunch is served.");
  }
}
    <Loggers>
        <Root level="all">
            <AppenderRef ref="RollingFile" level="ALL"/>
            <AppenderRef ref="Console" level="ALL"/>
        </Root>
        <userMsg name="demo.userMsg" level = "all">
            <AppenderRef ref="UserMsgFile" level="ALL"/>
        </userMsg> 
    </Loggers>
</Configuration>

由此我从NetBeans得到以下错误消息:

run:
2017-09-18 22:20:13,933 main ERROR Error processing element UserMsgFile [Appenders: null]): CLASS_NOT_FOUND
2017-09-18 22:20:13,936 main ERROR Error processing element userMsg  ([Loggers: null]): CLASS_NOT_FOUND
22:20:14.038 [main] INFO  demo.Logdemo - logger starting...
22:20:14.040 [main] ERROR demo.Logdemo - error message

所有异常消息都写入控制台,包括用户日志的消息。所以我知道两个伐木工都在工作。记录器附加器写入文件OK。userLog记录器不会创建任何文件,它使用几乎相同的附加器。

看来我还没有正确地命名一些东西来允许log4j2找到记录器。我试过各种命名的组合来弄对它,但我搞不清问题出在哪里。

    <Loggers>
    <Logger name="demo" level="all">  <!-- name = package name -->
        <AppenderRef ref="UserLogFile" level="ALL" />
    </Logger>
    <Root level="all">
        <AppenderRef ref="Console" level="ALL"/>
        <AppenderRef ref="SystemLogFile" level="ALL"/>
    </Root>
</Loggers>

我必须在每个类的记录器初始化中包含类名吗?
编辑:我需要包含包名。我花了一段时间才弄明白。

我遇到的另一个问题是为log4j2打开调试消息。这是通过以下方式实现的:

    <Configuration status="WARN">  <!-- to debug, set status="TRACE"  -->

共有1个答案

谷德本
2023-03-14

我已经改变了我的方法。我使用了标记功能,并添加了记录器。向日志消息添加标记允许我使用不同的附加器来处理用户消息。示例代码如下所示:

import java.io.IOException;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.MarkerManager;
import org.apache.logging.log4j.Marker;

    public class Logdemo {

    private final static Logger logger = LogManager.getLogger();
    static final Marker usrMkr = MarkerManager.getMarker("USR");

    public static void main(String[] args) throws IOException {
        logger.info("logger starting...");

        try {
            ((Object) null).toString();
        } catch (Exception e) {
            logger.fatal( usrMkr,"User message" );
        }
        try {
            ((Object) null).toString();
        } catch (Exception e) {
            logger.debug( "Debug error message" ,e); 
        }
        logger.info("Errors Logged");
      }
    }

配置文件的相关部分如下所示:

     <RollingFile
       name="UserLogFile" 
       fileName="${basePath}/UserMsg.log"
       immediateFlush="false"
       filePattern="logs/$${date:yyyy-MM}/user-%d{MM-dd-yyyy}-%i.log">
       <MarkerFilter marker="USR" onMatch="ACCEPT" onMismatch="DENY"/>
     </RollingFile>
</Appenders>

<Loggers>
    <Logger name="demo" level="all">
        <AppenderRef ref="UserLogFile" level="ALL"/>
    </Logger>
    <Root level="all">
        <AppenderRef ref="Console" level="ALL"/>
        <AppenderRef ref="RollingFile" level="ALL"/>

    </Root>

</Loggers>

我创建了一个添加了MarkerFilter命令的追加器。我将记录器指向appender,以便将标记的消息转移到一个单独的文件。注为了简洁起见,我砍掉了xml文件的大块。

 类似资料:
  • 上面是log4j2的一个片段。xml配置文件,我想将其转换为属性。 问题是当我在同一个文件(属性)中定义多个记录器时,只有根记录器工作,这意味着改变其他记录器的级别不会做任何事情。 在同一个属性配置文件中定义多个记录器的正确方法是什么? 编辑: 这是我尝试过的属性配置,但不起作用。

  • 我定义了多个记录器,如下所示(com.xyz和org.xyz)。Log4j2忽略了第一个记录器定义,只加载第二个。在示例中,org.xyz未加载。 在log4j2调试消息下方查找。 我的配置正确吗?

  • 我想让一些记录器异步在log4j2.properties文件。在xml格式中,您可以添加为 我在log4j2中试过了。作为记录器的属性=com foo Bar 但这种语法似乎是错误的。 正确的配置方法是什么?

  • 我正在使用log4j在我的一个应用程序上做一些日志记录。我的配置文件中的日志记录程序如下所示。 基本上,我希望从我写的代码中获得“信息”级别的消息,但是我希望外部库只在有警告或更可怕的情况下记录。 这正如我所期望的那样工作,但是在“org.eclipse.jetty”下有很多类 有可能这样做吗? 也就是说,我希望整个包中的所有内容都只警告/错误/致命。 我试了上述方法,但没有效果。是否有一个“通配

  • 因此,我希望使用CI活动记录获得最终输出,作为产品列表及其详细信息。