在 Spring Boot 应用程序的 log4j2 中未生成日志文件
Posted
技术标签:
【中文标题】在 Spring Boot 应用程序的 log4j2 中未生成日志文件【英文标题】:Log file is not being generated in log4j2 in spring boot application 【发布时间】:2022-01-19 11:04:45 【问题描述】:我知道有很多类似的帖子,但其中没有解决方案对我有用。我在 eclipse 中创建了一个简单的 java 代码,我在控制台屏幕中得到了输出,但是没有生成日志文件。
log4j2.properties:
name=PropertiesConfig
property.filename = logs
appenders = console, file
appender.console.type = Console
appender.console.name = STDOUT
appender.console.layout.type = PatternLayout
appender.console.layout.pattern = [%-5level] %dyyyy-MM-dd HH:mm:ss.SSS [%t] %c1 - %msg%n
appender.file.type = File
appender.file.name = LOGFILE
appender.file.fileName=$filename/propertieslogs.log
appender.file.layout.type=PatternLayout
appender.file.layout.pattern=[%-5level] %dyyyy-MM-dd HH:mm:ss.SSS [%t] %c1 - %msg%n
appender.file.append=true
appender.file=org.apache.log4j.RollingFileAppender
loggers=file
logger.file.name=Processors
logger.file.level = trace
logger.file.appenderRefs = file
logger.file.appenderRef.file.ref = LOGFILE
rootLogger.level = trace
rootLogger.appenderRefs = stdout
rootLogger.appenderRef.stdout.ref = STDOUT
rootLogger= INFO, file, stdout
依赖项:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
<version>2.6.1</version>
</dependency>
java代码:
public class GetRoomsProcessor implements Processor
private static Logger logger = LogManager.getLogger(GetRoomsProcessor.class);
public void process(Exchange xchg) throws Exception
...
String statusCode = String.valueOf(response.statusCode());
if (statusCode.equals("200") || statusCode.equals("201"))
...
rooms.setRooms(listdata);
Gson g = new Gson();
String str = g.toJson(rooms);
//System.out.println(str);
logger.info(str);
logger.warn("This is a warn message");
logger.trace("This is a trace message");
xchg.getIn().setBody(str);
我需要做什么才能将日志写入文件? 谢谢
更新: 我还尝试添加以下依赖项,但仍然无效:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.16.0</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.16.0</version>
</dependency>
【问题讨论】:
当你启动你的spring应用程序时,你知道log4j是否找到了log4j.properties文件吗?我相信你没有正确初始化 log4j。 你好@MinhKieu,如果它在控制台中显示日志,你不认为它是在读取属性文件吗? 除了我在应用程序的开头出现以下红色警告之外,我不知道它是否与我的情况有关:SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar:file:/C:/Users/User/.m2/repository/org/apache/logging/log4j/log4j-slf4j-impl/2.14.1/log4j-slf4j-impl-2.14.1.jar!/org/slf4j/impl/StaticLoggerBinder.class] ... SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]
更好地升级到 2.16.0(其中导致问题的类已被删除),因为 2.15.0 在某些情况下仍然存在漏洞。还请更新您的问题,以避免有人复制具有漏洞的依赖项。
使用-Dlog4j.debug
标志运行您的应用程序。这将打印出有关找到并加载了哪个 log4j 属性文件的信息。
【参考方案1】:
我通过更新log4j2.properties
文件中的这两个值解决了这个问题:
property.filename =D:\\Users\\User\\MyFiles\\Apache Camel github\\ChatServiceProject\\logs\\propertieslogs.log
appender.file.fileName=$filename
【讨论】:
也许你可以提供一个相对路径而不是绝对路径。所以像,property.filename = logs/propertieslogs.log 这应该适用于任何路径,而不仅仅是 D:\\... @Jitendra 它对我不起作用以上是关于在 Spring Boot 应用程序的 log4j2 中未生成日志文件的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Spring Boot 应用程序初始化 log4j?
外部Log4j.properties在不打印日志中-Spring Boot 2.2.1
Spring Boot Webapp:让 Hibernate 使用 log4j
Spring Boot 加载不同名称的 log4j2.xml log4j2-app.xml