大家好请教一个问题,我用log4j打印日志,我发现使用 Logger log = LoggerFactory.getLogger(DorisStreamLoadUtil.class);,在taskmanager.log里面可以显示,但是在前面加了final static就不显示了,是静态变量引起线程安全的问题吗?
在使用 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 对象时有一些变化,需要注意相应的使用方式。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
实时计算Flink版是阿里云提供的全托管Serverless Flink云服务,基于 Apache Flink 构建的企业级、高性能实时大数据处理系统。提供全托管版 Flink 集群和引擎,提高作业开发运维效率。