Spring Boot - 没有写入日志文件(不尊重logging.file)

Posted

技术标签:

【中文标题】Spring Boot - 没有写入日志文件(不尊重logging.file)【英文标题】:Spring Boot - no log file written (logging.file is not respected) 【发布时间】:2016-11-26 09:36:40 【问题描述】:

我使用 Spring Boot 并希望它将日志输出写入文件。

根据文档,这只是通过设置来完成

logging.file=filename.log

虽然控制台输出工作正常,但 filename.log 并未创建。此外,如果我手动创建文件,则不会写入任何内容。我错过了什么?

【问题讨论】:

你把你的filename.log放在哪里了? 请出示您的:application.properties 文件 默认情况下,Spring Boot 通过 Logback (logback.qos.ch) 配置日志记录以在 INFO 级别登录到控制台。但是,如果您决定更愿意使用 Log4j 或 Log4j2,则需要更改依赖项以包含您要使用的日志记录实现的适当启动器并排除 Logback。 @AliDehghani 我假设如果日志文件不存在,它将被创建。但是,我在启动应用程序的目录中手动创建了该文件,但没有写入任何内容。我也使用了logging.path=/var/log 和docs 一样,但那里也没有创建日志文件。 使用 logging.file.name 代替 2.2+。 logging.file 在 2.2 中已弃用,并在 2.3 中完全删除,因此您不能再在 2.3+ 中使用 logging.file。 【参考方案1】:

使用logging.file.name 而不是logging.file

在更高版本的 spring-boot-parent(from version 2.2.0) 中,属性 logging.file 已被弃用。

【讨论】:

我已经升级到最新的Springboot版本,没有创建日志文件。感谢您的回答。 它对我有用。我使用的是 2.3.1 版本。非常感谢。这真的很有帮助。 太棒了!这应该被接受为答案。非常感谢! 文档链接(选择您的 Spring Boot 版本):docs.spring.io/spring-boot/docs【参考方案2】:

我找到了解决方案。我对此不太满意,因为它仍然没有回答我最初的问题,为什么不尊重 logging.file 属性。

我在 application.properties 所在的同一目录中从 Georges 的 answer 创建了 logback-spring.xml。根据documentation Spring Boot 将从那里获取它。显然,这在我的情况下不会发生。

我需要另外添加 logging.config=classpath:logback-spring.xml 才能被 Spring 接收。我的application.properties 的相关部分现在是

logging.config=classpath:logback-spring.xml
logging.file=logs/logfile.log

(我手动创建了logs 目录。)

【讨论】:

+1 : logging.configapplication.properties 中需要,如果有人试图将 Spring Batch 管理 UI 与 Spring Boot 批处理作业集成并从 spring-batch-admin-manager 项目覆盖 env-context.xml。跨度> 您的项目是否已经在资源文件夹中包含logback.xml logging.file 肯定会受到尊重,这取决于您如何指定路径,文件将在那里创建。作为示例,在我的项目中,我在 application.yml 中进行了以下登录配置 - logging: file: logs/dictoro-livescore-api.log level: INFO 并在文件夹 @987654339 中的文件系统(我使用的是 Linux Ubuntu)中创建日志文件@ 这不是必需的:logging.config=classpath:logback-spring.xml。但是,如果您想为不同的配置文件(prod 与 dev)设置不同的 logback 配置,它可能会很有用。您也不必创建文件夹。 如何在我的 spring boot 项目目录中创建日志文件?我想为错误和信息消息创建单独的文件。我正在使用 spring boot v. 2.5 提前致谢。【参考方案3】:

就我而言,我在下面的应用程序属性文件中使用了。

logging.file

相反,我需要使用下面的:

logging.file.name

从那时起,我可以将日志放入定向路径文件中。

【讨论】:

【参考方案4】:

我遇到了同样的问题。这很可能是由于文件系统上的文件权限。我拥有root拥有的应用程序文件夹,但进程所有者拥有./logs。因此,以下方法不起作用:

