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

回程中的CyclicBufferAppender

严欣怡
2023-03-14

在logback中有一个名为CyclicBufferAppender的appender,似乎没有它的示例。它是做什么的?它如何在rollingFileAppender的上下文中工作?它是与RollingFileAppender一起工作还是独立工作?它类似于Asyncappender吗?任何以编程方式编写的示例都是受欢迎的。

共有1个答案

江高飞
2023-03-14

让我分享一个例子,说明我如何使用它让我的Spring Boot web应用程序在UI中显示自己的日志消息。

我有一个CyclicBufferAppender子类,InmemoryAppender,其唯一目的是让Spring将其作为bean进行管理。(受@neemepraks回答的启发。)

@Component
public class InMemoryAppender extends CyclicBufferAppender<ILoggingEvent> implements SmartLifecycle {
    @Override
    public boolean isRunning() {
        return isStarted();
    }
}

我在启动过程中添加该组件(这意味着它将错过Spring Boot启动日志消息,如链接的答案所示,但我对此没有意见):

public static void main(String[] args) {
    ConfigurableApplicationContext context = SpringApplication.run(WebApplication.class, args);

    LoggerContext loggerContext = (LoggerContext)LoggerFactory.getILoggerFactory();
    Logger rootLogger = loggerContext.getLogger(Logger.ROOT_LOGGER_NAME);
    rootLogger.addAppender(context.getBean(InMemoryAppender.class));
}
@Controller
@RequestMapping(path = "/logs")
public class LogController {
    public LogController(InMemoryAppender appender) {
        this.appender = appender;
    }

    private final InMemoryAppender appender;

    @GetMapping
    public String index(Model model) throws Exception {
        ILoggingEvent[] events = new ILoggingEvent[appender.getLength()];
        for (int i = 0; i < appender.getLength(); i++) {
            events[i] = appender.get(i);
        }
        model.addAttribute("logs", events);
        return "logs/index";
    }
}
<h1>Logs</h1>

<table style="border-collapse: separate; border-spacing: 2px;">
    <thead>
        <tr>
            <th scope="col">Timestamp</th>
            <th scope="col">Level</th>
            <th scope="col">Message</th>
        </tr>
    </thead>
    <tbody>
        <tr th:each="log: ${logs}" th:object="${log}">
            <td th:text="*{#dates.format(timeStamp, 'yyyy-MM-dd HH:mm:ss.SSS')}" style="white-space: nowrap;">[timestamp]</td>
            <td th:text="*{level}">[level]</td>
            <td th:text="*{message}">[message]</td>
        </tr>
    </tbody>
</table>
 类似资料:
  • 不管什么原因,我的回拨电话打不通。基本上,我将使用我创建的tcp服务器进行群组聊天。我试图在java中创建一个线程,然后使用回调将我从套接字获得的信息提供给主活动。 当前收到得错误: 客户端任务 最后,我想通过响应事件传递一个字符串,它将获得它的主要内容。

  • 我使用DexGuard进行模糊处理。我有来自崩溃日志和映射文件的堆栈跟踪。当我运行,为其提供堆栈跟踪和映射文件,输出仍为模糊格式。

  • 本文向大家介绍Ruby编程中关于中断和返回的用法教程,包括了Ruby编程中关于中断和返回的用法教程的使用技巧和注意事项,需要的朋友参考一下  return,break,next 这几个关键字的使用都涉及到跳出作用域的问题,而他们的不同 则在于不同的关键字跳出去的目的作用域的不同,因为有代码块则导致有一些地方需要格外注意。 return 常用方式 通常情况下的return语句和大家理解的意思是相同的

  • 问题内容: 在android中,我正在创建用于url连接的线程。在线程中,我将响应消息存储在全局声明的字符串中。当我访问method方法时,它返回null。 当我调用该方法时,它返回null。 问题答案: 您真的只想使用它,尝试一下

  • 我正在尝试创建一个存储过程,根据学生所上的课程(显然)来创建学生时间表。但是,我认为连接导致存储过程返回双倍的行。 这是输出:输出 对如何解决这个问题有什么建议吗? 这是我的数据库表的快照

  • 问题内容: 我有一个返回JSON的MVC控制器。我想使用jQuery读取/获取JSON并遍历JSON项目/行。 基本上,我正在阅读一堆评论,然后逐一显示评论。 有人有代码示例吗? 我正确地获取了json。请参阅下面的返回数据。 谢谢 编辑: 如何循环这些由控制器返回的json?我需要循环3次,然后对于每一行,我需要访问该行中的所有键和值。 问题答案: 第一个问题的答案是允许Json在GET中工作。