如何通过属性配置java.util.logging以使用标准输出?
如何通过属性配置java.util.logging以使用标准输出而不是标准错误 我的当前属性文件如何通过属性配置java.util.logging以使用标准输出?,java,logging,properties,Java,Logging,Properties,如何通过属性配置java.util.logging以使用标准输出而不是标准错误 我的当前属性文件 # Logging handlers = java.util.logging.ConsoleHandler # Console Logging java.util.logging.ConsoleHandler.level = ALL java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter jav
# Logging
handlers = java.util.logging.ConsoleHandler
# Console Logging
java.util.logging.ConsoleHandler.level = ALL
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
java.util.logging.SimpleFormatter.format = %1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS %4$s %2$s %5$s%6$s%n
方法1:
您需要告诉java日志管理器读取配置文件
试试看{
InputStream configFile=MyApp.class.getResourceAsStream(“/path/to/app.properties”);
LogManager.getLogManager().readConfiguration(configFile);
}捕获(IOE异常)
{
e、 printStackTrace();
}
方法2:
运行JVM时,可以将属性文件的路径作为参数传递
java -Djava.util.logging.config.file=/path/to/log.properties
从
java.util.logging.StreamHandler
派生一个新的处理程序,并使用其
具有.handlers属性的完全限定名
(如果使用ApacheMaven,请注意surefire插件使用stdout
作为其分叉子级的一种方法,因此在测试期间会出现损坏警告,请参阅。)
例如(Java9+)
布局目录:
mkdir -p /tmp/logger/{src/org.foo/{{classes,tests}/org/foo/logging{,/internal},resources},{build/modules/org.foo,dist}}
验证布局:
cd /tmp/logger && gio tree --hidden
过滤器(可选)
假人
package org.foo.logging;
import java.io.IOException;
import java.util.Arrays;
import java.util.Optional;
import java.util.logging.Logger;
import org.foo.logging.internal.LoggingPropertiesConfigurer;
public class Dummy
{
static {
try {
final String fileName = System.getProperty(
"java.util.logging.config.file");
final String klassName = System.getProperty(
"java.util.logging.config.class");
if (klassName == null && fileName == null)
new LoggingPropertiesConfigurer();
} catch (final IOException e) {
throw new ExceptionInInitializerError(e);
}
}
static Optional<Logger> getLogger()
{
/*
* Note that for any org.foo.Bar.Baz.Quux member class
* Class::getName returns an org.foo.Bar$Baz$Quux string,
* therefore name accordingly these loggers, if any, in
* the properties files, e.g.
* org.foo.Bar$Baz$Quux.level = WARNING
*/
return Optional.ofNullable(Logger.getLogger(
Dummy.class.getName()));
}
public static void main(String[] args)
{
/*
* A weakly-reachable logger.
*
* See java.base/java.lang.ref.Reference#reachabilityFence(Object)
*/
Dummy.getLogger().ifPresent(logger -> logger.warning(() ->
Arrays.toString(args)));
}
}
编译类:
javac -Xlint -d build/modules --module-source-path src/\*/classes/ $(find src/*/classes/ -type f -name \*.java)
描述一个模块:
java --describe-module org.foo --module-path build/modules
将属性文件编写为src/org.foo/resources/logging.properties
## From [java.home]/conf/logging.properties:
# handlers = java.util.logging.ConsoleHandler
handlers = org.foo.logging.internal.StandardOutConsoleHandler
java.util.logging.SimpleFormatter.format = %1$tY-%<tm-%<td %<tH:%<tM:%<tS %4$s %2$s %5$s%6$s%n
## See the Javadoc of java.logging/java.util.logging.StreamHandler.
org.foo.logging.internal.StandardOutConsoleHandler.level = ALL
# org.foo.logging.internal.StandardOutConsoleHandler.filter = org.foo.logging.internal.WallClockTimeFilter
org.foo.logging.internal.StandardOutConsoleHandler.formatter = java.util.logging.SimpleFormatter
org.foo.logging.internal.StandardOutConsoleHandler.encoding = ISO-8859-1
打包类和复制的资源(请注意结尾处的“.”):
尝试使用重定向的stdout
,stderr
运行。
Stdout
日志记录。当本地时间允许时,取消注释logging.properties
中与时间相关的筛选器行:
java -Xdiag --module-path dist/logger-0.0.1.jar --module org.foo raison d\'être 2>/dev/null
Stderr
日志记录。将Java安装目录的实际路径替换为/path/to/jdk:
谢谢,但问题不是读取属性文件并将其设置为日志管理器。我想知道如何将记录器配置为使用标准输出,而不是通过属性文件使用错误输出。
module org.foo {
requires transitive java.logging;
exports org.foo.logging;
exports org.foo.logging.internal to
java.logging;
}
javac -Xlint -d build/modules --module-source-path src/\*/classes/ $(find src/*/classes/ -type f -name \*.java)
java --describe-module org.foo --module-path build/modules
## From [java.home]/conf/logging.properties:
# handlers = java.util.logging.ConsoleHandler
handlers = org.foo.logging.internal.StandardOutConsoleHandler
java.util.logging.SimpleFormatter.format = %1$tY-%<tm-%<td %<tH:%<tM:%<tS %4$s %2$s %5$s%6$s%n
## See the Javadoc of java.logging/java.util.logging.StreamHandler.
org.foo.logging.internal.StandardOutConsoleHandler.level = ALL
# org.foo.logging.internal.StandardOutConsoleHandler.filter = org.foo.logging.internal.WallClockTimeFilter
org.foo.logging.internal.StandardOutConsoleHandler.formatter = java.util.logging.SimpleFormatter
org.foo.logging.internal.StandardOutConsoleHandler.encoding = ISO-8859-1
cp -t build/modules/org.foo src/org.foo/resources/logging.properties
jar --create --module-version 0.0.1 --file dist/logger-0.0.1.jar --main-class org.foo.logging.Dummy -C build/modules/org.foo/ .
java -Xdiag --module-path dist/logger-0.0.1.jar --module org.foo raison d\'être 2>/dev/null
java -enablesystemassertions -Xdiag -Djava.util.logging.config.file=/path/to/jdk/conf/logging.properties --module-path dist/logger-0.0.1.jar --module org.foo raison d\'être 2>/dev/null