如何使用方便的方法创建自己的log4j日志级别

时间:2014-01-21 10:22:36

标签: java logging log4j

随着项目的不断发展,我们在这些项目中记录不同情景方面达成了新的协议,因为我们通常会忘记删除大量用于在生产代码中搜寻错误的反汇编记录器调用(我们甚至创建了一个咖啡漏洞,每个人都必须为每个不受欢迎的记录器支付20c而没有成功:/)。所以我希望拥有Log4j的特殊日志级别,我们只能将其用于调试目的。

目前有这些记录器:

DEBUG
INFO
WARN
ERROR
FATAL

警告,错误和致命是为自己说话,但我想在DEBUG之前在某处添加另一个类别,因为INFO我们想用于生产模式中的应用程序的一般日志记录,DEBUG提供有关项目状态的详细信息,这些信息不是必须在生产模式中使用。

在DEBUG旁边,我希望有一个特殊的记录器,例如USER(或simular),用于临时包含的记录器,例如用于寻找漏洞的东西,或者其他任何东西,可以在代码中找到时删除每次都毫不犹豫。

我偶然发现了这个有用的article来创建自己的自定义级别,但我讨厌,我必须在我想要添加的每个日志中添加日志级别以用于调试目的:

logger.log(MyLevel.DISASTER, "i am a disaster");

所以我想知道是否有任何方法可以简单地获得像

这样的新方法
logger.disaster( "i am a disaster" );

例如为Logger.class编写fassade。不幸的是,我不确定,关于记录器初始化和 - 创建委派给记录器,所以我想知道,如果有人可能有任何想法只是这个。我知道编码模板我可以很容易地生成级别,但它只是不好读

2 个答案:

答案 0 :(得分:1)

可能只是我,但不会:

 class DisasterLogger{
      private static final Log logger = Logger.getLogger(DisasterLogger.class); //or any other way you provide the logger
      public void log(String message){
           logger.log(MyLevel.DISASTER, message);
      }
 }

干脆工作?

答案 1 :(得分:0)

在Eugene和Fildor对此主题提出非常有用的意见之后的简单实施:

public class IspLogger
{
  private final Logger logger;

  private IspLogger( String clazzName )
  {
    logger = Logger.getLogger( clazzName );
  }

  public static IspLogger getLogger( Class<?> clazz )
  {
    return new IspLogger( clazz.getName() );
  }

  public void info( Object message )
  {
    logger.log( IspLogger.class.getCanonicalName(), Level.INFO, message, null );
  }

  public void info( Object message, Throwable t )
  {
    logger.log( IspLogger.class.getCanonicalName(), Level.INFO, message, t);
  }

  public void dev( Object message )
  {
    logger.log( IspLogger.class.getCanonicalName(), IspDebugLevel.ISP_DEBUG, message, null );
  }

  public void dev( Object message, Throwable t )
  {
    logger.log( IspLogger.class.getCanonicalName(), IspDebugLevel.ISP_DEBUG, message, t);
  }

  public void debug( Object message )
  {
    logger.log( IspLogger.class.getCanonicalName(), Level.DEBUG, message, null );
  }

  ...
}


class IspDebugLevel extends Level
{
  public static final IspDebugLevel ISP_DEBUG = new IspDebugLevel( 20000, "DEV", 0 );/20000 is equal to INFO.

  public IspDebugLevel( int level, String levelStr, int syslogEquivalent )
  {
    super( level, levelStr, syslogEquivalent );
  }

  public static IspDebugLevel toLevel( int val, Level defaultLevel )
  {
    return ISP_DEBUG;
  }

  public static IspDebugLevel toLevel( String sArg, Level defaultLevel )
  {
    return ISP_DEBUG;
  }
}


public class LoggerTest
{
  private static final IspLogger logger = IspLogger.getLogger( LoggerTest.class );

  public static void main( String[] args )
  {
    logger.dev( "Hello World" );
  }
}