Is there any possible log separate files for different package in the Glassfish

后端 未结 1 1054
执笔经年
执笔经年 2021-01-16 12:35

We are using glassfish as our application server. We want to log messages separately. For example if the log from xxx.company.xxx.service package, the log file is named as

相关标签:
1条回答
  • 2021-01-16 13:10

    The FileHandler doesn't support generating file names by package name from the LogManager. The com.sun.enterprise.server.logging.GFFileHandler doesn't seen to support it either.

    If you want to generate a file name per each package you can create a custom Handler that will create and close a FileHandler on each publish.

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

    A much faster version would create a pool of handlers on demand but, this is easier to write up.

    0 讨论(0)
提交回复
热议问题