大家好请教一个问题,我用log4j打印日志,我发现使用 Logger log = LoggerFac

大家好请教一个问题,我用log4j打印日志,我发现使用 Logger log = LoggerFactory.getLogger(DorisStreamLoadUtil.class);,在taskmanager.log里面可以显示,但是在前面加了final static就不显示了,是静态变量引起线程安全的问题吗?

展开
收起
游客3oewgrzrf6o5c 2022-08-01 10:17:45 411 分享 版权
1 条回答
写回答
取消 提交回答
  • 北京阿里云ACE会长

    在使用 Log4j 打印日志时,使用 LoggerFactory.getLogger() 方法获取 Logger 对象是一种常见的做法。在静态变量中使用 Logger 对象也是常见的做法,因为这样可以在整个类中共享一个 Logger 对象,避免重复创建。

    在您的情况下,如果将 Logger 对象定义为 final static,可能会导致日志信息无法输出的问题。这是因为 Log4j 在初始化时需要加载配置文件,并创建相应的 Appender、Logger 等对象。如果 Logger 对象定义为 final static,则在 Log4j 初始化之前,该对象已经被创建并分配了内存空间,此时 Log4j 尚未初始化,因此无法将日志信息输出到相应的 Appender 中。

    解决这个问题的方法是,不要将 Logger 对象定义为 final static,而是定义为 private final,这样每个实例都有自己的 Logger 对象,可以避免线程安全问题。另外,可以在应用程序启动时通过 BasicConfigurator.configure() 方法或者 PropertyConfigurator.configure() 方法来手动加载 Log4j 配置文件,以确保 Log4j 已经被初始化。

    需要注意的是,Log4j 2.x 版本提供了更好的线程安全性和性能,建议使用 Log4j 2.x 来代替 Log4j 1.x。Log4j 2.x 在初始化和使用 Logger 对象时有一些变化,需要注意相应的使用方式。

    2023-07-14 22:36:18
    赞同 展开评论

实时计算Flink版是阿里云提供的全托管Serverless Flink云服务,基于 Apache Flink 构建的企业级、高性能实时大数据处理系统。提供全托管版 Flink 集群和引擎,提高作业开发运维效率。

收录在圈子:
实时计算 Flink 版(Alibaba Cloud Realtime Compute for Apache Flink,Powered by Ververica)是阿里云基于 Apache Flink 构建的企业级、高性能实时大数据处理系统,由 Apache Flink 创始团队官方出品,拥有全球统一商业化品牌,完全兼容开源 Flink API,提供丰富的企业级增值功能。
还有其他疑问?
咨询AI助理