package org.ovirt.engine.core.utils.log;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* Annotation for configuring logging behavior of a command.<br>
* Use this annotation on a command class to configure how it should be logged, for example:
*
* <pre>
* @Logged(errorLogLevel = LogLevel.WARN, executionLevel = LogLevel.DEBUG)
* class A {
* ...
* }
* </pre>
*
* Will define that the invocation of A should be logged with log level WARN when logging an exception, and that in case
* of return values it shouldn't expand them (print their <code>toString()</code> representation) unless the log level
* DEBUG is on. All other definitions are taken from their default values.
*
* @see LoggedUtils LoggedUtils has some helper methods for logging using this annotation.
*/
@Documented
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface Logged {
/* --- Static Inner Types --- */
/**
* Log level to use when logging with the {@link Logged} annotation.<br> {@link LogLevel#OFF} means logging will
* never-ever occur, other values correspond to the ones in {@link Log}.
*/
public static enum LogLevel {
OFF,
TRACE,
DEBUG,
INFO,
WARN,
ERROR,
FATAL;
/**
* Get the lesser log level from the given two levels.
*
* @param firstLevel
* First log level.
* @param secondLevel
* Second log level.
* @return The log level which is minimal.
*/
public static LogLevel getMinimalLevel(LogLevel firstLevel, LogLevel secondLevel) {
if (firstLevel.ordinal() < secondLevel.ordinal()) {
return firstLevel;
}
return secondLevel;
}
}
/* --- Annotation Properties --- */
/**
* The log level for method execution (entry + return).<br>
* <b>Default:</b> {@link LogLevel#INFO}.
*/
LogLevel executionLevel() default LogLevel.INFO;
/**
* The log level for method exit (by exception).<br>
* <b>Default:</b> {@link LogLevel#ERROR}.
*/
LogLevel errorLevel() default LogLevel.ERROR;
/**
* The parameters level determines when should the command parameters be expanded (printed in whole). The
* {@link Logged#executionLevel()} is used as a logical upper-bound for this parameter, so it makes no sense to set
* it higher than that.<br>
* If the log level is lower than {@link Logged#executionLevel()}, and the {@link Logged#executionLevel()} is
* enabled in the log, then:
* <ul>
* <li>If the parameters level is enabled in the log, then the parameters are expanded.</li>
* <li>Otherwise, the full class name is printed.</li>
* </ul>
* <b>Default:</b> {@link LogLevel#INFO}.
*/
LogLevel parametersLevel() default LogLevel.INFO;
/**
* The return level determines when should the command's return value be expanded (printed in whole). The
* {@link Logged#executionLevel()} is used as a logical upper-bound for this parameter, so it makes no sense to set
* it higher than that.<br>
* If the log level is lower than {@link Logged#executionLevel()}, and the {@link Logged#executionLevel()} is
* enabled in the log, then:
* <ul>
* <li>If the return level is enabled in the log, then the return value is printed.</li>
* <li>Otherwise, the return value is not printed, only a return message.</li>
* </ul>
* <b>Default:</b> {@link LogLevel#INFO}.
*/
LogLevel returnLevel() default LogLevel.INFO;
}