我有一个用例,我必须为我的所有记录器使用不同的文件名,我正试图在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
我将感谢任何帮助。
定义AppenderRef时出错:
AppenderRef ref = AppenderRef.createAppenderRef(loggerName+"ref", Level.ALL, null);
第一个参数是追加器的名称。您正在创建名为“File”的FileAppender,因此应创建AppenderRef:
AppenderRef ref = AppenderRef.createAppenderRef("File", Level.ALL, null);
对不起,我无法复制这个。
在调整文件名后,我使用了以下类,其中包含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 JARs
log4j-api-2.5。jar和log4j-core-2.5。jar
。log4j2的副本。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