我使用Spring Boot并希望它将日志输出写入文件。
根据文档,这可以通过设置
来完成logging.file=filename.log
虽然控制台输出正常,但未创建filename.log
。此外,如果我手动创建文件,则不会写入任何内容。我错过了什么?
答案 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,结构如下
文件: 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 。
这就是我的应用程序结构树的样子:
如果您想获得更多乐趣,可以在maven依赖项中找到base.xml,如下所示:
答案 4 :(得分:3)
就我而言,我在应用程序属性文件中使用logging.file
。
相反,我需要使用logging.file.name
,因为这样我就可以将日志保存到定向路径文件中。
答案 5 :(得分:2)
Spring Boot:2.4.3 版
其中之一应在 application.properties
文件中使用:logging.file.name
或 logging.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, ,它不尊重所提供的属性。
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);
}
-Dlogging.file=/location/output.log
传递。以上两种都不是最好的,因为要定义其他日志记录属性,它们也应遵循相同的方式。
定义一个属性文件,并将所有日志记录配置放入其中,并在-Dspring.config.location
中指定该文件。这是my other problem和this 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 然后它在我们指定的路径中创建了一个日志文件。谢谢。