目前我正在使用Java util将日志记录到可以配置的文件中java.util.logging.FileHandler.pattern.我想在日志文件名中附加一个时间戳.我还必须从java.util.logging.FileHandler.pattern属性中获取日志文件路径.
我试图浏览Java日志API的教程:
www.vogella.com/articles/Logging/article.html
但是生成的文件是空的(在Netbeans,Eclipse中测试以及从cmd运行jar).日志消息仅显示在控制台中.
以下是项目中使用的文件.这种行为可能是什么原因?
项目:de.vogella.logger
MyHtmlFormatter.java
package de.vogella.logger;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.logging.Formatter;
import java.util.logging.Handler;
import java.util.logging.Level;
import java.util.logging.LogRecord;
//This custom formatter formats parts of a log record to a single line
class MyHtmlFormatter extends Formatter {
// This method is called for every log records
public String format(LogRecord rec) {
StringBuffer buf = new StringBuffer(1000);
// Bold any levels >= WARNING
buf.append("<tr>");
buf.append("<td>");
if (rec.getLevel().intValue() >= Level.WARNING.intValue()) {
buf.append("<b>");
buf.append(rec.getLevel());
buf.append("</b>");
} else {
buf.append(rec.getLevel());
}
buf.append("</td>");
buf.append("<td>"); …Run Code Online (Sandbox Code Playgroud) 两个项目:产品(项目-A)和A(项目-B)的汽车基准项目.
在B的构建文件中,我们需要调用A的构建文件来运行构建和bundle-with-app-server过程,如下所示:
<ant antfile="${build-file-A}" inheritall="false" target="all" />
Run Code Online (Sandbox Code Playgroud)
而且,在项目B中,我们有许多使用java.util.logging(JDK Logging Framework)输出消息的Ant任务.
问题是,在该行之后,所有jdk记录器输出都消失了.
通过调试,我发现在项目A的构建文件初始化过程中,项目A中的静态定义的东西将运行LogManager.readConfiguration(InputStream),它会加载一个仅包含单个类的记录器配置的配置文件.
在期间readConfiguration,LogManager.reset()将被称为; 在期间reset,每个记录器的每个处理程序都将被删除.由于<ant>将目标构建文件加载到调用者的同一进程,因此将删除所有处理程序.
因此,除了可配置的类之外,由于缺少输出处理程序,使用jdk logger的每个其他类都无法输出消息.
我的问题是:
有没有办法解决这个问题,除了:
<exec>运行项目A的构建文件;readConfiguration()以便在<ant>调用后从默认配置文件中恢复默认的JDK日志记录设置.请注意,我无法修改项目A以防止出现此问题.
是否可以将记录器包装为slf4j?
例如,在调试模式下,当我检查时org.slf4j.LoggerFactory.getLogger(loggerName),我可以看到记录器(这里java.util.logging):

我想做的事情如下:
// Get the real logger, cast in java.util.logging
java.util.logging.Logger myLogger = LoggerFactory.getLogger(loggerName))...;
// Use the java.util.logging methods
myLogger.setLevel(Level.parse(level));
Run Code Online (Sandbox Code Playgroud) 我logging.properties在Eclipse这个样子,当我最初发布这个问题:
handlers = java.util.logging.ConsoleHandler
org.apache.catalina.core=OFF
java.util.logging.ConsoleHandler.level = FINE
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
java.util.logging.SimpleFormatter.format=JUL %4$s: %2$s%n%4$s: %5$s%n
Run Code Online (Sandbox Code Playgroud)
我在使用此配置的Linux服务器上遇到同样的问题:
handlers = 2localhost.org.apache.juli.FileHandler, org.apache.juli.FileHandler
.handlers = org.apache.juli.FileHandler
2localhost.org.apache.juli.FileHandler.level = INFO
2localhost.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
2localhost.org.apache.juli.FileHandler.prefix = localhost.
org.apache.juli.FileHandler.level = ALL
org.apache.juli.FileHandler.formatter = java.util.logging.SimpleFormatter
org.apache.juli.FileHandler.directory = ${catalina.base}/logs
java.util.logging.SimpleFormatter.format=tomcat: %4$s: %2$s%n%4$s: %5$s%n
org.apache.catalina.handlers = org.apache.juli.FileHandler
org.apache.catalina.startup.level = SEVERE
org.apache.catalina.session.ManagerBase.level = SEVERE
org.apache.catalina.core.AprLifecycleListener.level=SEVERE
org.apache.catalina.connector.level = SEVERE
org.apache.coyote.level=SEVERE
org.apache.catalina.level=ALL
org.apache.catalina.startup.HostConfig.level = SEVERE
org.apache.catalina.loader.WebappClassLoader.level = SEVERE
org.apache.catalina.session.ManagerBase.level = INFO
# ServletContext logger
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].level = ALL
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].handlers = 2localhost.org.apache.juli.FileHandler …Run Code Online (Sandbox Code Playgroud) 我尝试了以下记录器
所有这些都需要在类级别进行LOGGER声明,如下所示
private final static java.util.logging.Logger.Logger LOGGER = java.util.logging.Logger.Logger.getLogger(MyClass.class.getName());
private final Logger slf4jLogger = LoggerFactory.getLogger(SLF4JHello.class);
private final static Logger log4jLogger = Logger.getLogger(Log4jHello.class);
Run Code Online (Sandbox Code Playgroud)
这看起来很可怕,java中是否有一个不需要此声明的记录器框架?
我正在寻找的是,我可以有一个全球宣言
private final static Logger Logger = Logger.getLogger(MyApp.class);
Run Code Online (Sandbox Code Playgroud)
但是当我从类XXX.class 调用Logger.log(..)时,Logger应该使用XXX.class名称.
我正在开发一个Spring Boot Web应用程序,我将一个长时间运行的进程添加到ScheduledExecutorService.
为了确保它的行为方式,我认为我正在使用System.out.println()来调试长时间运行的进程.
我的问题是我不断得到这些
NioEndpoint FINER | 超时完成:处理的密钥= 1; 现在= 1492721057929; nextExpiration = 1492721057927; keyCount = 0; hasEvents = FALSE; eval = false {timeout()/ 18} 04:44.714 NioEndpoint FINER | 超时完成:处理的密钥= 0; 现在= 1492721058713; nextExpiration = 1492721058712; keyCount = 0; hasEvents = FALSE; eval = false {timeout()/ 17} 04:44.931 NioEndpoint FINER | 超时完成:处理的密钥= 1; 现在= 1492721058931; nextExpiration = 1492721058929; keyCount = 0; hasEvents = FALSE; eval = false {timeout()/ 18} 04:44.718 NioEndpoint FINER | 超时完成
在输出窗口中发送垃圾邮件,这使得破解其他日志记录变得不可能.
我尝试添加logging.level.root=ERROR到application.properties,但是没有删除它们.
如何让它们不显示以及它们表示什么? …
我在Windows Server 2016上有一个Java 10应用程序,它使用java.util.logging不断写入文件.在Windows文件资源管理器中,"上次修改"和"大小"列不会更新.按[F5]不会更新详细信息.DOS DIR给出了同样错误的答案.右键单击>属性>详细信息提供了一个甚至不同(和更旧)的答案.
只TYPE在文件的记事本中运行DOS 或打开/关闭(不保存),似乎导致文件资源管理器和DOS DIR更新.
我假设Java代码是正确的,flush()因为Windows Server 2008上的Java 8上的相同类导致文件资源管理器更新.另外,当运行TYPE和记事本时,我也看到与系统时钟匹配的带时间戳的记录,但在"上次修改"之后.
所以我假设Windows Server 2016有一些东西.任何想法要检查什么?
我有一个使用外部库的java程序.主程序用于log4j记录其消息和库使用java.util.logging.
我的问题是来自外部库和主程序的日志消息在控制台中混合.
我想将来自外部库的所有日志消息重定向到文件.我试着用logging.properties文件做到这一点:
handlers= java.util.logging.FileHandler
.level= INFO
java.util.logging.FileHandler.pattern = foo.log
java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter
Run Code Online (Sandbox Code Playgroud)
该文件初始化为:
System.setProperty("java.util.logging.config.file", "logging.properties");
Run Code Online (Sandbox Code Playgroud)
不幸的是,来自外部库的日志消息不断出现在控制台中.我应该使用类似slf4j拦截日志消息的东西java.util.logging吗?
感谢您的时间.
Java日志记录配置文件允许我定义命名记录器的属性,例如
name.heikoseeberger.heikotron.level = FINE
name.heikoseeberger.heikotron.handlers = java.util.logging.FileHandler
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.现在我想配置特定的 FileHandler,例如使用特定的输出文件.不幸的是我只知道如何配置已存在于配置文件中的"全局" FileHandler:
java.util.logging.FileHandler.pattern = %h/java%u.log
java.util.logging.FileHandler.limit = 50000
java.util.logging.FileHandler.count = 1
java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter
Run Code Online (Sandbox Code Playgroud)
我不想配置这个,而是与我的自定义Logger相关联的实例.我已经尝试了以下内容,但没有成功:
name.heikoseeberger.heikotron.java.util.logging.FileHandler.pattern = %h/heikotron.log
name.heikoseeberger.heikotron.java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter
Run Code Online (Sandbox Code Playgroud)
是否可以设置特定FileHandler实例的属性?如果是,那么如何识别/命名?