logging.file=my.log

但确实如此

logging.file=/opt/myapp/logs/my.log

【讨论】:

如下文的 Vivek 所示,logging.file 现在已被弃用,因此除非您使用的是旧版本的 Spring,否则请遵循该指南而不是我的指南,该指南现在已过时。【参考方案5】:

我不知道这是否对你有帮助,但我也在我的 Spring-Boot 项目中使用 Logback,结构如下

文件: logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="logback.xsd">

    <property resource="\application.properties"/>

    <appender name="FILE"
        class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>$app.logPathPrefix/myproject.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>$app.logPathPrefix/myproject.%dyyyy-MM-dd.%i.log.gz</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy
                class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>50MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <maxHistory>30</maxHistory>
        </rollingPolicy>

        <encoder>
            <pattern>%dyyyy-MM-dd HH:mm:ss.SSS [%level] [%thread] [%logger:%line] %msg%n
            </pattern>
        </encoder>
    </appender>

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%dyyyy-MM-dd HH:mm:ss.SSS [%level] [%thread] [%logger:%line] %msg%n
            </pattern>
        </encoder>
    </appender>


    <logger name="org.springframework" level="INFO" />
    <logger name="com.mycompany" level="INFO" />
    <logger name="org.hibernate" level="DEBUG" />


    <root level="INFO">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="FILE" />
    </root>

</configuration>

文件: application.properties

app.logPathPrefix=/var/log/myproject

【讨论】:

【参考方案6】:

这是我设法将输出写入本地文件的方法。 要禁用控制台日志记录并仅将输出写入文件,您需要自定义 logback-spring.xml (将其称为 logback-spring.xml 以便您利用Boot 提供的模板功能(日期格式等)) 导入 file-appender.xml 而不是 console-appender.xml。为了实现这一点,您必须将此代码粘贴到您的 logback-spring.xml 文件中。

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <include resource="org/springframework/boot/logging/logback/defaults.xml" />
    <property name="LOG_FILE" value="$LOG_FILE:-$LOG_PATH:-$LOG_TEMP:-$java.io.tmpdir:-/tmp/spring.log"/>
    <include resource="org/springframework/boot/logging/logback/file-appender.xml" />
    <root level="INFO">
        <appender-ref ref="FILE" />
    </root>
</configuration> 

您还需要将以下内容添加到您的 application.properties:

logging.file=myapplication.log

注意这个日志文件myapplication.log会由springboot生成。

这是我的应用程序结构树的样子:

如果你想玩得更开心,你可以像这样在你的maven依赖中找到base.xml:

【讨论】:

对不起,但这对我也不起作用。我更改了我的application.properties,使得唯一与日志记录相关的行是logging.file=logfile.log。这将禁用控制台日志记录。然而,没有写入日志文件。 (是的,我使用的是 Spring Boot 1.3.6,是的,logback 配置文件位于 resources 下)。 你的应用在运行后刷新了吗? 您可以下载我的代码并进行测试。 :drive.google.com/file/d/0B_EVyl90ivXwQ3NpVHllVWpQZmM/… 在下面查看我的答案:logging.config=classpath:logback-spring.xml 成功了。【参考方案7】:

检查 Springboot 父版本的版本。

如果是 2.3.x+,那么属性应该是 logging.file.name=yourapplog.log

【讨论】:

【参考方案8】:

Spring Boot:版本 2.4.3

应在application.properties 文件中使用其中之一:logging.file.namelogging.file.path

例如:

logging.file.name=logs/myapp.log
logging.file.path=logs

您不必创建logs 目录。它将在类路径中自动创建。

要查看其他已弃用的属性,请阅读此类文件~/.m2/repository/org/springframework/boot/spring-boot/2.4.3/spring-boot-2.4.3.jar!/org/springframework/boot/logging/LoggingSystemProperties.class

【讨论】:

【参考方案9】:

如果您使用的是 Maven,请添加依赖项:

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.6</version>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>1.7.5</version>
</dependency>

