我RollingRandomAccessFileAppender只配置了一个OnStartupTriggeringPolicyset,但是当我将max属性设置DefaultRolloverStrategy为某个数字时,日志会无限期地生成超过该数量.
这是我的log4j2.xml:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
<RollingRandomAccessFile
name="RollingRAF"
fileName="logs/app.log"
filePattern="logs/app-%d{dd-MMM-yyyy@HH.mm.ss}.log">
<PatternLayout>
<Pattern>%d %p %c{1.} %m%n</Pattern>
</PatternLayout>
<Policies>
<OnStartupTriggeringPolicy />
</Policies>
<DefaultRolloverStrategy max="5"/>
</RollingRandomAccessFile>
</Appenders>
<Loggers>
<Logger name="myLogger" level="warn">
<AppenderRef ref="RollingRAF"/>
</Logger>
<Root level="error">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
Run Code Online (Sandbox Code Playgroud)
是因为我的名字模式中没有迭代器吗?
是因为我的文件名精度设置为秒?
是因为我只有OnStartupTriggeringPolicy这套?
或者这里发生了什么?
我的目标是设置滚动配置,记录最近5次应用程序运行.
所述文档为log4j2配置提供了一个很好的示例XML相当于默认配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
</Appenders>
<Loggers>
<Root level="error">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
Run Code Online (Sandbox Code Playgroud)
等效文件看起来像(有效)YAML?
在我的Spring Boot 2项目中:
在build.gradle:
dependencies {
implementation 'com.google.code.gson:gson:2.7'
implementation 'com.h2database:h2'
implementation 'javax.servlet:jstl:1.2'
implementation 'org.springframework.boot:spring-boot-devtools'
implementation('org.springframework.boot:spring-boot-starter') {
exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging'
}
implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-log4j2'
implementation 'org.springframework.boot:spring-boot-starter-jdbc'
implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation "org.springframework.boot:spring-boot-starter-web"
testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
}
testImplementation 'org.junit.jupiter:junit-jupiter:5.5.2'
}
Run Code Online (Sandbox Code Playgroud)
在src/resources/log4j2.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration debug="true" xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender name="Console"
class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<!-- l, L, M - is extremely slow. It's use …Run Code Online (Sandbox Code Playgroud) 我正在使用log4j 2.0-rc1和log4j.propertiesfile 运行一个示例,但是log4j lib总是使用默认配置(日志级别,appender等)运行它.我也尝试过更改名称log4j2.properties,但没有任何反应.
我有一个使用log4j2编写的新应用程序,以利用它的一些新功能.它使用的其中一个库有点旧,用log4j 1.x构建.我遇到一个问题,即应用程序中的新代码写入日志,但旧库中的代码不会写入日志.我甚至有一个类是旧库中某个东西的子类,也是旧库中的代码调用,这个代码也不会写入日志.我已将应用程序配置为使用log4j2版本2.0.2,并且在将旧库引用为maven依赖项时明确排除了log4j.
如何让旧库中的代码登录到与我的新代码相同的文件中?
重写旧库应该被认为是最后的选择
我已将我的应用程序迁移到log4j 2,并且我已通过log4j2.xml进行了配置
但是,我使用的一些库依赖于log4j 1.如果我使用以下命令运行应用程序:
-Dlog4j.configurationFile=path/to/log4j2.xml
Run Code Online (Sandbox Code Playgroud)
log4j 1抱怨找不到配置文件.我正在使用log4j 2,log4j-1.2-api-2.0-rc1.jar提供的log4j 1.x桥.是否可以使用单个log4j2.xml进行配置?
我尝试过的另一种方法是将log4j和log4j2配置在一起:
-Dlog4j.configurationFile=path/to/log4j2.xml -Dlog4j.configuration=path/to/log4j.xml
Run Code Online (Sandbox Code Playgroud)
我担心的是我的日志配置文件和输出的碎片.我也担心log4j.xml和log4j2.xml之间可能存在冲突.例如,logfile error.log配置为使用log4j 1中的FileAppender和log4j 2中的RollingFileAppender.
有什么建议?
[注意]
这是我看到的错误:
log4j:WARN No appenders could be found for logger (org.apache.activemq.util.ThreadPoolUtils).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
Run Code Online (Sandbox Code Playgroud)
我正在使用的log4j 2的版本是log4j 2.0 rc1.
[回答]
似乎activemq-5.8.0.jar与log4j 1捆绑在一起.解决方案只是在activemq之前加载log4j 1.x桥.
所以我尝试在他们的网站上遵循这个(非maven实现)和要求,将slf4j添加到log4j.并尝试使用此代码
public static void main(String[] args) {
Logger logger = LoggerFactory.getLogger(Main.class);
logger.info("test");
}
Run Code Online (Sandbox Code Playgroud)
并将以下内容添加到我的库中
当我尝试运行它时,我收到以下错误
Exception in thread "main" java.lang.StackOverflowError
at java.util.concurrent.ConcurrentHashMap.get(ConcurrentHashMap.java:936)
at java.util.concurrent.ConcurrentHashMap.containsKey(ConcurrentHashMap.java:964)
at org.apache.logging.slf4j.SLF4JLoggerContext.getLogger(SLF4JLoggerContext.java:40)
at org.apache.logging.slf4j.Log4jLoggerFactory.newLogger(Log4jLoggerFactory.java:37)
at org.apache.logging.slf4j.Log4jLoggerFactory.newLogger(Log4jLoggerFactory.java:29)
at org.apache.logging.log4j.spi.AbstractLoggerAdapter.getLogger(AbstractLoggerAdapter.java:47)
at org.apache.logging.slf4j.Log4jLoggerFactory.getLogger(Log4jLoggerFactory.java:29)
at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:284)
at org.apache.logging.slf4j.SLF4JLoggerContext.getLogger(SLF4JLoggerContext.java:41)
at org.apache.logging.slf4j.Log4jLoggerFactory.newLogger(Log4jLoggerFactory.java:37)
at org.apache.logging.slf4j.Log4jLoggerFactory.newLogger(Log4jLoggerFactory.java:29)
at org.apache.logging.log4j.spi.AbstractLoggerAdapter.getLogger(AbstractLoggerAdapter.java:47)
at org.apache.logging.slf4j.Log4jLoggerFactory.getLogger(Log4jLoggerFactory.java:29)
at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:284)...
Run Code Online (Sandbox Code Playgroud)
知道我哪里错了吗?
我知道AsyncAppender在一个单独的线程中执行附加作业.他们为此目的使用ArrayBlockingQueue.
和
AsyncLogger使用LMAX disruptor库将日志记录事件从一个应用程序线程移动到另一个线程,并且它与AsyncAppender一起更快.
我的问题是为什么我们在log4j2中有AsyncAppender,如果它所做的工作是由AsyncLogger更有效地实现的.
如果我们将AsyncAppender与AsyncLogger一起使用怎么办?AsyncLogger和AsyncAppender之间是否还有其他差异?
如何log4j 2.3以console appender编程方式配置纯(没有任何格式的配置文件)?
基本上我正在寻找这个1.x代码的 2.x版本.
在我的课程中,我会使用
private static final Logger logger = LogManager.getLogger();
//
// some method
logger.debug(someString);
Run Code Online (Sandbox Code Playgroud)
没有任何配置,我(正如预期)面对
错误StatusLogger找不到log4j2配置文件.使用默认配置:仅将错误记录到控制台.
虽然配置文件的使用似乎得到了适当的记录,但我找不到一个只有裸机代码的好例子.
我得到的最接近的是这篇文章仍然使用虚拟文件.
这是我最好的(虽然完全不成功)拍摄:
private static void configureLog4J() {
PatternLayout layout = PatternLayout.createDefaultLayout();
ConsoleAppender appender = ConsoleAppender.createDefaultAppenderForLayout(layout);
LoggerConfig loggerConfig = new LoggerConfig();
loggerConfig.addAppender(appender, DEBUG, null);
}
Run Code Online (Sandbox Code Playgroud)
我错过了什么吗?
如果它仍然是RTFM案例,请指出我正确的方向.
我在我的项目中使用log4j2和slf4j并使用maven进行构建.我正在使用以下pom文件(仅显示相关的依赖项),但我收到下面复制的错误与此pom文件 - 任何想法我需要添加/删除以使其工作.我已经访问了错误中的url以及log4j2依赖项页面,因此请不要只指向响应中的URL.
信息:
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Run Code Online (Sandbox Code Playgroud)
pom文件
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<slf4j.version>1.7.7</slf4j.version>
</properties>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>com.lmax</groupId>
<artifactId>disruptor</artifactId>
<version>3.2.0</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.0.1</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.0.1</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
更新: 我在我的pom文件中添加了以下依赖项,我在mavenrepository中看到了jar - 虽然我在运行mvn clean/install时仍然看到相同的消息
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.0.1</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)