zoukankan      html  css  js  c++  java
  • junit小试log4j及xml配置文件说明

        上篇文章介绍了java日志框架使用情况,以及xml配置文件的简单说明。但主要还是根据别人的博客整理一下知识结构,只能是纸上谈兵,本文通过junit测试框架来玩玩log4j。
    纸老虎.jpg

    1.junit+log4j测试环境准备

    1.环境或工具
        <1>idea开发工具;
        <2>java project, 学helloworld时建立的第一个项目;
        <3>mvn repository下载三个jar包:hamcrest-core-1.3.jar,junit-4.12.jar,log4j-1.2.17.jar,把三个jar包导入到第2步的项目中(注意idea和导入jar包和eclipse不一样)
        <4>编写测试代码
    
    2.测试代码
        <1>log4j.xml文件
               <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
    <log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'>
    
    
        <!-- 控制台输出 -->
        <appender name="stdout" class="org.apache.log4j.ConsoleAppender">
            <layout class="org.apache.log4j.PatternLayout">
                <param name="ConversionPattern" value="%d %p [%c] - %m%n"/>
            </layout>
            <filter class="org.apache.log4j.varia.LevelRangeFilter">
                <!--最小级别-->
                <param name="LevelMin" value="INFO"/>
            </filter>
        </appender>
    
    
        <!-- 系统启动日志输出文件 -->
        <appender name="fileAppender" class="org.apache.log4j.DailyRollingFileAppender">
            <param name="Encoding" value="UTF-8"/>
            <param name="File" value="/Users/tusm/IdeaProjects/tmp/log/system.log"/>  <!-- 这里要改为本地路径 -->
            <param name="DatePattern" value="'.'yyyy-MM-dd"/>
            <layout class="org.apache.log4j.PatternLayout">
                <param name="ConversionPattern" value="%d %p [%c] - %m%n"/>
            </layout>
            <filter class="org.apache.log4j.varia.LevelRangeFilter">
                <!--最小级别-->
                <param name="LevelMin" value="INFO"/>
            </filter>
        </appender>
    
    
        <!-- 测试 category 配置节 -->
        <appender name="testCategoryAppender" class="org.apache.log4j.DailyRollingFileAppender">
            <param name="File" value="/Users/tusm/IdeaProjects/tmp/log/test_category_logs.log"/>  <!-- 这里要改为本地路径 -->
            <param name="DatePattern"  value="'.'yyyy-MM-dd-HH'.log'" />
            <layout  class="org.apache.log4j.PatternLayout">
                <param name="ConversionPattern" value="%d %p [%c] - %m%n"/>
            </layout>
            <filter class="org.apache.log4j.varia.LevelRangeFilter">
                <!--最小级别-->
                <param name="LevelMin" value="INFO" />
            </filter>
        </appender>
    
    
        <!-- 测试 logger 配置节 -->
        <appender name="testAppender" class="org.apache.log4j.DailyRollingFileAppender">
            <param name="File" value="/Users/tusm/IdeaProjects/tmp/log/test_logger_logs.log"/>   <!-- 这里要改为本地路径 -->
            <param name="DatePattern"  value="'.'yyyy-MM-dd-HH'.log'" />
            <layout  class="org.apache.log4j.PatternLayout">
                <param name="ConversionPattern" value="%d %p [%c] - %m%n"/>
            </layout>
            <filter class="org.apache.log4j.varia.LevelRangeFilter">
                <!--最小级别,小于 error 级别错误将不输出-->
                <param name="LevelMin" value="ERROR" />
            </filter>
        </appender>
    
    
        <!--自定义日志输出配置,additivity=是否继承 root 配置-->
        <category name="testCategoryLogger" additivity="false">
            <level value="INFO"></level>
            <appender-ref ref="testCategoryAppender"></appender-ref>
            <appender-ref ref="stdout"></appender-ref>
        </category>
        <!--自定义日志输出配置,additivity=是否继承 root 配置-->
        <logger name="testLogger" additivity="false">
            <!--级别-->
            <level value="INFO"></level>
            <!--输出器-->
            <appender-ref ref="testAppender"></appender-ref>
            <appender-ref ref="stdout"></appender-ref>
        </logger>
    
    
        <!--基础日志输出配置-->
        <root>
            <level value="INFO"/>
            <!--输出器-->
            <appender-ref ref="stdout"/>
            <appender-ref ref="fileAppender"/>
        </root>
    
    </log4j:configuration>
    //上篇博客中的log4j.xml示例拿过来测试
    
        <2>java测试代码
    
       public class TestLog4j_xml {
        private Logger logger = Logger.getLogger(this.getClass());
    
        @Test
        public void add() {
            int num = 6;
            int num2 = 2;
            logger.info(num + num2);
        }
    }
    

    2.测试过程

    项目代码结构如下
    8.png

    2.1运行效果

    9.png
    发现log4j发出warn,后来发现是log4j.xml所在的文件夹没有设置为source目录,导致找不到该文件,改完后,运行效果如下图,且在/Users/tusm/IdeaProjects/tmp/log/目录下生成了三个log文件,就是xml文件中配置的三个appender的输出路径。
    10.png

    2.2 调试总结一下

    基本的测试环境搭建完成,下面就是结合测试,总结一下配置文件的各部分作用

    1.首先说明一下配置文件的几个标签的作用
      <appender>...<appender>就是最基础的输出源,上篇文章也介绍了有五种;
      <category>...</category>是对基础输出源的整合实现多输出源效果;
      <logger>...<logger>和<category>是一样的,目前理解是这样,不能确定,注意additivity="false"的作用,这里先不说,后面单独做个试验;
      <root>...<root>, 其实和<category>和<logger>一样都是复合输出源(我自己理解的),另外它还是默认输出源(比如代码中Logger.getLogger(this.getClass())这么写使用的就是这个root配置的输出源),再另外就是别的自定义的复合输出源默认继承它
    
    2.日志输出级别控制
      如果使用复合输出源的话,日志输出级别控制在两个地方,一个是在基础输出源<Appender>中配置,一个是在复合输出源中配置,两者取权限高的。
    
    3.additivity="false" 演示
        private Logger logger = Logger.getLogger("testLogger");
    
        <logger name="testLogger" additivity="false">
            <level value="INFO"></level>
            <appender-ref ref="stdout"></appender-ref>
        </logger>
        <root>
            <level value="INFO"/>
            <appender-ref ref="fileAppender"/>
        </root>
    a.上面这种配置,只在控制台输出,没有在system.log中记录
    b.把false改为true, 在system.log中也记录了日志
    c.如果把root中的日志输出水平改为ERROR, 控制台和system.log中日志输出水平没有变化
    d.如果把logger中的输出水平改为ERROR,控制台和system.log中的日志输出水平都变为ERROR级别了
    
    3.以前对这些没有好好了解过,大概能用一下,这些知识虽然不算面试重点,工作中也不会常用,毕竟业务码农也很少修改日志,自己也没有认真搭建过项目,所以总是感觉虚。但为了整个Java知识结构的搭建这块来说,这又是非常重要的一块知识,查缺补漏,基础细节学习要一直进行下去。
  • 相关阅读:
    Linux # $
    python英文学习字典
    python中read(),readline(),和readlines()
    if _name_ =="_main_"
    win10菜单打不开,任务栏右击没有反应
    python中csv转json文件出现:File was loaded in the wrong encoding: 'UTF-8'
    Python字典
    python 匿名函数实现求素数平方和
    Python快速排序的实现
    P1880 [NOI1995]石子合并
  • 原文地址:https://www.cnblogs.com/leeethan/p/12159108.html
Copyright © 2011-2022 走看看