自适应log4j appender,它忽略加载下的日志指令

时间:2012-01-30 03:18:34

标签: java log4j

我有一个特定的日志类别 - 如果是“高负载”,我想选择不登录。

日志数据被写入文件系统,因此在这种情况下,我会定义“高负载”,因为文件随着时间的推移以超过特定阈值的速度增长。

是否有现有的appender能够识别文件异常快速增长,然后忽略日志指令?

如果没有,这是否属于自定义appender的范围?

1 个答案:

答案 0 :(得分:1)

可悲的是,没有现成的log4j appender可以做这样的事情。

但是,可以开发自定义appender(例如,作为现有appender的子类)。它必须跟踪其吞吐量,并相应地丢弃消息。

自定义appender方法有两点需要注意:

  1. 在较大的系统中,appender将在Log4J日志服务器中运行,而不是在您的应用程序中运行。应用程序将消息发送到日志服务器,日志服务器随后调用appender来存储它(在文件,数据库等等)。现在,这里的主要工作是将消息传递给日志服务器,因此丢弃日志服务器上的消息将极大地浪费资源。相反,您必须在客户端(即在您的应用程序中)丢弃它。

  2. 构建消息有时很昂贵(创建对象,字符串,参数化消息,收集统计信息,测量时间等)。如果appender要丢弃结果,那么这样做会浪费资源。

  3. 仍然可以做到。

    首先,您的吞吐量感知appender必须是SocketAppender的子类,因此不会消耗网络开销。
    其次,appender必须为应用程序提供一种高效的方法来查明当前是否丢弃了消息。然后,在您的应用程序中,您可以编写有效的代码,如:

    if (MyLogHelper.isActuallyLogging(LOGGER, Level.DEBUG)) {
        LOGGER.debug(constructExpensiveMessage());
    }