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

Posted

技术标签:

【中文标题】Glassfish 中的不同包是不是有任何可能的日志单独文件【英文标题】:Is there any possible log separate files for different package in the GlassfishGlassfish 中的不同包是否有任何可能的日志单独文件 【发布时间】:2014-03-17 05:14:30 【问题描述】:

我们使用 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】:

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";
    

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

【讨论】:

以上是关于Glassfish 中的不同包是不是有任何可能的日志单独文件的主要内容,如果未能解决你的问题,请参考以下文章

以下代码中的 CommaDelimLog 类是不是违反单一职责原则?

Glassfish 中的 Java EE WebSockets 可能的“僵尸”连接

Glassfish中的Corba?

无法通过 Glassfish 4.1 Web 管理员创建任何 JMS 资源

Glassfish 4 服务器意外停止

GlassFish 无法连接到 mysql (XAMPP)