【问题标题】:log4j properties file not creating log file in spring bootlog4j 属性文件未在 Spring Boot 中创建日志文件
【发布时间】:2021-06-12 14:00:07
【问题描述】:

我无法使用 log4j2 spring boot 2.4 生成日志文件,它只能在 eclipse 控制台中打印日志。 我已经尝试过网络上提供的多种解决方案,例如:排除、将文件重命名为 log4j2、多次更改属性(有些不使用 log4j.xx,有些不使用)不知道该怎么办?

属性文件:

log4j.rootLogger=DEBUG, stdout, file
log4j.logger.infoLogger=DEBUG, infoLogger
log4j.additivity.infoLogger = false

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-dd-MM HH:mm:ss,SSS} %-10p [%l] : %m%n

log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=C:/logs/application.log
log4j.appender.file.MaxFileSize=10MB
log4j.appender.file.MaxBackupIndex=2
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{dd MMM yyyy HH:mm:ss,SSS} %-10p %l -- %m%n

log4j.appender.infoLogger=org.apache.log4j.RollingFileAppender
log4j.appender.infoLogger.File=C:/logs/applicationInfo.log
log4j.appender.infoLogger.MaxFileSize=10MB
log4j.appender.infoLogger.MaxBackupIndex=2
log4j.appender.infoLogger.layout=org.apache.log4j.PatternLayout
log4j.appender.infoLogger.layout.ConversionPattern=%d{dd MMM yyyy HH:mm:ss,SSS} %-10p %l -- %m%n

pom.xml:

    I am doing the exclusions from all spring dependencies, as mention in some solutions.

<dependency>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </exclusion>
    </exclusions>
<dependency>

    <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-log4j2</artifactId>
    </dependency>

演示 Java 文件:

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class Controller {
    
        protected final  Logger logger = LogManager.getLogger(Controller.class);
        ....
 }

朋友,请查看并告诉我其中的问题。请不要将其标记为重复,因为我已经尝试了可用的解决方案。可能我错过了一些:)

【问题讨论】:

  • 问题是我没有使用 application.properties,如果可能的话我需要没有它的解决方案
  • 我正在使用系统属性 appender.email.SMTPHost=${sys:log4j.smtpHost} 但它没有从 context.xml 加载并将主机读取为 ${sys:log4j.smtpHost}跨度>

标签: java spring-boot logging log4j log4j2


【解决方案1】:

以下是 log4j2 与 Spring boot 集成的一个工作示例。 尝试使用 Gradle 构建,但也可以用于 maven 构建。

需要考虑的点(如果您使用的是弹簧靴):

  1. 从所有配置模块中删除 Spring 默认日志记录模块
  2. 为 Spring Boot 添加 log4j2 启动器
  3. 通过向属性logging.config= 添加值来通知 spring 有关 log4j2 配置文件的信息
  4. 确保 log4j2 配置符合文档要求(否则日志记录将无法按预期工作)

项目配置:

build.gradle

