servlets - 为什么 .lck 文件被创建而不被 java 日志记录删除

标签 servlets logging weblogic java.util.logging

我正在尝试使用 java.util.logging 实现应用程序级记录器(部署在 weblogic 中的 webapps)。

我从 apache JULI 日志系统中获取了 ClassLoaderLogManager,因为它已经实现了应用程序级别的日志记录。

这就是我的 servlet 代码 (SimpleServlet.java) 的样子:

ClassLoaderLogManager ClassLoaderLogManager = new ClassLoaderLogManager () ;
String nameoflogger = SimpleServlet.class.getName() ;   
boolean status = ClassLoaderLogManager .addLogger(nameoflogger);   
if(status) 
{
     Logger logger = ClassLoaderLogManager .getLogger(nameoflogger);   
     logger.log(Level.FINEST, "testing SimpleServlet FINEST");
     logger.log(Level.INFO, "testing SimpleServlet INFO");
     logger.log(Level.SEVERE, "testing SimpleServlet SEVERE");   
}    
ClassLoaderLogManager .reset();  

我在 java_home/jre/lib 中有如下的 logging.properties 文件

handlers= java.util.logging.FileHandler

#.level= INFO

# default file output is in user's home directory.

java.util.logging.FileHandler.pattern = %h/java_%g.log
java.util.logging.FileHandler.limit = 200
java.util.logging.FileHandler.count = 10
java.util.logging.FileHandler.append  = true
java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter


# Limit the message that are printed on the console to INFO and above.
#java.util.logging.ConsoleHandler.level = INFO
#java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter

package8.SimpleServlet.handler = java.util.logging.FileHandler

############################################################
# Facility specific properties.
# Provides extra control for each logger.
############################################################

# For example, set the com.xyz.foo logger to only log SEVERE
# messages:
package8.SimpleServlet.level = SEVERE

因此,当我运行 web 应用程序时 - 当我访问 web 应用程序时,我希望创建 java_0.log、java_1.log(日志文件轮换)等。但我也看到了 java0.log.lck、java1.log.lck。

日志文件仅按预期显示 SEVERE 级别的日志。

为什么会这样?如果我在 Java 代码端创建了一个处理程序,关闭该处理程序就可以解决问题。购买 y 不是在这里处理吗?

或者是因为我在使用 org.apache 时使用的是 java.util.logging.FileHandler 而不是 org.apache.juli.FileHandler。 juli.ClassLoaderLogManager ??

最佳答案

当 FileHandler 打开时,您应该会看到锁定文件。如果您看到它们在 VM 退出后仍然存在,那是因为 FileHandler 未关闭,VM 在处理程序关闭 Hook 运行时停止或崩溃,或者在尝试删除它们时发生 I/O 异常。

您可能会遇到 JDK-8060132 Handlers configured on abstract nodes in logging.properties are not always properly closed.相关:JDK-6274920: JDK logger holds strong reference to java.util.logging.Logger instances.

查看配置,您在根记录器上安装了一个 FileHandler,在 SimpleServlet 上安装了一个 FileHandler。由于 ClassLoaderLogManager 没有以 JVM 全局方式使用,安装的默认 LogManager 会在您启动本地 ClassLoaderLogManager 之前创建 FileHandlers。从您拥有的 java_home/jre/lib comfig 中删除 FileHandler 条目,并使用 ClassLoaderLogManager.readConfiguration 方法加载 webapp 本地配置。

关于servlets - 为什么 .lck 文件被创建而不被 java 日志记录删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5730890/

相关文章:

javascript - 获取每个动态创建的输入元素的动态值并将它们分配给单独的变量

java - HTTP 状态 500 - 实例化 servlet 类 example.webApp 时出错

java - 如何使用@PostConstruct 在无状态 bean EJB3 中创建计时器?

java 慢 : entropy related issue

java - 甲骨文一致性 : How to set the timeout on an invoke call in a replicated cache?

java - 无法从 .html 页面执行 servlet

java - 如何将 html 页面(JSP)中选定的信息发送到 servlet?

java - neo4j 记录器不会归档

sql-server - 记录到文件还是数据库更好?

C# HostBuilder 日志记录配置。非通用记录器为空