java - Logback 线程池
问题描述
我使用 Logback 进行日志记录,我有一个问题。我将 AsyncAppender 与 ConsoleAppender 一起使用。当应用程序启动时,它会使用“logback-”线程名称创建线程池。所有的日志记录工作都由“AsyncAppender-Worker-”线程完成。出于什么目的创建了具有“logback-”线程名称的线程池,它的作用是什么?
解决方案
简短的回答
这些线程用于 logback 需要在后台执行的所有其他工作 - 基于时间的翻转、套接字附加程序、异步 SMTP 附加程序等。
稍微长一点的答案
通过在 logback 代码库上对“logback-”进行搜索,我只找到了一个使用它的地方:ExecutorServiceUtil
.
这个帮助类用于创建执行器服务(只能由 访问Contextbase.getScheduledExecutorService()
),通过跟踪它的用法,我发现了这些用法:
- 基于时间的翻转将异步压缩(如果启用压缩)并清理旧存档。我认为这是因为在应用程序线程上压缩旧文件将是一件坏事。
- 套接字附加程序有一个连接器线程,如果连接失败,它会重新连接,并且有一个正在由后台线程处理的异步消息缓冲区。
- 如果以这种方式配置,SMTP 附加程序可以是异步的 - 然后它也将使用后台执行程序。
这是一份详尽的清单。请注意,所有这些都是从源代码中读取的。基于时间的翻转虽然异步是绝对有意义的,但没有记录在案,因此可能会改变。socket appender 和 SMTP appender 被记录为使用后台线程。
推荐阅读
- amazon-web-services - 如何从 Postman 访问 API 网关的阶段变量
- django - 如何使用 django 从 html 表单中插入多个乘客信息,如姓名、年龄、性别和泊位信息
- c - VSCode“转到定义”并查找未找到函数和变量
- reactjs - 如何在 useEffect 中使用 setTimeout 重置 React 钩子状态
- tabulator - 滚动不适用于制表符中的长内容
- angular - Angular:Async Await-Promise 中的 EventListener
- c - 为什么我的 C 代码没有只使用一个 get() 来获取第一个输入
- javascript - 接受本地 Apollo 的 RESTDataSource 上的自签名证书
- xamarin.forms - 如何将 DataGrid 列绑定到所选项目的内部列表
- sql - 谁能解释“WHERE CAST(SUBSTR(M.year,-4) AS UNSIGNED) < 1970”和“m.year<1970”之间的区别