当日志结果打印到单个文件时,appender 如何在 Web 应用程序中工作?
引用 servlet 的工作方式,每个请求都由不同的 servlet 线程提供服务,并且在 Web 应用程序中,有大量并行发生的请求。
当 servlet 的多个实例想要记录到同一个文件时,如何处理日志记录?
这个问题是否像共享资源中的临界区问题一样处理?
由于涉及的操作是写入并且资源是单个日志文件,因此它不会减慢网络应用程序以服务请求吗?
最佳答案
这取决于日志框架。在 log4j 中,AppenderSkeleton.doAppend
方法是同步
的,一次只允许一个线程记录一条日志语句。好消息是,除非您每秒记录数千条消息(如果是,那么您可能做错了事情或使用了错误的框架),否则这不是问题。
请记住,实际写入文件可能不一定立即发生,因为很可能存在一个缓冲区,使关键部分的周转相当快。
您提到的场景并不是需要同步的唯一情况。例如,在记录语句时,可以配置多个附加程序。日志系统必须确保在单个日志事件中不会添加/删除任何附加程序,以避免出现同一个事件被一个附加程序记录而不会被另一个附加程序记录的情况。
关于java - Web 应用程序上下文中日志实用程序 (log4j) 中 Appender 的工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22525654/