java.util.logging-如何从应用程序';什么是运行时间?(HSQLDB)
在我的应用程序中,我想要一些格式化方法。 为此,我编写了一个java.util.logging-如何从应用程序';什么是运行时间?(HSQLDB),java,logging,formatting,hsqldb,java.util.logging,Java,Logging,Formatting,Hsqldb,Java.util.logging,在我的应用程序中,我想要一些格式化方法。 为此,我编写了一个SingleLineFormatter extends Formatter 现在我正试图设置所有记录器以使用它,但无法解决这个问题 LogManager.getLogManager().readConfiguration((InputStream) configIS); Collections.list(LogManager.getLogManager().getLoggerNames()).forEa
SingleLineFormatter extends Formatter
现在我正试图设置所有记录器以使用它,但无法解决这个问题
LogManager.getLogManager().readConfiguration((InputStream) configIS);
Collections.list(LogManager.getLogManager().getLoggerNames()).forEach(
loggerName -> {
List<Handler> handlers = Arrays.asList(Logger.getLogger(loggerName).getHandlers());
System.out.println(" * Logger " + loggerName + ": " + handlers.size());
handlers.forEach(handler -> System.out.println(" HF: " + handler.getFormatter()));
//handlers.forEach(handler -> handler.setFormatter(new SingleLineFormatter()));
}
);/**/
log.info("Logging test");
但是,记录器的其余部分仍然使用它们配置的任何东西。可能只是七月的违约
Oct 02, 2018 10:42:10 PM org.hsqldb.persist.Logger logInfoEvent
INFO: checkpointClose start
我知道我可以在JVM中通过JUL的logging.properties
来管理它。
但我想发布应用程序,并希望所有日志消息的格式相同
如何强制使用我的格式化程序格式化所有将于7月发送的邮件?
有-Djava.util.logging.config.file=/path/to/app.properties
,但这超出了我的特定案例的范围。(而且无论如何都不起作用。)
更新:看起来第三方日志记录不会在7月份完成。所以问题是-如果是这样,我如何配置其他框架
这是正在加载到LogManager
的文件。有相当多的实验,所以不是所有的信号都是正确的
# Handlers
handlers = java.util.logging.ConsoleHandler java.util.logging.FileHandler
# Console
# The logging of the app actually reacts to this line.
java.util.logging.ConsoleHandler.formatter = cz.dynawest.logging.SingleLineFormatter
#java.util.logging.ConsoleHandler.formatter = cz.dynawest.logging.SimplestFormatter
java.util.logging.ConsoleHandler.level = ALL
# File
java.util.logging.FileHandler.level = ALL
java.util.logging.FileHandler.pattern = app.log
java.util.logging.FileHandler.formatter = cz.dynawest.logging.SingleLineFormatter
java.util.logging.FileHandler.limit = 0
java.util.logging.FileHandler.append = true
# Default global logging level.
.formatter = cz.dynawest.logging.SimplestFormatter
.level = INFO
#global.formatter = cz.dynawest.logging.SimplestFormatter
#root.formatter = cz.dynawest.logging.SimplestFormatter
#cz.dynawest.csvcruncher.App.formatter = cz.dynawest.logging.SimplestFormatter
#cz.dynawest.csvcruncher.App.handlers = java.util.logging.ConsoleHandler
#.useParentHandlers = false
# Various customizations.
org.apache.commons.beanutils.converters.level=INFO
为了符合lib可能希望我用于日志记录的内容,我切换到SLF4J和Logback。没有帮助
因此,我查看了导致日志记录问题的特定库—HSQLDB
问题是,它试图掌握所有通用框架,却绕过了我在外部配置它的尝试。以下是一个例子:
然后我发现:
HyperSQL还支持log4J和JDK日志记录。传递给内部日志的事件信息与传递给外部日志框架的事件信息相同。这些框架通常在HyperSQL外部配置。日志消息包括字符串“hsqldb.db.”,后跟生成消息的数据库的唯一id(16个字符的字符串),因此可以在多数据库服务器上下文中识别它们
由于默认的JDK日志框架有几个缺点,HyperSQL配置此日志框架以实现更好的操作。如果不希望HyperSQL配置JDK日志框架,则应在环境中包含系统级属性hsqldb.reconfig_logging=false
我尝试设置hsqldb.db.
Logger,但没有成功
所以我想我会坚持使用JUL,并关闭hsqldb.reconfig\u logging=false
顺便说一下
在我的应用程序中,我想要一些格式化方法。为此,我编写了一个>SingleLineFormatter extends Formatter
自从jdk7之后
这将读取配置,并将其应用于找到的所有处理程序
Oct 02, 2018 10:42:10 PM cz.dynawest.logging.LoggingUtils initLogging
INFO: Log config file not found: #/logging.properties Using LoggingUtils' default.
* Logger cz.dynawest.csvcruncher.App: 0
* Logger global: 0
* Logger cz.dynawest.logging.LoggingUtils: 0
2018-10-02 22:42:10 INFO cz.dynawest.logging.LoggingUtils initLogging: Logging test
* Logger : 2
HF: cz.dynawest.logging.SingleLineFormatter@34c45dca
HF: cz.dynawest.logging.SingleLineFormatter@52cc8049
JUL将仅在代码需要记录器时加载处理程序。因此,可能会错过处理程序,因为记录器本身尚未创建
我如何强制所有将于7月发送的邮件使用我的格式化程序进行格式化
有-Djava.util.logging.config.file=/path/to/app.properties,但这超出了我的特定案例的范围。(而且无论如何都不起作用。)
您已经在访问LogManager,因此可以从Java设置属性,如下所示:
private static void loadProperties() {
Properties props = new Properties();
props.put("java.util.logging.ConsoleHandler.formatter", "cz.dynawest.logging.SingleLineFormatter");
props.put("org.apache.commons.beanutils.converters.level", "INFO");
try(ByteArrayOutputStream out = new ByteArrayOutputStream()) {
props.store(out, "");
LogManager.getLogManager().readConfiguration(new ByteArrayInputStream(out.toByteArray()));
} catch (IOException ioe) {
throw new AssertionError(ioe);
}
}
如果您运行的是JDK 9或更高版本,那么应该使用
看起来第三方日志记录没有经过7月。所以问题是——如果是这样,我该如何配置其他框架
您必须确定这些框架是否相互路由。您只需更改将记录发布到输出源的框架的格式即可。一种方法是在应用程序中使用静态字符串,例如
private static Logger logger = Logger.getLogger("some_value");