我尝试在应用程序中使用 log4j2 来允许在运行时动态重新配置日志级别。但我无法成功让 MonitorInterval 工作。控制台和文件附加程序工作正常。这是我的 log4j2.xml,
<?xml version="1.0" encoding="UTF-8"?>
<Configuration monitorInterval="5">
<Appenders>
<Console name="consoleAppender" target="SYSTEM_OUT">
<PatternLayout pattern="%d %-5p [%t] %C{2} (%F:%L) - %m%n"/>
</Console>
<File name="fileAppender" fileName="learning.log" append="true">
<PatternLayout pattern="%t %-5p %c{2} - %m%n"/>
</File>
</Appenders>
<Loggers>
<Root level="error">
<!-- <AppenderRef ref="consoleAppender"/>-->
<AppenderRef ref="fileAppender"/>
</Root>
</Loggers>
</Configuration>
Run Code Online (Sandbox Code Playgroud)
请帮忙查找问题。谢谢!
有没有办法在 log4j2 中编写自定义 RolloverStrategy?我想删除超过 14 天的旧文件,而 log4j2 目前不支持它(https://issues.apache.org/jira/browse/LOG4J2-524)。
我编写了一个自定义策略并尝试实现 RolloverStrategy 接口,但我没有看到它在文件翻转时被触发。
如何获取 log4j 日志文件的位置?我试过这个:我可以在哪里以编程方式找到 log4j 日志文件的存储位置?
但它不适用于较新版本的 log4j。
我正在创建包含系统日期的文件,但是当我检索路径时,时间戳会发生变化。
我正在尝试使所有 Log4J 2 记录器与 IMAP Disruptor 异步。我正确设置了干扰器依赖项,并且在 IntelliJ 中,我在 VM 选项下设置了以下系统属性。
-DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector
Run Code Online (Sandbox Code Playgroud)
我的 log4j2.xml 文件是这样的。
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="trace">
<Appenders>
<Console name="Console-Appender" target="SYSTEM_OUT">
<PatternLayout>
<pattern>
[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n
</pattern>>
</PatternLayout>
</Console>
<File name="File-Appender" fileName="logs/xmlfilelog.log" >
<PatternLayout>
<pattern>
[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n
</pattern>
</PatternLayout>
</File>
</Appenders>
<Loggers>
<Logger name="guru.springframework.blog.log4j2async" level="debug">
<AppenderRef ref="File-Appender"/>
</Logger>
<Root level="debug">
<AppenderRef ref="Console-Appender"/>
</Root>
</Loggers>
</Configuration>
Run Code Online (Sandbox Code Playgroud)
我的记录器类有这个代码。
package guru.springframework.blog.log4j2async;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class Log4J2AsyncLogger {
private static …Run Code Online (Sandbox Code Playgroud) 我的 log4j2 具有这样设置的默认翻转策略 -
<RollingFile name="RollingFile" fileName="cc" filePattern="logs/${baseFileName}-%d{yyyy-MM-dd}.log.gz">
<PatternLayout>
<pattern>%d{dd/MMM/yyyy HH:mm:ss,SSS}- %c{1}: %m%n</pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true" />
</Policies>
<DefaultRolloverStrategy>
<Delete basePath="logs/">
<IfFileName glob="logs/${baseFileName}-*.log" />
<IfLastModified age="2d" />
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
Run Code Online (Sandbox Code Playgroud)
所以当它超过 2 天时应该删除最旧的文件吗?
我的日志文件存储在项目的基本路径中名为 logs..的文件夹中。
但是我只是做了一个测试运行,它在我停止之前得到了 5 个文件......
知道是什么原因造成的吗?
我正在使用 log4j2 并尝试使用 log-rotation 进行记录。具体来说,我想以 10MB 的最大大小登录并无限制地旋转。下面的配置生成了 3 代滚动文件,因为“DefaultRolloverStrategy max”设置为 3。请指导我如何以 10MB 的最大大小记录无限数量的文件?
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
<Properties>
<Property name="format1">%m%n</Property>
<Property name="logfile">${sys:logDirectory}/log.log</Property>
<Property name="logfile-archive">${sys:logDirectory}/log_%d{yyyy-MM-dd}.%i.log
</Property>
</Properties>
<Appenders>
<RollingFile name="logfile001" append="true" fileName="${logfile}"
filePattern="${logfile-archive}">
<PatternLayout>
<pattern>${format1}</pattern>
</PatternLayout>
<Policies>
<SizeBasedTriggeringPolicy size="10MB" />
</Policies>
<DefaultRolloverStrategy max="3" />
</RollingFile>
</Appenders>
<Loggers>
<Root level="trace">
<AppenderRef ref="logfile001" />
</Root>
</Loggers>
</Configuration>
Run Code Online (Sandbox Code Playgroud) 我想以记录所有没有标记的消息的方式配置 log4j2。仅当配置文件中有此标记的特殊 ACCEPT 规则时,才应记录所有带有标记的消息。
我没有找到任何可以检测“无标记集”情况的过滤规则。有没有或者我必须自己实施?
log4j2 配置的过滤器部分可能类似于以下示例,但NoMarkerFilter语句应捕获未设置标记的情况。
<Filters>
<MarkerFilter marker="SQL_UPDATE" onMatch="ACCEPT" onMismatch="NEUTRAL" />
<NoMarkerFilter onMatch="ACCEPT" onMismatch="DENY" />
</Filters>
Run Code Online (Sandbox Code Playgroud) 我正在使用 SystemPropertiesLookup 查找来配置我的 Log4J2 配置。系统属性设置为我的主要方法中的第一行。问题是,Log4J加载配置的时候,main方法还没有调用,所以系统属性也没有填写。
这是我的 log4j2.xml:
<?xml version="1.0" encoding="UTF-8"?>
<configuration status="WARN" packages="org.base">
<appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%highlight{%d [%c{1}] %-5level: %msg%n}{STYLE=Logback}"/>
</Console>
<File name="AppLog" fileName="logs/app-${sys:MIGRATION_ENV:-UNKNOWN}-${sys:MIGRATION_TITLE:-UNKNOWN}.log" append="false">
<PatternLayout pattern="%d [%c{1}] %-5level: %msg%n"/>
</File>
</appenders>
<loggers>
<root level="error">
<appender-ref ref="Console" level="error"/>
<appender-ref ref="AppLog" level="error"/>
</root>
<logger name="org.base" level="debug" additivity="false">
<appender-ref ref="Console" level="debug"/>
<appender-ref ref="AppLog" level="debug"/>
</logger>
</loggers>
</configuration>
Run Code Online (Sandbox Code Playgroud)
该文件将被称为 app-UNKNOWN-UNKNOWN,因为当 Log4J 填充它时,属性尚不可用。
有没有办法让 Log4J 等待,最好不要将配置移动到 Java 代码?
这些属性必须在运行时设置(main 方法的第一行)。
一个可能的解决getLogger(..)方法是只在该方法之后调用,而不是用变量初始化它,但它并不真正适合我的任务。
我用 Gradle 和 Kotlin DSL 构建脚本构建了一个新的 IntelliJ 项目,只有 Kotlin (Java) 和 Java 版本 10.0.2 作为项目 SDK。
我将 log4j 的依赖项添加到 build.gradle.kts 中:
compile("org.apache.logging.log4j:log4j-api:2.11.1")
compile("org.apache.logging.log4j:log4j-core:2.11.1")
Run Code Online (Sandbox Code Playgroud)
我将一个 log4j2.yaml 文件放入 /src/main/resources 并进行了一些配置。
当我现在运行这个测试程序时:
import org.apache.logging.log4j.LogManager
fun main(args: Array<String>) {
val logger = LogManager.getLogger()!!
logger.warn("Warn")
logger.info("Info")
logger.debug("Debug")
}
Run Code Online (Sandbox Code Playgroud)
我没有得到日志输出但是这条消息
ERROR StatusLogger No Log4j 2 configuration file found. Using default configuration (logging only errors to the console), or user programmatically provided configurations. Set system property 'log4j2.debug' to show Log4j 2 internal initialization logging. See https://logging.apache.org/log4j/2.x/manual/configuration.html for …Run Code Online (Sandbox Code Playgroud) 想知道我应该包含的依赖项,以将 commons-logging 桥接到 slf4j-api。
通过添加以下内容,我的构建成功:
"org.apache.logging.log4j:log4j-api:2.12.1"
"org.apache.logging.log4j:log4j-core:2.12.1"
"org.apache.logging.log4j:log4j-1.2-api:2.12.1"
"org.slf4j:slf4j-api:${slf4j_version}"
"org.apache.logging.log4j:log4j-slf4j-impl:2.12.1"
"org.slf4j:slf4j-jcl:1.7.25"
Run Code Online (Sandbox Code Playgroud)
但无法启动我的服务:( Getting java.lang.ExceptionInInitializerError... 引起:org.springframework.beans.factory.CannotLoadBeanClassException