Description
In org.apache.hadoop.hive.metastore.HiveMetaStore we have a Formatter class (and its buffer) tied to every thread.
This Formatter is for logging purposes. I would suggest that we simply let let the logging framework itself handle these kind of details and ditch the buffer per thread.
public static final String AUDIT_FORMAT = "ugi=%s\t" + // ugi "ip=%s\t" + // remote IP "cmd=%s\t"; // command public static final Logger auditLog = LoggerFactory.getLogger( HiveMetaStore.class.getName() + ".audit"); private static final ThreadLocal<Formatter> auditFormatter = new ThreadLocal<Formatter>() { @Override protected Formatter initialValue() { return new Formatter(new StringBuilder(AUDIT_FORMAT.length() * 4)); } }; ... private static final void logAuditEvent(String cmd) { final Formatter fmt = auditFormatter.get(); ((StringBuilder) fmt.out()).setLength(0); String address = getIPAddress(); if (address == null) { address = "unknown-ip-addr"; } auditLog.info(fmt.format(AUDIT_FORMAT, ugi.getUserName(), address, cmd).toString()); }