Log4J是否记录了昂贵的交易?

时间:2010-10-13 02:48:56

标签: spring-mvc log4j

记录器

您好,

我有一个需要一些服务器端日志记录的Spring MVC webapps,所以我在Spring MVC中配置了Log4J

<listener>
 <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>

在我的控制器中,我记录了所有用户事务。

@Controller
public class MyController {
 protected final Log logger = LogFactory.getLog(getClass());

 public String setup(){
  MyObject object = new MyObject();

  logger.info("User check in data...." + object.data);
 }
}

我有一些问题:

  1. 登录Spring MVC Webapps被视为代价高昂的交易吗?我的意思是这会减慢我的应用程序吗?
  2. 在生产环境中,如果我遗漏这个logger.info,它会好吗?我需要添加这个以便每个事务的可追溯性,这是一个要求 但我担心这些影响。
  3. 由于

2 个答案:

答案 0 :(得分:1)

Log4j本身几乎没有开销。它旨在编译到您的代码中,并通过配置启用或禁用。

禁用时,速度非常快。您可能遇到的唯一问题是准备日志消息,然后不再使用。你可以通过警卫来避免这种情况:

 if (logger.isInfoEnabled()){  // in case object.data.toString() is costly
    logger.info("User check in data...." + object.data);
 }

启用它时,显然需要一些时间将消息写入日志文件/守护程序/数据库。但是,由于您已启用它,因此需要该日志消息(您说您具有可跟踪性要求),因此公平比较将以另一种方式创建日志消息。在这里,log4j开销(与直接调用日志后端相比)是最小的。

记录消息的全部成本将取决于您使用的是哪种后端(而不是log4j本身)。

答案 1 :(得分:0)

在继续之前,简短的免责声明:我还没有使用spring MVC的经验,但是我已经将log4j与基本的java servlet一起使用了,我相信同样的原则适用。

根据您提供的代码,您可以做两件事来提高日志记录速度:

  • logger声明为静态:

protected static final Log logger = LogFactory.getLog(MyController.class);

如果创建了多个对象实例,则可确保每次都不创建新的记录器(因为创建或检索记录器是一项昂贵的操作)。

  • 根据Thilo的回答,使用if语句检查是否启用了指定的日志记录级别。您不仅可以避免toString()方法的成本(正如他正确指出的那样),而且还可以避免不必要的字符串连接。

如果您遵循这些建议,禁用日志记录时的日志记录成本将是log4j的初始设置成本+使用记录器+每个类的记录器的初始化+要评估的单个if语句(如果我没记错的话,在log4j中,这归结为函数调用的开销加上一个整数比较。)

启用日志记录后,您必须考虑您选择使用的appender引入的任何开销(例如,登录到数据库会产生一些开销)以及格式化日志信息所需的时间。例如,使用PatternLayout时,使用%F%M%L模式是一项昂贵的操作,因为log4j通过构建完整的堆栈跟踪来生成此信息。

来源:log4j introduction和log4j源代码。