plugins {
    id 'org.springframework.boot' version '2.5.0'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'java'
    id 'idea'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'

repositories {
    mavenCentral()
}

dependencies {
    implementation('org.springframework.boot:spring-boot-starter-web')
    implementation('org.springframework.boot:spring-boot-starter') {
        exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging'
    }
    implementation('org.springframework.boot:spring-boot-starter-log4j2')

    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

test {
    useJUnitPlatform()
}

configurations {
    all {
        exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging'
    }
}

log4j.properties

rootLogger.level = INFO
property.filename = application.log
appenders = R, console

appender.console.type = Console
appender.console.name = STDOUT
appender.console.layout.type = PatternLayout
appender.console.layout.pattern = %d %5p [%t] (%F:%L) - %m%n

appender.R.type = RollingFile
appender.R.name = File
appender.R.fileName = ${filename}
appender.R.filePattern = ${filename}.%d{yyyy-MM-dd}
appender.R.layout.type = PatternLayout
appender.R.layout.pattern = %d{yyyy-MM-dd HH:mm:ss} %c{1} [%p] %m%n
appender.R.policies.type = Policies
appender.R.policies.time.type = TimeBasedTriggeringPolicy
appender.R.policies.time.interval = 1

rootLogger.appenderRefs = R, console

rootLogger.appenderRef.console.ref = STDOUT
rootLogger.appenderRef.R.ref = File

application.properties

logging.config=classpath:log4j2.properties

AppController.java

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
@RestController
public class AppController {

private static final Logger LOG = LogManager.getLogger(AppController.class);
    @RequestMapping(value = "/refresh_configs", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<?> refreshConfig() {
        LOG.info("refresh_configs");
        return new ResponseEntity<>("OK", HttpStatus.OK);
    }
}

application.log

2021-06-12 22:39:00 HelperApplication [INFO] Starting HelperApplication using Java 11.0.9 on 88e9fe567a24 with PID 66713 (/Users/${USER}/Desktop/Helper/out/production/classes started by ${USER} in /Users/${USER}/Desktop/Helper)
2021-06-12 22:39:00 HelperApplication [INFO] No active profile set, falling back to default profiles: default
2021-06-12 22:39:01 TomcatWebServer [INFO] Tomcat initialized with port(s): 8080 (http)
2021-06-12 22:39:01 Http11NioProtocol [INFO] Initializing ProtocolHandler ["http-nio-8080"]
2021-06-12 22:39:01 StandardService [INFO] Starting service [Tomcat]
2021-06-12 22:39:01 StandardEngine [INFO] Starting Servlet engine: [Apache Tomcat/9.0.46]
2021-06-12 22:39:01 [/] [INFO] Initializing Spring embedded WebApplicationContext
2021-06-12 22:39:01 ServletWebServerApplicationContext [INFO] Root WebApplicationContext: initialization completed in 580 ms
2021-06-12 22:39:01 Http11NioProtocol [INFO] Starting ProtocolHandler ["http-nio-8080"]
2021-06-12 22:39:01 TomcatWebServer [INFO] Tomcat started on port(s): 8080 (http) with context path ''
2021-06-12 22:39:01 HelperApplication [INFO] Started HelperApplication in 1.187 seconds (JVM running for 1.944)
2021-06-12 22:39:01 ApplicationAvailabilityBean [INFO] Application availability state LivenessState changed to CORRECT
2021-06-12 22:39:01 ApplicationAvailabilityBean [INFO] Application availability state ReadinessState changed to ACCEPTING_TRAFFIC
2021-06-12 22:39:17 [/] [INFO] Initializing Spring DispatcherServlet 'dispatcherServlet'
2021-06-12 22:39:17 DispatcherServlet [INFO] Initializing Servlet 'dispatcherServlet'
2021-06-12 22:39:17 DispatcherServlet [INFO] Completed initialization in 0 ms
2021-06-12 22:39:17 AppController [INFO] refresh_configs
2021-06-12 22:49:33 AppController [INFO] refresh_configs
2021-06-12 23:01:52 ApplicationAvailabilityBean [INFO] Application availability state ReadinessState changed from ACCEPTING_TRAFFIC to REFUSING_TRAFFIC

参考:
https://stackoverflow.com/a/39703897/2987755

https://docs.spring.io/spring-boot/docs/2.0.x/reference/html/howto-logging.html#howto-configure-log4j-for-logging

【讨论】:

  • 做了更改,现在在控制台中它正在加载更多日志,但仍然没有创建日志文件。我使用了您提供的相同属性。 appender.R.fileName = ${filename} appender.R.filePattern = ${filename}.%d{yyyy-MM-dd},文件将在项目位置创建?\
  • 更改位置后工作的兄弟。谢谢,但我不想使用 application.properties
  • 它正在工作,我正在以编程方式加载 log4j。
  • 很高兴知道 ?
【解决方案2】:

尝试将文件路径更改为另一个目录。有时C盘会出现一些权限问题。

【讨论】:

  • 我只有C盘,有管理员权限。
【解决方案3】:

您正在使用 log4j2 的 spring boot 依赖项。 属性文件的语法与 log4j 不同。这就是为什么不会创建日志文件的原因。您必须迁移您的属性,请参阅Migrating from log4j to log4j2 - properties file configuration

【讨论】:

  • 我试过了兄弟,但没有工作。不生成文件
  • 您可以在跟踪模式下启动 log4j2 以查看究竟发生了什么。这是找出问题的好方法。但我不知道它的属性语法,对不起。对于 xml,它将是 &lt;Configuration status="trace"&gt;
  • 为属性语法找到了它。只需在您的 log4j2.properies 中设置 status = trace
  • 我将其更改为 Trace,但没有得到任何额外的东西。 Trace 是用于记录应用程序消息的日志级别。你在正确的道路上,我们必须调试它并找到它失败的地方。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-18
相关资源
最近更新 更多