Log4J2源码系列(九) - 没有配置文件也能打印日志? 默认配置怎么创建的?_没有logj配置文件,但可以在打印台输出-程序员宅基地

技术标签: Java  java  Log4J  log4j  

之前分析过Log4J2是怎么加载我们应用程序中的配置文件的,参见Log4J2(五) - 配置文件是怎么获取的? . 但是当我们没有配置文件的时候,你会发现控制台会打印错误,这个时候你有没有想过一个问题:为什么没有配置好日志系统,它也能打印日志呢?
因为它在加载自定义的配置之前新建了一套默认配置。

ps:这里说的打印日志是指的应用程序打印日志,不是只Log4J2本身的日志,它本身的日志是由StatusLogger打印的,这个后续有时间再分析。

创建时机

NullConguration一样, 是在LoggerContext的构造方法执行之前创建的。

  private volatile Configuration configuration = new DefaultConfiguration();

使用时机

当所有的配置方式都没有找到配置时,就会使用默认配置。

代码分析

  • 构造方法
    public DefaultConfiguration() {
   
    
    	//调用父类AbstractConfiguration的构造方法
        super(null, ConfigurationSource.NULL_SOURCE);
        //调用父类AbstractConfiguration的setToDefault方法,给rootLogger做默认配置
        setToDefault();
    }
  • 来看看父类的构造方法
  private final ConcurrentMap<String, String> properties = new ConcurrentHashMap<>();
  // 这就是上面提到的rootLogger,其实就是个空壳 
  private LoggerConfig root = new LoggerConfig();

  protected AbstractConfiguration(final LoggerContext loggerContext, final ConfigurationSource configurationSource) {
   
    
  		//保存loggerContext的一个弱引用
        this.loggerContext = new WeakReference<>(loggerContext);
        this.configurationSource = Objects.requireNonNull(configurationSource, "configurationSource is null");
        //如上面的代码,初始存放的是一个空map
        componentMap.put(Configuration.CONTEXT_PROPERTIES, properties);
        //新建一个插件管理器
        pluginManager = new PluginManager(Node.CATEGORY);
        //创建一个空的根节点
        rootNode = new Node();
        //设置配置状态开启初始化
        setState(State.INITIALIZING);
    }
  • AbstractConfiguration 的setToDefault方法, 也就是默认配置的具体创建过程
    protected void setToDefault() {
   
    
        // LOG4J2-1176 facilitate memory leak investigation
        setName(DefaultConfiguration.DEFAULT_NAME + "@" + Integer.toHexString(hashCode()));
        //初始化输出的消息样式
        //默认格式:%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
        final Layout<? extends Serializable> layout = PatternLayout.newBuilder()
             .
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/sweetyi/article/details/105147925

智能推荐

flyme android 知乎,知乎(com.zhihu.android) - 7.12.0 - 应用 - 酷安-程序员宅基地

文章浏览阅读132次。权限信息· android.permission.REQUEST_INSTALL_PACKAGES· 与蓝牙设备配对· 完全的网络访问权限· 读取您的USB存储设备中的内容· 修改或删除您的USB存储设备中的内容· 开机启动· 录音· 访问USB存储设备的文件系统· 更改您的音频设置· 控制振动· android.Manifest.permission.DEVICE_POWER· 防止手机休眠· ..._魅族手机 知乎app安装路径

VSCode打造成为开发神器-程序员宅基地

文章浏览阅读221次。VSCode现在是世界上最为常用的编辑器之一,为什么被称为编辑器,是因为它不像IDE一样集成了大量开发环境的配置,必须你手动配置很多东西,才能将它打造成为一个趁手的生产工具。VSCode最大的优势就在于它是完全免费的,你不需要支付任何费用,就可以得到一个开发各种代码的编辑器,也正因为它具有高拓展性,它可以用来编写Python、C++、C#、GO、Dart等一系列语言。你可以通过下面..._vscode可以开发dsp代码

springboot的读取配置文件_springboot 程序读取配置文件-程序员宅基地

文章浏览阅读168次。习惯优于配置springboot的配置文件application.properties(application.yml)中可以设置配置值,影响程序的运行方式。springboot中,习惯优于配置,指的就是程序中存在大量默认的配置(这些配置是基于习惯操作配置的),可以使程序在很少配置或没有配置的情况下就可以运行。怎么读取配置文件中的配置值,对程序来说很重要。定义配置文件 application.yml#value propertiesvalue: single: this is sing_springboot 程序读取配置文件

月薪2w的人,爱发什么朋友圈?-程序员宅基地

文章浏览阅读429次。和优秀的人为伍,受优秀者熏染,是我们的成长方式。一个人的优秀之路,就是他朋友圈不断聚集更多高人的过程。那么,最优秀的高人们都在哪里呢?我们搜遍全网,发现下面这些公众号里高人云集。这里推荐..._你会在朋友圈发实验课

ArcGIS模型构建器(ArcGIS)_arcgis模型构建器是白色的-程序员宅基地

文章浏览阅读2.2w次,点赞20次,收藏152次。今天课上学了点模型构建器的相关知识,在实际操作特此整理一下:1.流域_arcgis模型构建器是白色的

再次遥遥领先,华为云耀云服务器L实例性能暴涨-程序员宅基地

文章浏览阅读344次,点赞9次,收藏11次。然而,云耀L实例通过提供丰富的预置镜像和默认组件,让用户能够轻松上手,快速完成部署,有效解决了用户在部署过程中遇到的困难。面对市场的白热化竞争,云耀L实例不断提升自身实力,依托华为云多年的技术与经验积淀,提供更佳性能体验、更高易用性、更优性价比,让用户迈出“简单上云第一步”。它拥有“智能不卡顿、价优随心用、上手更简单、管理特省心”的特性,专注于实现“三步建站,两倍性能,简单上云第一步”的目标,能够克服传统云服务器的缺点和局限性,解决用户在使用云服务器过程中遇到的各种问题。显然,数字化技术产品和。

随便推点

mysql sql语句digest收集与展示_mysql digest-程序员宅基地

文章浏览阅读1.9k次。mysql慢查询,已经有现成的成熟的方案收集展示了:pt-query-digest结合box公司的anemometer,没用过的移步:《mysql慢查询可视化》(本章内容需要了解anemometer)。但DBA们一定还遇到过这样的问题:某个时间段CPU负载较高,但慢查却没有,有时连实时看processlist都看不出异常。这种情况一般是由高并发的但单个性能正常的SQL导致的,所以慢查没有,但总体负载会升高。那怎么办呢?选择1:配置events_statements_history_long,缺点明显_mysql digest

flink-cdc之读取mysql变化数据_java代码flink1.13.0 读取mysql表信息-程序员宅基地

文章浏览阅读1.3k次。由于打印的日志太多 我们可以用fastjson稍微封装下 然后传给sink去处理,根据update delete insert实时更新下游数据。修改一条数据 age=1 ->age=2。_java代码flink1.13.0 读取mysql表信息

html表单标签form怎样设置空隙,Smartform中表(table)的行间距设置-程序员宅基地

文章浏览阅读2.5k次。使用TCODE SMARTSTYLES 进入到style的设置界面,也可以直接从TCODE smartforms 里面进入。STYLE 分为三部分,header data, paragraph format, character format。header data 设置style 的默认值,paragraph format 设置段落格式, 对齐方式,缩进,间距,行间距。其中space befor..._设置form表单中各行间距

黑马程序员-oc中类的声明和实现-程序员宅基地

文章浏览阅读251次。------ Java培训、Android培训、iOS培训、.Net培训 期待与您交流! -------方法类型标识符:"+"表示类方法,"-"表示对象方法类的声明 @interface 类名:父类名 { 定义属性; } 声明方法;@end

c# 加载xml到dataset-程序员宅基地

文章浏览阅读494次,点赞8次,收藏7次。/获取StrStream中的数据。//ds获取Xmlrdr中的数据。//读取文件中的字符流。1读取xml转换为dataset。

基于BP神经网络的手写数字识别MATLAB仿真_matlab手写数字识别神经网络bp-程序员宅基地

文章浏览阅读55次。对于标签编码,可以使用独热编码(one-hot encoding)将每个标签表示为一个向量,其中只有对应标签的位置为1,其他位置为0。接下来,我们创建一个包含一个隐藏层(100个神经元)的BP神经网络模型,并设置训练参数。最后,我们计算预测准确率。手写数字识别是人工智能领域中一项重要的任务,它在许多应用中都有广泛的应用,例如自动邮件排序、银行支票处理和手写数字识别等。其中,numEpochs是训练的迭代次数,learningRate是学习率,inputs是训练数据的输入,targets是对应的目标输出。_matlab手写数字识别神经网络bp

推荐文章

热门文章

相关标签