Java日志记录 - 如何将输出重定向到记录器的自定义日志文件?

Ral*_*lph 21 java logging

我有关于jdk日志记录配置的问题.我有一个EJB(部署到glassfish),它使用JDK Logging来输出消息.因此我使用一个带有如下代码的命名记录器:

private static Logger logger = Logger.getLogger("org.imixs.workflow");
.....
       logger.fine(" some info...");
....
Run Code Online (Sandbox Code Playgroud)

我知道我可以通过将以下行添加到Glassfish的logging.properties文件中来为我的记录器配置loglevel:

.....
org.imixs.workflow.level=FINE
Run Code Online (Sandbox Code Playgroud)

但是如何为记录器指定输出文件?我想把名为'org.imixs.workflow'的记录器中的所有消息放入一个单独的文件中.这可能吗?

谢谢你的帮助

Pet*_*nto 32

FileHandler的稍微混乱的模式属性可用于此

handlers=java.util.logging.FileHandler
# Default global logging level. 
.level=INFO

#logging level for the foo.bar package
foo.bar.level=CONFIG 
java.util.logging.FileHandler.pattern=%h/java%u.log
Run Code Online (Sandbox Code Playgroud)

模式由一个字符串组成,该字符串包含将在运行时替换的以下特殊组件:

"/"本地路径名分隔符

"%t"系统临时目录

"%h""user.home"系统属性的值

"%g"用于区分旋转日志的世代号

"%u"是解决冲突的唯一编号

"%%"转换为单个百分号"%"

如果要记录到多个文件,则可以通过为多个命名记录器设置多个处理程序来完成

#FileHandler for file1    
java.util.logging.FileHandler.pattern = logging_property_test.log
java.util.logging.FileHandler.limit = 50000
java.util.logging.FileHandler.count = 1
java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter

#FileHandler for file2
logging.FileHandler2.pattern = logging_property_test2.log
logging.FileHandler2.limit = 50000
FileHandler.count = 1
logging.FileHandler2.formatter = java.util.logging.SimpleFormatter


#setting handler for logger1
logging.PropertyTestingLogger.handlers=java.util.logging.FileHandler

#setting handler for logger2
logging.PropertyTestingLogger2.handlers=logging.FileHandler2
Run Code Online (Sandbox Code Playgroud)

你可以看到诀窍是有一个logging.FileHandler2是一个自定义类,除了扩展FileHandler什么都不做

package logging;

import java.io.IOException;
import java.util.logging.FileHandler;

public class FileHandler2 extends FileHandler {

    public FileHandler2() throws IOException, SecurityException {
        super();
    }

}
Run Code Online (Sandbox Code Playgroud)

背景:遗憾的是,Java的创建者并没有期望任何人登录到多个文件.如果查看java.util.logging.FileHandler的源代码,您会发现,类属性加载了pattern属性:

public class FileHandler extends StreamHandler {

   private String pattern;

   private void configure() {

        String cname = getClass().getName();
        pattern = manager.getStringProperty(cname + ".pattern", "%h/java%u.log");
Run Code Online (Sandbox Code Playgroud)

  • 什么是PropertyTestingLogger?它在哪里定义? (2认同)

yai*_*air 11

您应该使用FileHandler.

FileHandler fileHandler = new FileHandler("myLogFile");
logger.addHandler(fileHandler);
Run Code Online (Sandbox Code Playgroud)

有关配置记录器的一些明确示例,请参见示例仓库.

您可能会发现这些答案对于从属性文件进行设置非常有用.

  • 但是也可以通过配置文件执行此操作 - 这样我就不需要在源代码中为日志文件指定硬编码文件名了吗? (3认同)

小智 5

使用java.util.logging,仅通过修改配置文件不可能的.不幸的是,您必须扩展FileHandler并配置该处理程序以过滤您想要记录的内容.