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

以编程方式使用Log4j 2文件appender时日志文件中的垃圾

祁权
2023-03-14

我有一个用例,我必须为我的所有记录器使用不同的文件名,我正试图在log4j2中以编程方式使用一个文件追加器

我正在使用以下XML文件来配置Log4j的启动

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" name="MyApp" packages="">
    <Appenders>
        <File name="MyFile" fileName="C:\myLogs.log">
            <PatternLayout>
                <Pattern>"%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n</Pattern>
            </PatternLayout>
        </File>
    </Appenders>
    <Loggers>
        <Root level="debug">
            <AppenderRef ref="MyFile"/>
        </Root>
    </Loggers>
</Configuration>

然后,我使用以下代码添加一个文件appender到我的记录器:

public static Logger getLogger(String loggerName)
    {

        final LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
        final org.apache.logging.log4j.core.config.Configuration config = ctx.getConfiguration();
        PatternLayout layout = PatternLayout.newBuilder().withPattern(PatternLayout.SIMPLE_CONVERSION_PATTERN).build();

        Appender appender = FileAppender.createAppender("C:/"+loggerName+".log", "false", "false", "File", "true",
                "false", "false", "4000", layout, null, "false", null, config);
        appender.start();
        config.addAppender(appender);
        AppenderRef ref = AppenderRef.createAppenderRef(loggerName+"ref", Level.ALL, null);
        AppenderRef[] refs = new AppenderRef[] {ref};
        LoggerConfig loggerConfig = LoggerConfig.createLogger("false", Level.ALL, loggerName,
                "true", refs, null, config, null );
        loggerConfig.addAppender(appender, null, null);
        config.addLogger(loggerName, loggerConfig);
        ctx.updateLoggers();

        return LogManager.getLogger(loggerName);
    }

以上代码是log4j2文档的逐字复制(http://logging.apache.org/log4j/2.x/manual/customconfig.html#AddingToCurrent)除了PatternLayout是如何创建的。

我得到以下数据,而不是我的日志

%10%p%c%s%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%-%m%n%d[%t]%p%c-%m%n

我将感谢任何帮助。

共有2个答案

蒋奕
2023-03-14

定义AppenderRef时出错:

AppenderRef ref = AppenderRef.createAppenderRef(loggerName+"ref", Level.ALL, null);

第一个参数是追加器的名称。您正在创建名为“File”的FileAppender,因此应创建AppenderRef:

AppenderRef ref = AppenderRef.createAppenderRef("File", Level.ALL, null);
劳星晖
2023-03-14

对不起,我无法复制这个。

在调整文件名后,我使用了以下类,其中包含getLogger方法:

import org.apache.logging.log4j.*; 
import org.apache.logging.log4j.core.config.*;
import org.apache.logging.log4j.core.Appender; 
import org.apache.logging.log4j.core.appender.FileAppender; 
import org.apache.logging.log4j.core.layout.PatternLayout; 
import org.apache.logging.log4j.core.LoggerContext;

public class Log4j2Test {

    public static void main(String[] args) throws Exception {
        getLogger("Test").info("This is a test line");
    }

    public static Logger getLogger(String loggerName)
    {
        final LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
        final org.apache.logging.log4j.core.config.Configuration config = ctx.getConfiguration();
        PatternLayout layout = PatternLayout.newBuilder().withPattern(PatternLayout.SIMPLE_CONVERSION_PATTERN).build();

        Appender appender = FileAppender.createAppender("/home/luke/Stack Overflow/"+loggerName+"_created.log", "false", "false", "File", "true",
                "false", "false", "4000", layout, null, "false", null, config);
        appender.start();
        config.addAppender(appender);
        AppenderRef ref = AppenderRef.createAppenderRef(loggerName+"ref", Level.ALL, null);
        AppenderRef[] refs = new AppenderRef[] {ref};
        LoggerConfig loggerConfig = LoggerConfig.createLogger("false", Level.ALL, loggerName,
                "true", refs, null, config, null );
        loggerConfig.addAppender(appender, null, null);
        config.addLogger(loggerName, loggerConfig);
        ctx.updateLoggers();

        return LogManager.getLogger(loggerName);
    }
}

CLASSPATH环境变量仅包含当前目录 和log4j2 JARslog4j-api-2.5。jar和log4j-core-2.5。jarlog4j2的副本。xml文件位于同一目录中。

当我运行这个类时,我得到了以下输出

2016-02-13 13:49:32,228 main WARN The bufferSize is set to 4000 but bufferedIO is not true: false

已创建测试。日志文件仅包含以下行:

2016-02-13 13:49:32,235 [main] INFO Test - This is a test line

 类似资料:
  • 我在我的项目中使用log4j2,如下所示: 我的配置文件如下所示: 它创建了我的文件,我在其中记录了一些东西,但它仍然是空的。当我试图删除这个文件时,操作系统告诉我它正在使用中(若应用程序正在工作),但即使我停止应用程序,文件仍然是空的。 那么,我应该更改哪些设置以使其正常工作?

  • 问题内容: 我正在使用logback,并且尝试在Java程序中以编程方式设置日志文件名(类似于以编程方式设置LogbackAppender路径),并且我尝试按以下方法调整该解决方案: 在logback-test.xml中: 然后再次在我的Java程序中: 但是结果是两个日志,一个完整并按我的意愿命名,例如“ 1319041145343.log”,另一个为空并命名为“ log_file_name_I

  • 问题内容: 我有一个自动化的集成测试工具,想简化日志记录(使用log4j实现) 我有许多高级测试,每个测试都有一个ID,并且每个测试都需要一个 单独的 日志文件。由于测试是随机创建的,因此直到运行时才知道ID。 因此,我想确保将每个高级测试中的日志记录写到该测试的日志文件中。 我不想创建自定义日志级别,也不想将日志发送到所有附加程序。 有人知道这样做的方法吗? 问题答案: 您可以轻松地以编程方式调

  • 1)我想每天使用log4j2.xml.生成日志文件,我使用RollingFile appender标记来实现同样的功能。但是,它将日志附加在同一文件上。 2)下面是我们在log4j.xml中使用的类别标签,我想知道在log4j2.xml中类别标签的等价物是什么? 3) 如何使用log4j2中的所有属性定义snmptrappender?

  • 我希望由log4j2创建的日志文件在其文件名中包含日期模式,包括当前活动文件。也就是说,如果今天的日期是2016-12-15,我希望当前日志文件是lager-2016-12-15.log。当日期改变时,我希望创建一个名为lager-2016-12-16.log的新文件。 使用,我无法使当前活动日志文件的文件名中具有日期模式。我的log4j2.xml: 使用此配置,翻转时的复制被搞乱了。从fileN