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

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.测试过程

项目代码结构如下

2.1运行效果



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

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知识结构的搭建这块来说,这又是非常重要的一块知识,查缺补漏,基础细节学习要一直进行下去。

junit小试log4j及xml配置文件说明的更多相关文章

  1. Java日志(二):log4j与XML配置文件

    [Java日志(一):log4j与.properties配置文件]一文列举的几个案例以.properties文件作为log4j的配置文件,本文简单看一下log4j与XML配置文件 (1)XML配置文件 ...

  2. spring 配置文件无法加载,junit找不到xml配置文件java.lang.IllegalStateException: Failed to load ApplicationContext

    最近遇到一个奇怪的问题.maven项目再进行junit单元测试的时候发现无法加载配置文件.一会能加载一会又不能加载.然后试了在src/main/resource下面的配置文件放到src/test/re ...

  3. log4j.xml配置文件详解

    一 log4j.xml 配置 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE log4j:c ...

  4. commons-logging 和log4j包下载 Spring根据XML配置文件生成对象

    需要用到Spring压缩包中的四个核心JAR包 beans .context.core 和expression 下载地址: https://pan.baidu.com/s/1qXLHzAW 以及日志j ...

  5. 【XML配置文件读取】使用jdom读取XML配置文件信息

    在项目中我们经常需要将配置信息写在配置文件中,而XML配置文件是常用的格式. 下面将介绍如何通过jdom来读取xml配置文件信息. 配置文件信息 <?xml version="1.0& ...

  6. Spring框架[一]——spring概念和ioc入门(ioc操作xml配置文件)

    Spring概念 spring是开源的轻量级框架(即不需要依赖其他东西,可用直接使用) spring核心主要两部分 aop:面向切面编程,扩展功能不是修改源代码来实现: ioc:控制反转,比如:有一个 ...

  7. testng xml配置文件

    简单介绍 运行TestNG测试脚本有两种方式:一种是直接通过IDE运行(例如使用eclipse中的“Run TestNG tests”),另一种是从命令行运行(通过使用xml配置文件).当我们想执行某 ...

  8. Spring框架 全注解annotation不使用配置文件(SpringConfiguration.java类代替) 补充 xml配置文件没有提示解决

    全注解不使用配置文件 首先还是倒包 在原有的jar包: 需Spring压缩包中的四个核心JAR包 beans .context.core 和expression 下载地址: https://pan.b ...

  9. Spring XML配置文件示例(二)——web.xml

    <?xml version="1.0" encoding="UTF-8"?> <web-app id="WebApp_ID" ...

随机推荐

  1. 「模板」可持久化 HFQ-Treap

    老师用的是静态数组的写法,开了很多数组- 其实个人更倾向于 struct 或者用 class 封装起来. 但是鉴于太难打 好吧,是我懒得打. 然后就借鉴了老师的模板,写出了属于自己的 压行 风格. 代 ...

  2. Chrome 浏览器新功能:共享剪贴板

    导读 Chrome 79 在桌面版和 Android 版浏览器中添加了一项新的功能,名为“共享剪贴板”(shared clipboard). 简单来说,就是可以实现在电脑端复制,手机端粘贴.有了这项功 ...

  3. SpringCloud入门——(1)创建Eureka项目

    Eureka是Spring Cloud Netflix微服务套件中的一部分,可以与Springboot构建的微服务很容易的整合起来.Eureka包含了服务器端和客户端组件.服务器端,也被称作是服务注册 ...

  4. Linux centosVMware 自动化运维Ansible介绍、Ansible安装、远程执行命令、拷贝文件或者目录、远程执行脚本、管理任务计划、安装rpm包/管理服务、 playbook的使用、 playbook中的循环、 playbook中的条件判断、 playbook中的handlers、playbook实战-nginx安装、管理配置文件

    一.Ansible介绍 不需要安装客户端,通过sshd去通信 基于模块工作,模块可以由任何语言开发 不仅支持命令行使用模块,也支持编写yaml格式的playbook,易于编写和阅读 安装十分简单,ce ...

  5. 认识iOS系统架构

    关于本文: 文章主要介绍iOS系统架构中的四层结构的内容.常用的框架.大致的功能,然后对iOS开发人员的发展提出自己的一些拙见. 一.iOS系统是基于UNIX系统,所有从系统稳定性上来说的确比其他操作 ...

  6. 夯实Java基础(十八)——泛型

    1.什么是泛型 泛型是Java1.5中出现的新特性,也是最重要的一个特性.泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.这种参数类型可以用在类.接口和方法的创建中,分别称为泛型类. ...

  7. for 循环遍历数据动态渲染html

    本案例通过ajax动态获取数据,然后遍历出数据渲染html小心踩坑:因为有时候不注意,渲染页面的时候只能输出最后一个数据所以正确写法为下:如果AJAX数据请求成功的情况下: html <div ...

  8. django静态文件处理

    django静态文件处理   从开始接接触python这门语言已有四年了,中间陆续的学习,又不断的忘记,所以基本上是没有系统的知识体系.但是挺喜欢这门简洁,强大的动态语言.最近自己私人有个项目要做,虽 ...

  9. Cookie存储在哪里

    内存是临时存储,关机后信息就没了.硬盘是长久存储,不删除就一直在.内存容量决定你电脑能同时运行的程序多少,硬盘容量决定你电脑能存放多少东西. 好比内存是手,硬盘是口袋,东西可以临时放在手里,可是口袋才 ...

  10. python设置编码

    import sys sys.getdefaultencoding() #看到默认编码是'ascii' #通常需要的是使用utf8编码,需要这样做: reload(sys) sys.setdefaul ...