现在您必须指定一个名为“log4j.properties”的文件,您必须将其放在特定目录中:“src/main/resources/log4j.properties”

这是文件的外观示例:

# Root logger option
log4j.rootLogger=INFO, file, stdout
log4j.logger.org.springframework.ws.client.MessageTracing.sent=TRACE
log4j.logger.org.springframework.ws.client.MessageTracing.received=TRACE

# Direct log messages to stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

# log4j.appender.springlog.Threshold=INFO
log4j.appender.springlog.layout=org.apache.log4j.PatternLayout
log4j.appender.springlog.layout.ConversionPattern=%dABSOLUTE %5p %c1:%L - %m%n

# Direct log messages to a log file
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=D:/example/filename.log
log4j.appender.file.MaxFileSize=10MB
log4j.appender.file.MaxBackupIndex=10
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%dyyyy-MM-dd HH:mm:ss %-5p %c1:%L - %m%n

现在导入这些:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

像这样声明一个记录器变量:

final static Logger logger = Logger.getLogger(TheClassYourIn.class);

并像这样在类中使用它:

logger.info("Well hello world then ");

这种方式对我有用。我希望这个答案会对你有所帮助。祝你好运!

PS:log4j.appender.file.File='directory' 是您指定日志存储位置的方式。如果你不指定一个目录,只是将它保留为 filename.log,这个文件将自动在项目目录中创建。

【讨论】:

我认为这是一个有效的答案。有时,由于用户环境或用户想记录的包未指定,答案可能不起作用。我对此投了反对票。 感谢您提供的详细示例。但是,我将使用 logback,因为它带有 Spring Boot。【参考方案10】:

在我的例子中,我错误地在我的一个子模块中添加了一个文件“logback.xml”,这导致了这个问题,删除它,一切都会好起来的。

【讨论】:

【参考方案11】:

抱歉回复晚了。似乎 spring 的记录器从它自己的类路径中读取了属性。Due to precedence,它不尊重提供的属性。

一些小技巧:

    在主类中使用springApplication.setDefaultProperties(properties); 像这样设置属性变量
public static void main(String[] args) 
        SpringApplication springApplication = new SpringApplication(MainClass.class);
        Properties properties = new Properties();
        properties.put("logging.file", logDirectory);
        springApplication.setDefaultProperties(properties);
        springApplication.run(args);
    
    将该属性作为 JVM 参数 -Dlogging.file=/location/output.log 传递。

以上两个都不是最好的,因为要定义其他日志记录属性,它们也应该遵循相同的方式。

解决方案

定义一个属性文件并将所有日志配置放入其中,并在-Dspring.config.location 中指定该文件。这是my other problem 和this is how I resolved that 的派生。检查一下,以了解我尝试过的其他解决方案及其面临的挑战。

【讨论】:

【参考方案12】:

我在 windows 操作系统中也遇到了同样的问题。我只是将 -> logging.file 更改为 logging.file.name=D:/customer_projects/flight_reservation_system/logs/reservation.log

注意:我使用的 Spring-boot 版本是 2.4.1

在 Windows 操作系统中,当您从文件资源管理器中复制文件路径时,您将获得类似 D:\customer_projects\flight_reservation_system\logs\flight_reservation.log 的文件路径

以上文件路径将不起作用。因此您需要更改文件路径,例如 D:/customer_projects/flight_reservation_system/logs/reservation.log 然后它在我们指定的路径中创建了一个日志文件。谢谢。

【讨论】:

【参考方案13】:

如果您想将日志文件放在特定目录中,例如 D 盘,则可以在 spring boot 项目中进行以下更改

1.创建logback-spring.xml配置文件并注明要创建日志的包名

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <include resource="org/springframework/boot/logging/logback/base.xml" />
    
        <logger name="com.example.demo" 
        level="DEBUG" >
           
        </logger>
</configuration>

2.也在application.properties文件中添加以下内容

logging.config=classpath:logback-spring.xml
logging.file.name=F:/Springbootlogs/filename.log

