有没有办法log4j2.xml手动指定Log4J 2.x 文件位置(如DOMConfigurator在Log4J 1.x中),而不会弄乱类路径和系统属性?
我收到了错误
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/C:/Users/george/.gradle/caches/artifacts-26/filestore/org.apache.logging.log4j/log4j-slf4j-impl/2.0-beta8/jar/15984318e95b9b0394e979e413a4a14f322401c1/log4j-slf4j-impl-2.0-beta8.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/C:/Users/george/.gradle/caches/artifacts-26/filestore/org.slf4j/slf4j-log4j12/1.5.0/jar/aad1074d37a63f19fafedd272dc7830f0f41a977/slf4j-log4j12-1.5.0.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
Run Code Online (Sandbox Code Playgroud)
在我的build.gradle文件中,我有以下行包含jar log4j-slf4j-impl-2.0-beta8.jar(我想绑定到LOG4J2)
compile 'org.apache.logging.log4j:log4j-slf4j-impl:2.0-beta8'
Run Code Online (Sandbox Code Playgroud)
在依赖项目中的另一个build.gradle文件中,我有多行类似于以下内容:
compile 'dcm4che:dcm4che-core:2.0.23'
Run Code Online (Sandbox Code Playgroud)
现在dcm4che包含对log4j版本1(slf4j-log4j12)的依赖,因此它包含在整个项目中.
以下是Gradle依赖关系树的片段:
| +--- dcm4che:dcm4che-core:2.0.23
| | \--- org.slf4j:slf4j-log4j12:1.5.0
| | +--- org.slf4j:slf4j-api:1.5.0 -> 1.7.5
| | \--- log4j:log4j:1.2.13 -> 1.2.14
Run Code Online (Sandbox Code Playgroud)
我已经阅读了警告中建议的链接 ,但我无法弄清楚如何使用我想要的jar将我的应用程序绑定到log4j2.关于依赖管理的Gradle文档并没有真正使它更清楚.
我的log4j2日志文件始终具有每行的双倍输出.我怎么能停止复制呢?
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<properties>
<property name="name">CernerPharmacyWebApp</property>
<property name="pattern">%d %-5p %C{2} (%F:%L) - %m%n</property>
</properties>
<Appenders>
<Console name="CONSOLE" target="SYSTEM_OUT">
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout><pattern>${pattern}</pattern></PatternLayout>
</Console>
<RollingFile name="ROLLING_FILE" fileName="..\logs\${name}.log"
filePattern="..\logs\${name}-%d{yyyy-MM-dd}-%i.log">
<PatternLayout><pattern>${pattern}</pattern></PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy/><!-- Rotated everyday -->
<SizeBasedTriggeringPolicy size="50 MB"/> <!-- Or every 50 MB -->
</Policies>
</RollingFile>
</Appenders>
<Loggers>
<Root level="error">
<!-- <AppenderRef ref="CONSOLE"/> -->
<AppenderRef ref="ROLLING_FILE"/>
</Root>
<!-- Controls packages -->
<Logger name="com.jarmel.pharmacy.controls.BarCodeOrderServlet" level="trace">
<!-- <AppenderRef ref="CONSOLE"/> -->
<AppenderRef ref="ROLLING_FILE"/>
</Logger>
<Logger name="com.jarmel.pharmacy.controls.GetCodeValues" level="error">
<!-- <AppenderRef ref="CONSOLE"/> --> …Run Code Online (Sandbox Code Playgroud) 我想动态创建一个appender并将其添加到记录器.但是,这似乎不可能与slf4j.我可以将我的appender添加到log4j记录器,但后来我无法使用slf4j LoggerFactoy检索记录器.
我想做什么:我创建一个测试类(不是jUnit测试)并在构造函数中传递一个记录器供测试类使用.测试类的每个实例都需要它自己的记录器和追加器来保存日志,以便以后可以在HTML报告中使用它.
我尝试了什么(为简单起见,我创建了一个jUnit测试):
import static org.junit.Assert.assertEquals;
import java.util.LinkedList;
import java.util.List;
import org.apache.logging.log4j.core.LogEvent;
import org.junit.Test;
import org.slf4j.helpers.Log4jLoggerFactory;
import ch.fides.fusion.logging.ListAppender;
public class ListAppenderTest {
@Test
public void test() {
String testName = "test1";
// the log messages are to be inserted in this list
List<LogEvent> testLog = new LinkedList<>();
// create log4j logger
org.apache.logging.log4j.core.Logger log4jlogger = (org.apache.logging.log4j.core.Logger) org.apache.logging.log4j.LogManager
.getLogger("Test:" + testName);
// create appender and add it to the logger
ListAppender listAppender = new ListAppender("Test:" + testName + ":MemoryAppender", testLog);
log4jlogger.addAppender(listAppender); …Run Code Online (Sandbox Code Playgroud) 我正在使用spring-boot-starter,并希望配置log4j2.xml为将异步+不同的内容记录到不同的日志文件.
我创建了log4j2文件,但Spring仍然使用spring-boot默认日志记录.如何切换日志记录?
我没有使用任何XML配置文件,而是以编程方式设置记录器配置.记录器工作正常但是当我调用下面代码的第一行时,会ERROR显示一条警告消息,告诉我找不到配置文件,将使用默认配置.
但是我不希望每次打开程序时都会在控制台上显示此消息,因为我将以编程方式自行添加配置.
消息:
ERROR StatusLogger No log4j2 configuration file found. Using default configuration: logging only errors to the console.
Run Code Online (Sandbox Code Playgroud)
当我调用下面的代码时,它会出现:
LoggerContext context = (LoggerContext) LogManager.getContext(false);
Run Code Online (Sandbox Code Playgroud)
或者如果我先获得根记录器:
Logger logger = LogManager.getLogger(LogManager.ROOT_LOGGER_NAME);
Run Code Online (Sandbox Code Playgroud)
是否有某种属性可以设置为禁用此消息显示?还是另一种方法?
注意:我通过设置属性禁用了有关Log4j2 JMX的其他通知-Dlog4j2.disable.jmx=true.但我找不到这个.
我将log4j2.xml配置文件设置为每30秒检查一次:
<Configuration status="WARN" monitorInterval="30">
...
</Configuration>
Run Code Online (Sandbox Code Playgroud)
是否有可能以编程方式告诉log4j2检查配置中的更改而不是超时?
NB我不想以编程方式加载指定配置文件的配置,我只想告诉log4j2检查之前加载的配置文件,就好像monitorInterval已过期一样.
谢谢!
Log4j2与Spring Boot通过log4j2.xml根类路径中的配置文件很好地协同工作,正如文档所述.
当尝试将此文件移动到其他位置时,我无法在启动时将新位置传递给Spring.从文档:
可以通过在类路径中包含适当的库来激活各种日志记录系统,并通过在类路径的根目录中或在Spring Environment属性指定的位置
logging.config提供合适的配置文件来进一步自定义.
我尝试使用Java系统属性设置新位置
java -jar -Dlogging.config="classpath:/config/log4j2.xml" target/app.jar
Run Code Online (Sandbox Code Playgroud)
或使用application.properties包含相关财产的外部
logging.config=classpath:/config/log4j2.xml
Run Code Online (Sandbox Code Playgroud)
但我经常受到以下错误消息的欢迎.
ERROR StatusLogger No log4j2 configuration file found. Using default configuration: logging only errors to the console.
Run Code Online (Sandbox Code Playgroud) 这是我第一次遇到这个问题,我在 Linux 和 Mac 上使用本地 DynamoDB 并且大部分时间它都运行良好,现在我在另一台 Mac 机器上,它只是抛出一个错误。
我得到的错误信息是:
ERROR StatusLogger Log4j2 could not find a logging implementation.
Please add log4j-core to the classpath. Using SimpleLogger to log to the console...
Run Code Online (Sandbox Code Playgroud)
我尝试通过自制软件安装它,但它抛出了同样的错误。我可能在我的机器上搞砸了一些东西,或者可能错过了一些配置。
下面是我尝试运行它时的屏幕截图:
参考:
Dynamo DB 本地:https : //docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBLocal.html
我正在开发一个Eclipse RCP应用程序,并且已经付出了一些努力让log4j2在应用程序中运行.现在一切似乎工作正常,作为画龙点睛,我想让所有记录器异步.
我已经设法在类路径上获得LMAX Disruptor,并认为我已经解决了提供的问题sun.misc.-DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector在运行配置中设置VM参数,并正确设置log4j2.xml文件.我想.这就是问题所在.我希望能够以正确的方式验证我的应用程序以异步方式记录,因此我可以享受延迟方面的好处.
我怎么能 - 然后 - 在过程中利用LMAX Dirsuptor验证我的记录器是否异步工作?
log4j2 ×10
java ×9
log4j ×6
logging ×6
slf4j ×2
spring-boot ×2
asynchronous ×1
gradle ×1
spring ×1