当前位置: 首页 > 知识库问答 >
问题:

当Spring Boot调用Log4j时不会输出到文件(但在命令行调用时会输出)

李昌勋
2023-03-14

我有一个可以由两个入口点调用的服务:控制台应用程序的main()和restendpoint。

服务应该通过SL4J记录器记录到一个文件中。

当我通过命令行调用应用程序(java-jar myartifact.jar )时,它工作良好,文件被正确填充。

这种服务可以称为两种方式:

  • 通过命令行,通过入口点TaskCommandLineApp
  • 通过REST控制器(POST)TaskController

三个课程的相关部分:

public final class TaskService {
    
    private static final Logger LOGGER = LoggerFactory.getLogger(TaskService.class);

}
public static void main(String[] args) {
    //...
    TaskRequest taskRequest = ... (coming from input);
    TaskService taskService = new TaskService();
    taskService.run(taskRequest);
    //...
}
@RestController
@RequestMapping("/task")
public final class TaskController {

    @Autowired
    private final TaskService taskService;
    
    @RequestMapping(value = "/tasks", method = RequestMethod.POST)
    public ResponseEntity<?> postTask(@RequestBody TaskRequest taskRequest) {
        //...
        taskRequest.run(taskRequest);
        //...
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </Console>
        <File name="File" fileName="task.log" immediateFlush="true" append="false">
            <PatternLayout>
                <pattern>%d %p %C{1.} [%t] %m%n</pattern>
            </PatternLayout>
        </File>
    </Appenders>
    <Loggers>
        <!-- additivity=false ensures summary log data only goes to the summary log file -->
        <Root level="info">
            <AppenderRef ref="Console"/>
            <AppenderRef ref="File"/>
        </Root>
    </Loggers>
</Configuration>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-slf4j-impl</artifactId>
    <version>2.14.1</version>
</dependency>
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.4.RELEASE</version>
    <relativePath/>
</parent>

共有1个答案

白宏义
2023-03-14

默认情况下,spring将使用不同的日志机制“spring-boot-starter-logging”

如果您想让log4j/log4j2工作,那么您应该排除默认依赖项,并添加与log4j相关的依赖项。由于您已经进行了配置,我想排除默认配置就足够了。通过在pom.xml文件中添加exclude子句,我对“spring-boot-starter-web”项目采用了这种方法

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>
 类似资料:
  • 你好,我有一个bash脚本,我打算测量时间流逝,CPU%和内存使用的脚本与输出被放入一个. txt文件与所需的输出,如: 执行此操作的脚本如下所示: 然而,下载终端进度也被定向到. txt文件,即. txt文件。 我不熟悉使用stderr和stdout,所以我是否误解了它们,我将如何解决这个问题?

  • 问题内容: 当我尝试去做 我得到一个空的输出。 预期输出为: 问题答案: 如果没有输出,通常是因为命令无法启动。 阅读()以检查是否有任何错误。

  • 有时当gdb输出信息较多时,gdb会暂停输出,并会打印“---Type <return> to continue, or q <return> to quit---”这样的提示信息,如下面所示: 81 process 2639102 0xff04af84 in __lwp_park () from /usr/lib/libc.so.1 80 process 2573566

  • 我有php文件模板,我需要填充一些数据并导出为“rendered_view.php”。它需要每天自动完成。所以我正在尝试使用Laravel Scheduler。 所以我有: 查看“view_to_render.blade.php” 控制器"MiscController.php" 路线 控制台/内核。php 场景1:如果我导航到127.0.0.1:8000/testRenderView,它就可以工作

  • 我试图使用jsch连接到远程交换机,运行一些命令并提取输出。 我能够使用连接到开关,但是命令输出在输入流中不可用。也许我做得不对。这是密码 当我调试inputStream时。isAvailable()始终返回零,表示该命令没有输出。 蒂亚!

  • 问题内容: 在Python中,通过而不是打扰其输出来调用命令的最短和标准方法是什么。 我尝试了,但是似乎返回了输出。我对此并不感到烦恼,我只需要在不使输出混乱的情况下静默运行程序即可。 如果有帮助,我正在打电话给我,我的意图只是打电话给我。 问题答案: p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)