开发者社区 > 大数据与机器学习 > 实时计算 Flink > 正文

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

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

展开
收起
游客3oewgrzrf6o5c 2022-08-01 10:17:45 344 0
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 集群和引擎,提高作业开发运维效率。

相关电子书

更多
PostgresChina2018_赖思超_PostgreSQL10_hash索引的WAL日志修改版final 立即下载
Kubernetes下日志实时采集、存储与计算实践 立即下载
日志数据采集与分析对接 立即下载