Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 关于logback的AsyncAppender_Java_Logging_Logback_Slf4j - Fatal编程技术网

Java 关于logback的AsyncAppender

Java 关于logback的AsyncAppender,java,logging,logback,slf4j,Java,Logging,Logback,Slf4j,当我在logback中检查AsyncAppender的文档时,我没有找到像线程池设置这样支持AsyncAppender的东西 这是否意味着只有1个线程使用阻塞队列中的日志事件?而日志事件可以由多个线程生成,比如20-40 谢谢 Leon我还没有检查源代码,但我相当肯定池中有一个线程。原因是,由于任务的本质是单线程的,因此多线程处理这个过程没有什么意义。如果你正在写一个文件:不可能同时在一个文件上附加两条消息。 也许您希望字符串格式和toString方法能够在线程外调用。。。我预计不会,因为日志消

当我在logback中检查AsyncAppender的文档时,我没有找到像线程池设置这样支持AsyncAppender的东西

这是否意味着只有1个线程使用阻塞队列中的日志事件?而日志事件可以由多个线程生成,比如20-40

谢谢


Leon

我还没有检查源代码,但我相当肯定池中有一个线程。原因是,由于任务的本质是单线程的,因此多线程处理这个过程没有什么意义。如果你正在写一个文件:不可能同时在一个文件上附加两条消息。 也许您希望字符串格式和toString方法能够在线程外调用。。。我预计不会,因为日志消息的参数很可能在调用后不久被修改。同步性主要是为了防止I/O阻塞(如磁盘延迟)影响性能关键代码。

来自:

AsyncAppender在BlockingQueue中缓冲事件。由AsyncAppender创建的工作线程从队列头获取事件,并将它们分派给连接到AsyncAppender的单个appender

看看代码;AsyncAppenderBase启动线程的单个实例,以从appender的blockingQueue获取事件

因此,是的,只有一个工作线程,这个线程负责消费可能由多个应用程序线程发出的日志事件

如果您担心此工作线程可能无法在生成这些事件时尽快处理这些事件,则可以调整以下属性:

queueSize:阻塞队列的最大容量。默认情况下,queueSize设置为256。 discardingThreshold:默认情况下,当阻塞队列剩余容量为20%时,它将丢弃级别跟踪、调试和信息的事件,只保留级别警告和错误的事件。若要保留所有事件,请将discardingThreshold设置为0。
您可以增加queueSize以确保不会丢失任何事件,尽管这是以资源使用为代价的,因为保留的事件将位于应用程序的堆上,直到它们被分派到底层appender。或者,您可以通过设置丢弃阈值来提高性能(以丢失低优先级事件为代价)。

非常感谢!实际上,我将使用slf4jlogback将一些业务数据记录到文件中,并让其他deamon进程使用该日志文件。