logback将控制台日志输出到文件
昨天,在上一篇logback文章下有朋友问,还是其他方法把控制台异常日志输出到文件不。事实上,我们想的只是抓取控制台的日志!而不是每次logger.info() .error() 来手动输出。logback这么强大,我也相信是有办法捕获到的。于是今天去翻了下logback的官方文档配置,果不其然找到了我想要的东西。(这里也在提醒下看官方文档困难的朋友,包括我。一定要尽力去克服这个障碍。很多中文文档是不全,而且有坑的)。[https://logback.qos.ch/manual/configuration.html ]
下面进入今天的主题。
打开网页,搜索Listening to status messages。
蓝色部分大概意思是您还可以将StatusListener附加到StatusManager,以便您可以立即采取措施来响应状态消息,特别是在进行logback配置后发生的消息。 注册一个状态监听器是一个方便的方式来监督logback的内部状态,无需人工干预。OnConsoleStatusListener 类名应该很好理解他的用途了。当然也可以通过启动参数配置, 这里我们演示第一种:
java -Dlogback.statusListenerClass=ch.qos.logback.core.status.OnConsoleStatusListener
- 简单配置下logback.xml 方便测试
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<!-- encoders are assigned the type
ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener" />
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>/data/logs/test/test.log</file>
<encoder>
<pattern>%date %level [%thread] %logger{10} [%file:%line] %msg%n</pattern>
</encoder>
</appender>
<root level="info">
<appender-ref ref="FILE" />
<appender-ref ref="STDOUT" />
</root>
</configuration>
- springboot主函数
@SpringBootApplication
@Import({DatabaseConfig.class})
@EnableAutoConfiguration
@Controller
public class Application extends SpringBootServletInitializer{
final static Logger logger = LoggerFactory.getLogger(Application.class);
public static void main(String[] args) {
LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
StatusManager statusManager = lc.getStatusManager();
OnConsoleStatusListener onConsoleListener = new OnConsoleStatusListener();
statusManager.add(onConsoleListener);
SpringApplication.run(Application.class,args);
}
@RequestMapping("/")
public void index() {
logger.info("----------- start ---------------");
//制造一个运行时异常,这里没有捕获
int x = 1/0;
}
}
现在我们启动项目,然后用postman或者RESTful 工具调用index()方法。
在/data/logs/test/test.log 下就能找到和我们控制台一样输出的异常日志。
如下图:
这种方式是不是比上一个方法更好了。
这里也要感谢留言的朋友,不然我也不会继续去研究这个部分了。