如何在Spring Boot Web应用中打印到控制台

26

作为一个Node背景下的开发者,Spring Boot中console.log()的等价物是什么?

例如,在以下方法中,我想在控制台中查看作业信息。

@RequestMapping(value = "jobposts/create", method = RequestMethod.POST)
public Job create(@RequestBody Job job){
    System.out.println(job);
    return jobRepository.saveAndFlush(job);
}
在Java中,System.out.println(); 是我知道如何打印内容的方法,但它似乎不会在我的控制台中显示。我使用的是IntelliJ。

你的意思是指网页浏览器控制台? - Simon Berthiaume
@SimonBerthiaume 不好意思,我的意思是IDE中的控制台。我可以看到它以这种方式打印日志.. 2018-02-17 13:51:10.916 DEBUG 31564 --- [ restartedMain] o.s.w.c.s.StandardServletEnvironment : 添加具有最低搜索优先级的PropertySource'servletConfigInitParams' - SpaceOso
除非您明确构建了一个旨在从命令行操作的应用程序,否则直接输出到System.out和System.err被认为是不良实践,但它可以工作。应该做的是使用日志框架,如SLF4J在logback或log4j之上。 - Simon Berthiaume
@SimonBerthiaume 哦,好的,我不知道这个。我会研究使用框架来完成这个任务。那么框架的目标是作为开发/生产设置吗?因此,只有在开发时运行时才会记录日志? - SpaceOso
8个回答

21

System.out.println(job); 就像你所做的那样。

它会打印类似于 yourpackage.Job@2g45e0f9 的东西。

尝试使用调试模式执行代码,看看是否会按照预期执行该 post 方法。


1
哦,好的,我明白了!现在...有没有办法打印作业的内容?而不是看起来像ID的东西? - SpaceOso
2
你应该在Job类中实现返回实例变量(或其他任何你想要的)的方法。这样,你就可以编写System.out.println(job.getSomething());来打印内容。请参阅Java文档中有关setter和getter的说明。 当然,你也可以重写toString()方法来收集对象内容的所有信息,然后调用System.out.println(job.toString())来打印它们。 - Cimon

3

你可以尝试使用Lombok

在类级别上使用@Slf4j,并在类中的任何位置使用log.info('text')

    import lombok.extern.slf4j.Slf4j;
    
    @Slf4j
    public class MyController {
       
       public void getAll() {
          log.info('This is a test.');
       }
    }

3

你尝试过在日志配置文件中添加控制台附加器吗?以下是如何在slf4j和logback生态系统中实现的方法:

在logback.xml文件中:

<configuration>
<appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
    <encoder class="net.logstash.logback.encoder.LogstashEncoder">
        <timeZone>UTC</timeZone>
    </encoder>
</appender>
<logger name="com.yourcompany.packagename" level="INFO" additivity="false">
    <appender-ref ref="consoleAppender" />
</logger>
<root level="ERROR">
    <appender-ref ref="consoleAppender" />
</root>
</configuration>

3

除了@robocode发布的内容之外,还可以在Job类中重写toString方法,以您希望查看它们的方式打印参数。

public class Job{
   String p1;
   int p2;
   .
   .
   @Override
   public String toString(){
      return "p1: "+p1+", p2: "+p2;
   }
}

使得简单地输出您的对象更加容易。
Job job = new Job();
System.out.println(job);

1
如果上述方法不能解决问题,请确保您正在进行包含sysout语句的适当请求。

1
Java的日志记录情况有点复杂。你编写的任何应用程序都会有一个框架和一堆库,它们都会写入日志记录器,而不同的JAR文件可能使用不同的日志记录器。我不知道Node的情况,也许那里每个人都将日志记录到标准输出?但在Java领域并非如此。
正因为如此,即使对于你自己的代码,你可以直接写入标准输出(使用System.out.println)也没问题,但如果你希望所有代码和其他JAR文件的日志信息都发送到同一个位置,你就必须处理日志记录器。 因此,你最好也使用日志记录器来记录自己的代码,并保持一致性。这不仅仅是关于如何记录自己的输出,还涉及如何捕获应用程序各个部分的日志输出,并确保它们被发送到正确的位置,并具有你所需的细粒度。
Spring-boot提供了一个默认的日志库,称为logback。如果您没有设置任何appender,它将默认写入控制台。您的代码不直接使用logback,而是使用一个称为slf4j的外观。我知道这听起来很荒谬,因为我们已经添加了两个库来做System.out.println已经可以做的事情,但是slf4j通过提供适配器来帮助,以便如果第三方jar使用log4j2或java.util.logging,它可以将输出重定向到slf4j,然后再到logback,确保您获得应用程序的所有日志的统一视图,并为应用程序的不同部分配置您想要查看的日志级别。这是使用System.out无法实现的功能。

1
在你的pom文件中导入log4j依赖。
<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>

define logger in your controller like:

private static Logger logger = LoggerFactory.getLogger(YourClassName.class);

然后使用。
logger.info("your message");

1
此 log4j 版本已被报告为 2022 年的漏洞。 - Hernaldo Gonzalez

0
你似乎有些困惑,这是一个存储对象的地址,你需要通过定义一些方法和属性来使对象变得有用。

1
你的回答可以通过提供更多支持性信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人能够确认你的回答是否正确。你可以在帮助中心找到关于如何撰写好回答的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接