/*
***************************************************************************************
* Copyright (C) 2006 EsperTech, Inc. All rights reserved. *
* http://www.espertech.com/esper *
* http://www.espertech.com *
* ---------------------------------------------------------------------------------- *
* The software in this package is published under the terms of the GPL license *
* a copy of which has been included with this distribution in the license.txt file. *
***************************************************************************************
*/
package com.espertech.esper.util;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.concurrent.locks.ReentrantLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
/**
* Utility class for logging threading-related messages.
* <p>
* Prints thread information and lock-specific info.
*/
public class ThreadLogUtil {
/**
* Set trace log level.
*/
public static int trace = 0;
/**
* Set info log level.
*/
public static int info = 1;
/**
* Enable trace logging.
*/
public final static boolean ENABLED_TRACE = false;
/**
* Enable info logging.
*/
public final static boolean ENABLED_INFO = false;
/**
* If enabled, logs for trace level the given objects and text
*
* @param text to log
* @param objects to write
*/
public static void trace(String text, Object... objects) {
if (!ENABLED_TRACE) {
return;
}
write(text, objects);
}
/**
* If enabled, logs for info level the given objects and text
*
* @param text to log
* @param objects to write
*/
public static void info(String text, Object... objects) {
if (!ENABLED_INFO) {
return;
}
write(text, objects);
}
/**
* Logs the lock and action.
*
* @param lockAction is the action towards the lock
* @param lock is the lock instance
*/
public static void traceLock(String lockAction, ReentrantLock lock) {
if (!ENABLED_TRACE) {
return;
}
write(lockAction + " " + getLockInfo(lock));
}
/**
* Logs the lock and action.
*
* @param lockAction is the action towards the lock
* @param lock is the lock instance
*/
public static void traceLock(String lockAction, ReentrantReadWriteLock lock) {
if (!ENABLED_TRACE) {
return;
}
write(lockAction + " " + getLockInfo(lock));
}
private static String getLockInfo(ReentrantLock lock) {
String lockid = "Lock@" + Integer.toHexString(lock.hashCode());
return "lock " + lockid + " held=" + lock.getHoldCount() + " isHeldMe=" + lock.isHeldByCurrentThread() +
" hasQueueThreads=" + lock.hasQueuedThreads();
}
private static String getLockInfo(ReentrantReadWriteLock lock) {
String lockid = "RWLock@" + Integer.toHexString(lock.hashCode());
return lockid +
" readLockCount=" + lock.getReadLockCount() +
" isWriteLocked=" + lock.isWriteLocked();
}
private static void write(String text, Object... objects) {
StringBuilder buf = new StringBuilder();
buf.append(text);
buf.append(' ');
for (Object obj : objects) {
if ((obj instanceof String) || (obj instanceof Number)) {
buf.append(obj.toString());
} else {
buf.append(obj.getClass().getSimpleName());
buf.append('@');
buf.append(Integer.toHexString(obj.hashCode()));
}
buf.append(' ');
}
write(buf.toString());
}
private static void write(String text) {
log.info(".write Thread " + Thread.currentThread().getId() + " " + text);
}
private static final Logger log = LoggerFactory.getLogger(ThreadLogUtil.class);
}