记录器
您好,
我有一个需要一些服务器端日志记录的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);
}
}
我有一些问题:
由于
答案 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);
如果创建了多个对象实例,则可确保每次都不创建新的记录器(因为创建或检索记录器是一项昂贵的操作)。
toString()
方法的成本(正如他正确指出的那样),而且还可以避免不必要的字符串连接。如果您遵循这些建议,禁用日志记录时的日志记录成本将是log4j的初始设置成本+使用记录器+每个类的记录器的初始化+要评估的单个if语句(如果我没记错的话,在log4j中,这归结为函数调用的开销加上一个整数比较。)
启用日志记录后,您必须考虑您选择使用的appender引入的任何开销(例如,登录到数据库会产生一些开销)以及格式化日志信息所需的时间。例如,使用PatternLayout时,使用%F
,%M
或%L
模式是一项昂贵的操作,因为log4j通过构建完整的堆栈跟踪来生成此信息。
来源:log4j introduction和log4j源代码。