我们使用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的功能?
答案 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";
}
}}
更快的版本会根据需要创建一个处理程序池,但这更容易编写。