注意:上述更改适用于版本 2.4.3

【讨论】:

【参考方案14】:

我只是使用了 Spring-boot 提供的日志记录机制。我在我的“logback.xml”文件中写道:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="org/springframework/boot/logging/logback/defaults.xml" />
<include resource="org/springframework/boot/logging/logback/file- appender.xml" />
<root level="INFO">
<appender-ref ref="FILE" />
</root>
</configuration>

我将 application.properties 和 logback.xml 文件放在同一个包“src/main/resources”下。 在 application.properties 文件中只添加了一个参数:

logging.file = xyz.log

对我来说效果很好。

【讨论】:

file-appender.xml 的include 中有错字,但我无法编辑它,因为它少于6 个字符【参考方案15】:

如果您使用的是 Spring Boot,那么您可以直接 在 application.properties 文件中添加以下属性 来设置日志记录级别, 自定义日志记录模式并将日志存储在外部文件中。

这些是不同的日志记录级别及其从最小值

OFF

# To set logs level as per your need.
logging.level.org.springframework = debug
logging.level.tech.hardik = trace

# To store logs to external file
# Here use strictly forward "/" slash for both Windows, Linux or any other os, otherwise, your logs it won't work.      
logging.file=D:/spring_app_log_file.log

# To customize logging pattern.
logging.pattern.file= "%dyyyy-MM-dd HH:mm:ss - %msg%n"

请通过此链接更生动地自定义您的日志。

https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-logging.html

【讨论】:

【参考方案16】:

我也遇到了同样的问题,因为我只是复制了 windows 提供的路径(在路径中使用“\”)提供。

只需将路径中的反斜杠 ("\") 更改为正斜杠 ("/") 即可解决。

注意:路径中应严格使用正斜杠(“/”),操作系统不是约束。

例如:- logging.file.name=D:/Logs/server.log

【讨论】:

【参考方案17】:

我使用命令行参数运行我的 Spring Boot 服务,效果很好。所有 Spring Boot 控制台日志都写入该文件。我的application.properties 文件中没有配置任何日志记录。 Spring Boot 版本:2.0.5.RELEASE

在窗口中:

java -jar target\microservice-0.0.1.jar --logging.file=C:\\logs\\microservice.log

在 Linux 中

java -jar target\microservice-0.0.1.jar --logging.file=\var\log\microservice.log

【讨论】:

【参考方案18】:

在我的情况下,我粘贴了一些典型的配置,并且很可能以某种方式弄乱了我的日志记录模式(logging.pattern.file)

将其注释掉解决了我自己的问题(文件已创建,但没有写入任何内容,即使有控制台输出且根日志记录级别设置为 DEBUG)- 否则未给出错误。

[编辑] 在其他情况下(我似乎总是遇到这个问题),我引用了一个 JAR 文件,其中包含从 Web 应用程序 (WAR) 中剥离的类,其中包含一个 logback.xml,更不用说 AppInitializer - 我怀疑 AppInitializer 不会有问题,因为它有一个完全不同的包名称,不应该被 Spring 自动配置扫描。但是我猜,在类路径中检测到 logback.xml,并且完全搞砸了一切。我知道引用 WAR 是一种黑客行为,但我希望能快速修复——修复它,破坏其他东西。 Mani's answer 相关。

【讨论】:

【参考方案19】:

对于 Springboot 2.4.2,以下 Application.yml 配置有效:

logging:
    file:
        name: logpath

【讨论】:

以上是关于Spring Boot - 没有写入日志文件(不尊重logging.file)的主要内容,如果未能解决你的问题,请参考以下文章

Spring boot actuator 将跟踪端点信息写入文件

[Docker容器内的Spring Boot应用程序的log4j2日志

如何在spring boot中配置log4j写入文件?

Spring boot启动后没有生成日志文件问题排错

日志记录:在 Spring Boot 中使用属性文件实现 Log4j2

在 Spring Boot 上禁用应用程序的控制台日志记录