我有一个特定的日志类别 - 如果是“高负载”,我想选择不登录。
日志数据被写入文件系统,因此在这种情况下,我会定义“高负载”,因为文件随着时间的推移以超过特定阈值的速度增长。
是否有现有的appender能够识别文件异常快速增长,然后忽略日志指令?
如果没有,这是否属于自定义appender的范围?
答案 0 :(得分:1)
可悲的是,没有现成的log4j appender可以做这样的事情。
但是,可以开发自定义appender(例如,作为现有appender的子类)。它必须跟踪其吞吐量,并相应地丢弃消息。
自定义appender方法有两点需要注意:
在较大的系统中,appender将在Log4J日志服务器中运行,而不是在您的应用程序中运行。应用程序将消息发送到日志服务器,日志服务器随后调用appender来存储它(在文件,数据库等等)。现在,这里的主要工作是将消息传递给日志服务器,因此丢弃日志服务器上的消息将极大地浪费资源。相反,您必须在客户端(即在您的应用程序中)丢弃它。
构建消息有时很昂贵(创建对象,字符串,参数化消息,收集统计信息,测量时间等)。如果appender要丢弃结果,那么这样做会浪费资源。
仍然可以做到。
首先,您的吞吐量感知appender必须是SocketAppender的子类,因此不会消耗网络开销。
其次,appender必须为应用程序提供一种高效的方法来查明当前是否丢弃了消息。然后,在您的应用程序中,您可以编写有效的代码,如:
if (MyLogHelper.isActuallyLogging(LOGGER, Level.DEBUG)) {
LOGGER.debug(constructExpensiveMessage());
}