相关疑难解决方法(0)

如何使用属性文件设置java日志记录?(java.util.logging的)

我有一个愚蠢的java日志记录问题:我正在从我的应用程序配置文件加载日志记录配置 - 但它只是在读取文件后没有记录任何内容(这看起来很像你将在网上找到的例子,除了额外的应用程序配置 - 删除它也没有帮助)."初始化..."日志行显得很好,但"启动应用程序"和任何其他消息既没有记录到控制台,也没有创建日志文件.我在这里错过了什么?

Logger代码如下所示:

...
Logger log = Logger.getLogger("myApp");
log.setLevel(Level.ALL);
log.info("initializing - trying to load configuration file ...");

Properties preferences = new Properties();
try {
    FileInputStream configFile = new FileInputStream("/path/to/app.properties");
    preferences.load(configFile);
    LogManager.getLogManager().readConfiguration(configFile);
} catch (IOException ex)
{
    System.out.println("WARNING: Could not open configuration file");
    System.out.println("WARNING: Logging not configured (console output only)");
}
log.info("starting myApp");
...
Run Code Online (Sandbox Code Playgroud)

这是配置文件:

appconfig1 = foo
appconfig2 = bar

# Logging
handlers = java.util.logging.FileHandler, java.util.logging.ConsoleHandler
.level = ALL

# File Logging
java.util.logging.FileHandler.pattern = %h/myApp.log
java.util.logging.FileHandler.formatter = …
Run Code Online (Sandbox Code Playgroud)

java logging

78
推荐指数
4
解决办法
23万
查看次数

更改Logger实例的全局设置

我正在使用java.util.logging.Logger作为我的应用程序的日志记录引擎.每个类使用它自己的记录器,即每个类具有:

private final Logger logger = Logger.getLogger(this.getClass().getName());
Run Code Online (Sandbox Code Playgroud)

我想为我的所有类设置一个日志记录级别,并能够更改它(即,将设置放在一个地方).有没有办法做到这一点,除了使用全局Level变量并手动设置每个记录器?

java logging

41
推荐指数
4
解决办法
6万
查看次数

在运行时设置java.util.logging.config.file

我试图在运行时设置java util日志配置文件,以避免必须将其设置为VM参数.但这只是行不通.每当我尝试重新读取配置时,都会禁用日志记录.

请参阅以下代码段:

package test;

import java.io.FileInputStream;
import java.util.logging.Level;
import java.util.logging.LogManager;
import java.util.logging.Logger;

public class A {
  private static final Logger LOGGER= Logger.getLogger(A.class.getName());

  public static void main(String[] args) throws Exception {
    System.out.println("--- start");
    LOGGER.log(Level.SEVERE, "SEVERE 1");
    LOGGER.log(Level.FINEST, "FINEST 1");
    LogManager.getLogManager().readConfiguration();
    LOGGER.log(Level.SEVERE, "SEVERE 2");
    LOGGER.log(Level.FINEST, "FINEST 2");
    LogManager.getLogManager().readConfiguration(new FileInputStream("/tmp/logging.properties"));
    LOGGER.log(Level.SEVERE, "SEVERE 3");
    LOGGER.log(Level.FINEST, "FINEST 3");
    System.out.println("--- end");
  }
}
Run Code Online (Sandbox Code Playgroud)

如果我运行没有任何VM参数的类,这是输出:

--- start
09.11.2012 09:59:25 test.A main
SCHWERWIEGEND: SEVERE 1
09.11.2012 09:59:25 test.A main
SCHWERWIEGEND: SEVERE 2
--- end
Run Code Online (Sandbox Code Playgroud)

如您所见,仅记录SEVERE级别,因为这是JREs logging.properties的默认值.通话LogManager#readConfiguration() …

java logging runtime java.util.logging

8
推荐指数
1
解决办法
2万
查看次数

如何正确初始化记录器?

我有以下问题:我想使用java.util.logging.Logger.没有我发现不同的资源,1,2,3,如何能够修改记录的行为.

特别是在2 a(在我看来)的问题中,给出了根据类名初始化记录器的良好结构.如果需要,这还允许在基于包的级别上修改详细程度以进行调试.

经过一番深入研究后发现,全局记录器和"空"记录器(带名称"")不一样.另请参见下面的示例.我刚刚创建了一个记录器foo.Bar,它锚定在空记录器而不是被调用的记录器上foo.只有在我第一次创建记录器时bar,记录器bar.Baz才会正确锚定.

这使得这个问题中的方法主要无用,因为我们不能假设之前创建的父记录器.根据需要,我必须根据需要解析类名并创建记录器.

我是否正确我必须添加一些static {...}代码以递归方式初始化记录器,然后才能初始化自己的记录器?如果多个类调用Logger.getLogger(String)包记录器的方法(导致总体上多次调用,例如两者bar.Bazbar.FooBaz获取记录器bar),这会产生任何负面影响吗?

import java.util.Enumeration;
import java.util.logging.LogManager;
import java.util.logging.Logger;
public class TestLogger
{
    public static void main(String[] args)
    {
        // Create the logger directly
        Logger.getLogger("foo.Bar");
        // Create the logger objects step-by-step
        Logger.getLogger("bar");
        Logger.getLogger("bar.Baz");
        // Put the available loggers to output
        Enumeration<String> e = LogManager.getLogManager().getLoggerNames();
        while(e.hasMoreElements()) …
Run Code Online (Sandbox Code Playgroud)

java logging java.util.logging

6
推荐指数
1
解决办法
1656
查看次数

标签 统计

java ×4

logging ×4

java.util.logging ×2

runtime ×1