当前位置: 首页 > 面试题库 >

Log4j正在挂起我的应用程序,我在做什么错?

满俊楠
2023-03-14
问题内容

首先了解应用程序的一些背景知识。我有一个应用程序通过线程池并行处理许多独立的任务。现在线程池正在挂起。

以下是我的线程转储的摘录,我的pool-2中的所有线程都被“
pool-2-thread-78”阻止了。尝试写入控制台似乎已锁定,我觉得这很奇怪。谁能为我说明情况?

编辑 :平台详细信息Java版本“ 1.6.0_07” Java(TM)SE运行时环境(内部版本1.6.0_07-b06)Java
HotSpot(TM)客户端VM(内部版本10.0-b23,混合模式,共享)

Ubuntu Linux服务器双四核计算机。

写入printstream时似乎已锁定,我考虑过只是删除控制台附加程序,但是我宁愿知道为什么它会阻塞并根据此知识将其删除。在过去的删除,看看它是否有效已经回来咬我:)

我的log4j中的相关部分

log4j.rootLogger = DEBUG,STDOUT log4j.logger.com.blah = INFO,LOG
log4j.appender.STDOUT = org.apache.log4j.ConsoleAppender log4j.appender.LOG
= org.apache.log4j.FileAppender

线程转储提取

“ pool-2-thread-79” ID = 149在org.apache.log4j.Category.callAppenders(由“
pool-2-thread-78” Id =
148拥有的org.apache.log4j.spi.RootLogger@6c3ba437在org.apache.log4j.Category.forcedLog(Category.java:388)在org.apache.log4j.Category.error(Category.java:302)在com.blah.MessageProcessTask.run(MessageProcessTask)的Category.java:201)
.java:103),位于java.util.concurrent.Executors $
RunnableAdapter.call(Executors.java:441),位于java.util.concurrent.FutureTask $
Sync.innerRun(FutureTask / java:268),位于java.util.concurrent。
Java上的FutureTask.run(FutureTask /
java:54)在java.util.concurrent.ThreadPoolExecutor $
Worker.runTask(ThreadPoolExecutor.java:885)在java.util.concurrent.ThreadPoolExecutor
$ Worker.run(ThreadPoolExecutor.java:907) .lang.Thread.run(Thread.java:619)

“ pool-2-thread-78” Id =
148在java.io.FileOutputStream.writeBytes(本机方法)在Java.io.FileOutputStream.write(FileOutputStream.java:260)在Java.io.BufferedOutputStream.write(BufferedOutputStream)
.java:105)-在java.io.PrintStream.write(PrintStream.java:430)处锁定<0x6f314ba4>(java.io.BufferedOutputStream)-在org.apache处锁定<0xd5d3504>(java.io.PrintStream)
.log4j.ConsoleAppender $
SystemOutStream.write(ConsoleAppender.java:173)在sun.nio.cs.StreamEncoder.writeBytes(StreamEncoder.java:202)在sun.nio.cs.StreamEncoder.implFlushBuffer(StreamEncoder.java:272)
sun.nio.cs.StreamEncoder.flush(StreamEncoder.java:122)处的sun.nio.cs.StreamEncoder.implFlush(StreamEncoder.java:276)-将<0x6243a076>(java.io.OutputStreamWriter)锁定为java。org.apache.log4j的io.OutputStreamWriter.flush(OutputStreamWriter.java:212)(位于org.apache.log4j.helpers.QuietWriter.flush(QuietWriter.java:57)位于org.apache.log4j.WriterAppender.subAppend(WriterAppender.java:315)
org.apache.log4j.AppenderSkeleton.doAppend(AppenderSkeleton.java:230)上的.apache.log4j.WriterAppender.append(WriterAppender.java:159)-将<0x45dbd560>(org.apache.log4j.ConsoleAppender)锁定在组织中。
org.apache.log4j.Category.callAppenders(Category.java:203)上的apache.log4j.helpers.AppenderAttachableImpl.appendLoopOnAppenders(AppenderAttachableImpl.java:65)-锁定<0x6c3ba437>(org.apache.log4j.spi)在org.apache.log4j.Category.forcedLog(Category.java:388)在org.apache.log4j.Category.error(Category.java:302)在com.blah.MessageProcessTask.run(MessageProcessTask.java:103)在java.util.concurrent.Executors
$ RunnableAdapter.call(Executors.java:441)在java.util.concurrent.FutureTask $
Sync.innerRun(FutureTask / java:268)在java.util.concurrent.FutureTask.run
(FutureTask / java:54),位于java.util.concurrent.ThreadPoolExecutor $
Worker.runTask(ThreadPoolExecutor.java:885),位于java.util.concurrent.ThreadPoolExecutor
$ Worker.run(ThreadPoolExecutor.java:907),位于java.lang。
Thread.run(Thread.java:619)907)在java.lang.Thread.run(Thread.java:619)907)在java.lang.Thread.run(Thread.java:619)


问题答案:

您可以使用AsyncAppender更好地将记录器与附加程序分离。

在Windows上,如果单击控制台窗口,这将暂停控制台,例如stdout缓冲区将被填满,并且随着控制台附加程序串行写入,您的应用程序将挂起,直到您释放控制台(按Enter左右)。

考虑将AsyncAppender与log4j一起使用-大多数情况下,这是一个好主意-唯一的问题-退出时AsynAppender缓冲区未完全刷新。



 类似资料:
  • 我正在做一个大学作业,我必须午餐3个服务器处理客户和一个服务器组的领导,这里是场景: 领导者开始。 leader 运行 3 台服务器(必须使用 Runtime.getRuntime().exec() 将它们作为 jar 文件运行); 向服务器发送激活消息以开始为客户端提供服务 客户端开始与服务器通信。 问题是在客户端发出3或4个请求后,服务器挂起,只有当领导者终止时才完成其工作。如果我从cmd手动

  • 我已经阅读了OWASP的XSS预防备忘单,但我并不真正认识到我的应用程序中有这些规则。我不觉得我有那些规则中指出的任何漏洞。 在我的情况下,我应该关注XSS吗?我还能做些什么来保护自己免受XSS的侵害?

  • 我不熟悉Python中的多重处理,并试图弄清楚我是否应该使用池或进程来调用两个函数异步。我有两个函数进行curl调用,并将信息解析成两个独立的列表。根据互联网连接的不同,每个功能可能需要大约4秒钟。我意识到瓶颈在于ISP连接,多重处理不会加快速度,但是让它们都启动异步会很好。另外,这对我来说是一次很好的学习经历,因为我以后会更多地使用它。 我读过Python多处理。池:何时使用应用,apply_a

  • 我试图隐藏Actionbar并改用工具栏,但如果我更改Theme.appcompat.light.NoActionBar,它确实会隐藏,但应用程序在行setContentView(r.layout.activity_main)处崩溃; 尽管它确实使用getSupportActionBar()隐藏。hide();但我不能用这个代码 Toolbar Toolbar=(Toolbar)findViewB

  • 另外,为什么在键入Style标记的name属性时执行Ctrl+Space操作时看不到所有的r.attr元素? 请帮忙。谢了。

  • 我对这段代码有一个问题,因为我似乎找不到问题所在?这是我试图解决的问题:-声明并编写一个名为valid_triangle的函数,它将表示三角形三边长度的三个实数作为参数,并根据这三个长度是否能够构成三角形输出真或假。 关于三角形的以下规则: 三角形只能有正长度的边 三角形任意两条边的长度之和必须大于第三条边的长度