在 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

在 Spring Boot 应用程序中,Hibernate SQL 语句没有使用 log4j 登录到单独的日志文件中

Spring boot中使用log4j