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

时间:2016-07-22 13:02:48

标签: spring spring-boot logback slf4j

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

根据文档,这可以通过设置

来完成
logging.file=filename.log

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

18 个答案:

答案 0 :(得分:25)

使用logging.file.name代替logging.file

在更高版本的spring-boot-parent(from version 2.2.0)中,不推荐使用属性logging.file。

答案 1 :(得分:13)

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

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

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

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

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

答案 2 :(得分:4)

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

enter image description here

文件: 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.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy
                class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>50MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <maxHistory>30</maxHistory>
        </rollingPolicy>

        <encoder>
            <pattern>%d{yyyy-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>%d{yyyy-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

答案 3 :(得分:4)

以下是我设法将输出写入本地文件的方法。 要禁用控制台日志记录并仅将输出写入文件,您需要自定义 logback-spring.xml (将其命名为 logback-spring.xml ,以便您充分利用引导提供的模板功能(日期格式化等...)导入 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

请注意,springboot会生成此日志文件 myapplication.log

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

enter image description here

如果您想获得更多乐趣,可以在maven依赖项中找到base.xml,如下所示:

enter image description here

答案 4 :(得分:3)

就我而言,我在应用程序属性文件中使用logging.file

相反,我需要使用logging.file.name,因为这样我就可以将日志保存到定向路径文件中。

答案 5 :(得分:2)

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

答案 6 :(得分:2)

检查Springboot父级的版本。

如果是2.3.x +,则该属性应为logging.fil.name = yourapplog.log

答案 7 :(得分:1)

如果你想把日志文件放在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 版

答案 8 :(得分:1)

如果您使用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=%d{ABSOLUTE} %5p %c{1}:%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=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%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,则会在项目目录中自动创建此文件。

答案 9 :(得分:0)

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

这些是不同的日志记录级别及其从最小值&lt;&lt;最大。

OFF&lt;&lt;致命&lt;&lt;错误&lt;&lt; WARN&lt;&lt; INFO&lt;&lt; DEBUG&lt;&lt; TRACE&lt;&lt; ALL

# 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= "%d{yyyy-MM-dd HH:mm:ss} - %msg%n"

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

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

答案 10 :(得分:0)

对不起,您的回复很晚。看来spring的记录器是从其自己的类路径读取该属性的。 Due to precedence, ,它不尊重所提供的属性。

一些窍门:

  1. 在主类中,使用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);
    }
  1. 将属性作为JVM参数-Dlogging.file=/location/output.log传递。

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

解决方案

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

答案 11 :(得分:0)

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

仅通过将路径中的反斜杠(“ \”)更改为正斜杠(“ /”)即可解决。

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

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

答案 12 :(得分:0)

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

在Windows中:

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

答案 13 :(得分:0)

就我而言,我粘贴了一些典型的配置,并以某种方式最有可能弄乱了我的日志记录模式(logging.pattern.file)

评论它解决了我自己的问题(即使创建了控制台输出,并且根日志记录级别设置为DEBUG,文件还是被写入了,什么也没写)-否则没有错误。

[edit]在其他情况下(我似乎总是碰到这个问题),我所引用的JAR文件具有从Web应用程序(WAR)剥离的类,其中包含logback.xml,更不用说AppInitializer了-我怀疑AppInitializer不会有问题,因为它具有完全不同的包名称,并且不应由Spring自动配置进行扫描。但是我想在类路径中检测到logback.xml,并且完全弄乱了所有内容。我知道引用WAR是一种hack,但是我希望可以快速解决-修复该问题,打破其他问题。 Mani's answer相关。

答案 14 :(得分:0)

就我而言,我添加了一个文件&#34; logback.xml&#34;在我的一个子模块中错误导致了这个问题,删除它,一切都会好的。

答案 15 :(得分:0)

我刚刚使用了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

它对我来说非常好。

答案 16 :(得分:0)

我遇到了同样的问题。它很可能是由于文件系统上的文件权限造成的。我有root用户拥有的应用程序文件夹,但进程所有者拥有./logs。因此,以下没有成功:

logging.file = my.log

但这确实

logging.file = /选择/ MyApp的/日志/ my.log

答案 17 :(得分:0)

我在 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 然后它在我们指定的路径中创建了一个日志文件。谢谢。