我现在花了几个小时试图解决这个问题并完全失败.我发现新的配置过程不必要地复杂.
我有一个带有web.xml文件的Servlet,其中包含以下内容:
<context-param>
<param-name>log4jConfiguration</param-name>
<param-value>file:///etc/myApp/log4j2.xml</param-value>
</context-param>
Run Code Online (Sandbox Code Playgroud)
它似乎没有任何影响.我使用的是Tomcat 7.0.42,我已经删除了catalina.properties文件中对log4j*.jar的所有引用.我的应用程序中的日志仍在发送,但它们只是被发送到System.out而没有我指定的格式.
所以,我试着亲自手工完成:
InputStream in =
new FileInputStream(new File("/etc/myApp/log4j2.xml"));
ConfigurationSource source = new ConfigurationSource(in);
ConfigurationFactory factory = new XMLConfigurationFactory();
Configuration configuration = factory.getConfiguration(source);
LoggerContext context = (LoggerContext) LogManager.getContext();
context.start(configuration);
context.updateLoggers();
Logger.getLogger("Test").log(Level.INFO, "This is a logging message.");
Run Code Online (Sandbox Code Playgroud)
首先,这似乎完全令人费解.显然,存在一些代码将通过"log4jConfiguration"属性搜索不同的文件并基于其扩展来假设文件类型,那么为什么不LogManger.reconfigure(String)具有相同的效果呢?
其次,这也没有效果.同样,日志将打印到System.out,并且没有执行任何请求的格式.
这是我的log4j2.xml的内容:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="DEBUG">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
<File name="LogFile" fileName="/var/log/myApp/myApp.log">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %p %c{1.} [%t] %m%n"/>
</File>
</Appenders>
<Loggers>
<Root level="DEBUG">
<AppenderRef …Run Code Online (Sandbox Code Playgroud) Log4j2 是否支持像 Logback 那样的文件包含机制?这是为了包含来自另一个文件的配置文件的一部分(包含附加程序、记录器等)
仅供参考 - 以下是它在 Logback 中的工作方式:
Joran 支持从另一个文件中包含部分配置文件。这是通过声明一个元素来完成的,如下所示:
示例:文件包含(logback-examples/src/main/java/chapters/configuration/ containsConfig.xml)
<configuration>
<include file="src/main/java/chapters/configuration/includedConfig.xml"/>
<root level="DEBUG">
<appender-ref ref="includedConsole" />
</root>
Run Code Online (Sandbox Code Playgroud)
目标文件必须将其元素嵌套在一个元素内。例如,可以将 ConsoleAppender 声明为:
示例:文件包含(logback-examples/src/main/java/chapters/configuration/includedConfig.xml)
<included>
<appender name="includedConsole" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>"%d - %m%n"</pattern>
</encoder>
</appender>
</included>
Run Code Online (Sandbox Code Playgroud) 一位同事从Log4J 2.3代码中指出了以下片段:
/**
* Called to determine if the configuration has changed.
*/
@Override
public void checkConfiguration() {
final long current = System.currentTimeMillis();
if (((counter.incrementAndGet() & MASK) == 0) && (current >= nextCheck)) {
LOCK.lock();
try {
nextCheck = current + intervalSeconds;
if (file.lastModified() > lastModified) {
lastModified = file.lastModified();
for (final ConfigurationListener listener : listeners) {
final Thread thread = new Thread(new ReconfigurationWorker(listener, reconfigurable));
thread.setDaemon(true);
thread.start();
}
}
} finally {
LOCK.unlock();
}
}
Run Code Online (Sandbox Code Playgroud)
哪里counter是一个 …
我正在尝试设置log4j2 xml配置,但我没有得到我想要的结果.我希望我的控制台获得级别信息及以上,以及滚动文件appender(标准)以获得级别调试及以上.然后我想限制控制台appender中的3个类只接收警告及以上.但是,当我添加这些记录器条目时,我的标准appender也会停止接收这3个类的信息和调试级别.我该怎么办才能限制控制台而不是标准?
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender name="console" class="org.apache.log4j.ConsoleAppender">
<param name="Target" value="System.out"/>
<param name="threshold" value="info" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{ABSOLUTE} %-5p %c [%t] %X{ctx} ~ %m%n" />
</layout>
</appender>
<appender name="standard" class="org.apache.log4j.DailyRollingFileAppender">
<param name="file" value="logs/broadcast.log" />
<param name="DatePattern" value="'.'yyyy-MM-dd" />
<param name="threshold" value="debug" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{DATE} %-5p %c{1} [%t] %X{ctx} ~ %m%n" />
</layout>
</appender>
<appender name="stderr" class="org.apache.log4j.FileAppender">
<param name="file" value="logs/broadcast.err" />
<param name="threshold" value="error" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{DATE} …Run Code Online (Sandbox Code Playgroud) 我正在尝试为 log4j 2.0 创建自定义模式转换器,但在让我的 log4j 配置识别模式时遇到问题。这是自定义转换器:
package com.test.log4j.plugins;
import org.apache.logging.log4j.Marker;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.config.plugins.Plugin;
import org.apache.logging.log4j.core.pattern.ConverterKeys;
import org.apache.logging.log4j.core.pattern.LogEventPatternConverter;
@Plugin(name="MarkerNamePatternConverter", category="Converter")
@ConverterKeys({"markername"})
public class MarkerNamePatternConverter extends LogEventPatternConverter {
public static MarkerNamePatternConverter newInstance(final String[] options) {
return new MarkerNamePatternConverter("markername", "markername");
}
protected MarkerNamePatternConverter(String name, String style) {
super(name, style);
}
@Override
public void format(LogEvent event, StringBuilder toAppendTo) {
Marker marker = event.getMarker();
if (marker != null) {
// MarkerPatternConverter appends Marker.toString()
// which includes the parents of the marker. We just
// …Run Code Online (Sandbox Code Playgroud) 是否可以将System.out(OutputStream)直接写入日志文件,如"旧"log4j?
我只找到log4j的解决方案,而不是log4j2
谢谢你的帮助!
刚开始进入Graylog2并希望通过GELF输入记录一些Java应用程序.因此我使用了库log4j2并添加了graylog2-gelfclient.所有依赖项都得到满足并且程序正在运行.但是我的Logmanager初始化会引发以下错误:
ERROR StatusLogger appenders contains an invalid element or attribute "GELF"
Run Code Online (Sandbox Code Playgroud)
我的代码只是将错误记录到记录器:
static final Logger logger = LogManager.getLogger(Application.class);
public static void main(String[] args) {
logger.error("This is an error log entry");
}
}
Run Code Online (Sandbox Code Playgroud)
我的log4j2.xml文件配置为使用GELF和GelfAppender:
<configuration status="OFF">
<appenders>
<GELF name="gelfAppender" server="192.168.1.1" port="12201" hostName="myhost"/>
</appenders>
<loggers>
<root level="info">
<appender-ref ref="gelfAppender"/>
</root>
</loggers>
</configuration>
Run Code Online (Sandbox Code Playgroud)
有人熟悉这个问题吗?谢谢你的帮助.
我们使用log4j 1.2.x登录我们的产品,并希望在不久的将来迁移到log4j 2.x. 我们实现的功能之一是在生成的每个新的翻转日志文件上记录系统信息和其他重要参数.我们在log4j 1.2.x中实现的方式是我们有扩展RollingFileAppender的log4j类并覆盖了rollOver()方法,下面是实现的部分片段
@Override
public void rollOver() {
super.rollOver(); //We are not modifying it's default functionality but as soon as rollOver happens we apply our logic
//
// Logic to log required system properties and important parameters.
//
}
Run Code Online (Sandbox Code Playgroud)
现在我们想要迁移到log4j2,我们正在寻找一种新的解决方案来实现相同的功能.但是当我看到log4j2的源代码时,它与旧的源代码非常不同.本RollingFileAppender类不包含rollover(),因为它已经被移动到方法RollingManagerhelper,它已经被设置为private为井.
开发一个完整的新包并从log4j2扩展/实现一些抽象/辅助类是我们可能的解决方案之一,但这需要大量编码/复制,因为我们不修改什么RollingFileAppender,而只需要对它进行小扩展.有一个简单的解决方案吗?
UPDATE
我根据答案中的建议创建了自定义查找,下面是我创建它的方式;
@Plugin(name = "property", category = StrLookup.CATEGORY)
public class CustomLookup extends AbstractLookup {
private static AtomicLong aLong = new AtomicLong(0);
@Override
public …Run Code Online (Sandbox Code Playgroud) 我通过设置使用Log4J2"使所有记录器异步"部分:
-DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector.
Run Code Online (Sandbox Code Playgroud)
https://logging.apache.org/log4j/2.x/manual/async.html
我处理了很多日志,然后在退出之前停止了appender:
org.apache.logging.log4j.core.Logger coreLogger = (org.apache.logging.log4j.core.Logger) logger;
org.apache.logging.log4j.core.LoggerContext context = (org.apache.logging.log4j.core.LoggerContext) coreLogger.getContext();
Map<String, Appender> appenders = context.getConfiguration().getAppenders();
for (Appender appender : appenders.values()) {
appender.stop();
}
Run Code Online (Sandbox Code Playgroud)
通过这样做,我希望它将刷新异步appender并在退出程序之前将剩余的日志写入磁盘.
但这是发生的事情:
2015-05-19 14:09:58,540 ERROR Attempted to append to non-started appender myFileAppender
Exception in thread "AsyncLogger-1" java.lang.RuntimeException: org.apache.logging.log4j.core.appender.AppenderLoggingException: Attempted to append to non-started appender myFileAppender
at com.lmax.disruptor.FatalExceptionHandler.handleEventException(FatalExceptionHandler.java:45)
at com.lmax.disruptor.BatchEventProcessor.run(BatchEventProcessor.java:147)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Caused by: org.apache.logging.log4j.core.appender.AppenderLoggingException: Attempted to append to non-started appender myFileAppender
at org.apache.logging.log4j.core.config.AppenderControl.callAppender(AppenderControl.java:89)
at org.apache.logging.log4j.core.config.LoggerConfig.callAppenders(LoggerConfig.java:430)
at org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:409)
at org.apache.logging.log4j.core.Logger$PrivateConfig.logEvent(Logger.java:288) …Run Code Online (Sandbox Code Playgroud) 有人可以帮我设置log4j2.properties中的rolloverstrategy吗?我把它设置为 -
#Appender
appender.test.type=RollingFile
appender.test.name=test
appender.test.fileName=${logPath}/test.log
appender.test.filePattern = ${logPath}/test-%i.log
appender.test.layout.type=PatternLayout
appender.test.layout.pattern=%d{ISO8601} %-5p [%t] %m%n
appender.test.policies.type=Policies
appender.test.policies.size.type=SizeBasedTriggeringPolicy
appender.test.policies.size.size=1MB
appender.test.strategies.type=Strategies
appender.test.strategies.rollover.type=DefaultRolloverStrategy
appender.test.strategies.rollover.max=5
Run Code Online (Sandbox Code Playgroud)
我写了这个咨询https://logging.apache.org/log4j/2.x/manual/configuration.html#ConfigurationSyntax
我没有找到任何实现翻转策略的东西,你上面看到的是我认为会起作用的.但不幸的是,显然它没有.
这是错误:
2015-11-09 13:30:42,175 localhost-startStop-1 ERROR Unable to locate plugin for Strategies
Run Code Online (Sandbox Code Playgroud)