我有以下进口:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
以及以下实例:
private static Logger logger = LoggerFactory.getLogger(Test.class);
以及我的 Main 方法中的以下内容:
logger.info("SOME MESSAGE: ");
但是,我无法在任何地方找到输出。我所看到的是我的控制台中有:
21:21:24.235 [main] INFO some_folder.Test - SOME MESSAGE:
如何找到日志文件?
请注意,以下内容位于我的构建路径上:
slf4j-api-1.7.5.jar
slf4j-log4j12-1.6.4.jar
我阅读了类似问题的答案,但实际上没有人说如何解决问题。
slf4j 只是一个 API。您应该有一个具体的实现(例如 log4j)。这个具体实现有一个配置文件,它告诉您在哪里存储日志。
当 slf4j 使用记录器捕获日志消息时,会将其交给附加程序,由附加程序决定如何处理该消息。默认情况下,ConsoleAppender 在控制台中显示消息。
默认配置文件是:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<!-- By default => console -->
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
</Appenders>
<Loggers>
<Root level="error">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
如果您将可用的配置文件放在类路径中,那么您的具体实现(在您的例子中为 log4j)将找到并使用它。请参阅 Log4J 文档。
文件追加器示例:
<Appenders>
<File name="File" fileName="${filename}">
<PatternLayout>
<pattern>%d %p %C{1.} [%t] %m%n</pattern>
</PatternLayout>
</File>
...
</Appenders>
带有文件附加器的完整示例:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<File name="File" fileName="${filename}">
<PatternLayout>
<pattern>%d %p %C{1.} [%t] %m%n</pattern>
</PatternLayout>
</File>
</Appenders>
<Loggers>
<Root level="error">
<AppenderRef ref="File"/>
</Root>
</Loggers>
</Configuration>
正如已经提到的,它只是一个外观,它有助于轻松地在不同的记录器实现之间切换。例如,如果您想使用 log4j 实现。
示例代码如下所示。
如果你使用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>
在位置 src/main/resources/log4j.properties 的 log4j.properties 中包含以下内容
log4j.rootLogger=DEBUG, STDOUT, file
log4j.appender.STDOUT=org.apache.log4j.ConsoleAppender
log4j.appender.STDOUT.layout=org.apache.log4j.PatternLayout
log4j.appender.STDOUT.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=mylogs.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{dd-MM-yyyy HH:mm:ss} %-5p %c{1}:%L - %m%n
下面的 Hello world 代码将按照上述配置打印在控制台中并打印到日志文件中。
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class HelloWorld {
public static void main(String[] args) {
Logger logger = LoggerFactory.getLogger(HelloWorld.class);
logger.info("Hello World");
}
}
默认情况下它不写入文件。您需要配置类似
RollingFileAppender
的内容,并让根记录器写入它(可能除了默认的 ConsoleAppender
之外)。
日志文件不可见,因为 slf4j 配置文件位置需要使用以下参数传递给 java run 命令。(例如)
-Dlogging.config={file_location}\log4j2.xml
或者这个:
-Dlog4j.configurationFile={file_location}\log4j2.xml
回复:
我阅读了类似问题的答案,但实际上没有人说如何解决问题。
问题的一部分
gradle
(而不是Maven)。
要登录项目根目录下名为:
my-log-file.log
的文件,请使用:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
...
private static final Logger LOGGER = LoggerFactory.getLogger(Main.class);
...
LOGGER.info("This is an info message");
LOGGER.error("This is an error message");
可以使用以下 2 个步骤:
build.gradle
在
build.gradle
中添加:
dependencies {
// Allow logging to file.
implementation 'org.slf4j:slf4j-api:1.7.32'
implementation 'ch.qos.logback:logback-classic:1.2.6'
}
创建一个名为:
logback.xml
的文件并将其存储在:
src/main/resources
(不在src/main/resources/com/<projectname>/
中)。它应该包含:
<configuration>
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>my-log-file.log</file> <!-- Specify the file name here -->
<encoder>
<pattern>%date %level [%thread] %logger{10} [%file:%line] - %msg%n</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="FILE"/>
</root>
</configuration>
就是这样,如果您现在构建并运行您的java程序,您应该在存储库/项目的根目录中看到一个名为:
my-log-file.log
的文件,内容为:
2023-10-28 20:41:55,394 INFO [main] c.d.Main [Main.java:36] - This is an info message
2023-10-28 20:41:55,394 ERROR [main] c.d.Main [Main.java:37] - This is an error message
这个问题假设您已经有一个有效的
org.slf4j.Logger
设置,可以在终端中显示日志信息,但不会将其存储到文件中。