Glassfish中是否有任何可能的日志单独文件用于不同的包

时间:2014-03-17 05:14:30

标签: logging glassfish java.util.logging

我们使用glassfish作为我们的应用程序服务器。我们想要单独记录消息。 例如,如果来自xxx.company.xxx.service包的日志,则日志文件名为service.log,如果日志来自xxx.company.xxx.dao,则日志文件名为dao.log。

现在,所有日志消息都打印到server.log文件,这是glassfish服务器日志文件。

我知道glassfish正在使用java.util.logging API,如何配置log.propeties文件以及如何使用此logger API。 glassfish是否具有类似Apache Tomcat Juli logger的功能?

1 个答案:

答案 0 :(得分:1)

FileHandler不支持从LogManager按包名生成文件名。 com.sun.enterprise.server.logging.GFFileHandler也没有看到支持它。

如果要为每个包生成文件名,可以创建自定义Handler,在每次发布时创建和关闭FileHandler。

public class PackageNameFileHandler extends Handler {


@Override
public synchronized void publish(LogRecord r) {
    if (isLoggable(r)) {
       try {
           FileHandler h = new FileHandler(fileName(r), Integer.MAX_VALUE, 1, true);
           try {
               h.setLevel(getLevel());
               h.setEncoding(getEncoding());
               h.setFilter(null);
               h.setFormatter(getFormatter());
               h.setErrorManager(getErrorManager());
               h.publish(r);
           } finally {
               h.close();
           }
       } catch (IOException | SecurityException jm) {
           this.reportError(null, jm, ErrorManager.WRITE_FAILURE);
       }
    }
}

@Override
public void flush() {
}

@Override
public void close() {
    super.setLevel(Level.OFF);
}

private String fileName(LogRecord r) {
    try {
        String cn = r.getSourceClassName();
        if (cn == null) {
            cn = String.valueOf(r.getLoggerName());
        }

        //Find package name.
        int index = cn.lastIndexOf('.');
        if (index > -1) {
            cn = cn.substring(0, index);
        }
        return new File(cn).getCanonicalPath();
    } catch (IOException invalidFileName) {
        return "unknown.log";
    }
}}

更快的版本会根据需要创建一个处理程序池,但这更容易编写。