前面介绍了Commons Logging,可以作为“日志接口”来使用。而真正的“日志实现”可以使用Log4j。

Log4j是一种非常流行的日志框架,最新版本是2.x。

Log4j是一个组件化设计的日志系统,它的架构大致如下:

log.info("User signed in.");

│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐

├──>│ Appender │───>│ Filter │───>│ Layout │───>│ Console │

│ └──────────┘ └──────────┘ └──────────┘ └──────────┘

│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐

├──>│ Appender │───>│ Filter │───>│ Layout │───>│ File │

│ └──────────┘ └──────────┘ └──────────┘ └──────────┘

│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐

└──>│ Appender │───>│ Filter │───>│ Layout │───>│ Socket │

└──────────┘ └──────────┘ └──────────┘ └──────────┘

当我们使用Log4j输出一条日志时,Log4j自动通过不同的Appender把同一条日志输出到不同的目的地。例如:

console:输出到屏幕;

file:输出到文件;

socket:通过网络输出到远程计算机;

jdbc:输出到数据库

在输出日志的过程中,通过Filter来过滤哪些log需要被输出,哪些log不需要被输出。例如,仅输出ERROR级别的日志。

最后,通过Layout来格式化日志信息,例如,自动添加日期、时间、方法名称等信息。

上述结构虽然复杂,但我们在实际使用的时候,并不需要关心Log4j的API,而是通过配置文件来配置它。

以XML配置为例,使用Log4j的时候,我们把一个log4j2.xml的文件放到classpath下就可以让Log4j读取配置文件并按照我们的配置来输出日志。下面是一个配置文件的例子:

%d{MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36}%n%msg%n%n

log/err.log

log/err.%i.log.gz

虽然配置Log4j比较繁琐,但一旦配置完成,使用起来就非常方便。对上面的配置文件,凡是INFO级别的日志,会自动输出到屏幕,而ERROR级别的日志,不但会输出到屏幕,还会同时输出到文件。并且,一旦日志文件达到指定大小(1MB),Log4j就会自动切割新的日志文件,并最多保留10份。

有了配置文件还不够,因为Log4j也是一个第三方库,我们需要从这里下载Log4j,解压后,把以下3个jar包放到classpath中:

log4j-api-2.x.jar

log4j-core-2.x.jar

log4j-jcl-2.x.jar

因为Commons Logging会自动发现并使用Log4j,所以,把上一节下载的commons-logging-1.2.jar也放到classpath中。

要打印日志,只需要按Commons Logging的写法写,不需要改动任何代码,就可以得到Log4j的日志输出,类似:

03-03 12:09:45.880 [main] INFO com.itranswarp.learnjava.Main

Start process...

最佳实践

在开发阶段,始终使用Commons Logging接口来写入日志,并且开发阶段无需引入Log4j。如果需要把日志写入文件,

只需要把正确的配置文件和Log4j相关的jar包放入classpath,就可以自动把日志切换成使用Log4j写入,无需修改任何代码。

练习

根据配置文件,观察Log4j写入的日志文件。

小结

通过Commons Logging实现日志,不需要修改代码即可使用Log4j;

使用Log4j只需要把log4j2.xml和相关jar放入classpath;

如果要更换Log4j,只需要移除log4j2.xml和相关jar;

只有扩展Log4j时,才需要引用Log4j的接口(例如,将日志加密写入数据库的功能,需要自己开发)。

java jar log4j_使用Log4j相关推荐

  1. java jar log4j_java项目打包成可执行jar用log4j将日志写在jar所在目录操作

    开发一个demo时想将日志输出到最终打包的jar所在目录,从网上学习实验整理之后的配置如下, log4j.properties log4j.rootLogger = INFO,console,logF ...

  2. Java工程中使用Log4j小记

    1.工程中引入log4j的jar包,可到http://logging.apache.org/log4j/1.2/download.html下载: 2.在src目录下配置log4j.properties ...

  3. Java学习笔记之log4j与commons-logging转

    Java学习笔记之log4j与commons-logging<转> (2011-02-16 11:10:46) 转载▼ 标签: 杂谈 分类: 技术学习之其他 Logger来自log4j自己 ...

  4. java -jar命令运行jar包时指定外部依赖jar包

    大家都知道一个java应用项目可以打包成一个jar,当然你必须指定一个拥有main函数的main class作为你这个jar包的程序入口.具体的方法是修改jar包内目录META-INF下的MANIFE ...

  5. java slf4j log4j_SLF4J和log4j的使用

    SLF4J的使用和Log4j的配置 SLF4J 简介 完整用户手册请异步:SLF4J 使用手册 SLF4J是Simple Logging Facade for Java的简写,即Java简单日志门面, ...

  6. linux 测试环境启用jar_Linux下用java -jar运行可执行jar包的方法教程

    问题来源 一般来说,一个稍微大些的项目都会有一些依赖的Jar包,而在将项目部署到服务器的过程中,如果没有持续集成环境的话,也就是说服务器不支持在线编译及打包,那么需要自己上传依赖的Jar包,然而可能服 ...

  7. java file 其他电脑上,java - Jar文件无法在另一台PC上执行

    我有一个可编程的jar文件,我从我的程序编译,我在我的电脑上运行它 . 当我在命令提示符下使用 java -jar [nameofjar.jar] 运行它时它完全正常工作 但是,我尝试在另一台电脑上测 ...

  8. 介绍java -cp java -jar的区别

    java -cp 和 -classpath 一样,是指定类运行所依赖其他类的路径,通常是类库,jar包之类,需要全路径到jar包,window上分号";" java -cp &am ...

  9. java -cp 和 java -jar 的区别

    目录 java -cp java -jar maven 打包 java -cp java -cp 和 -classpath 一样,是指定类运行所依赖其他类的路径,通常是类库.jar 包之类,需要全路径 ...

最新文章

  1. 亚马逊推出VR/AR开发平台Sumerian,功能强大不同于Poly
  2. UE4用音乐音效,各种声音都有,比较全了
  3. json数组显示格式
  4. 矩阵的乘法通用模板(C++/Java)
  5. Facebook、LinkedIn、Airbnb、Google专家聚首QCon,他们会带来什么?
  6. EasyMock学习笔记
  7. 用solidity语言开发代币智能合约
  8. java 查找注解_Java利用反射如何查找使用指定注解的类详解
  9. altiumdesigner的基本你操作
  10. Atitit Java内容仓库(Java Content Repository,JCR)的JSR-170 文件存储api标准 目录 1. Java内容仓库 1 2. Java内容仓库 2 2.1.
  11. python程序代码大全-Python编程代码示例 - 全文
  12. AB PLC软件如何破解?
  13. K3C使用校园网折腾之路
  14. 聊聊身边的嵌入式—英语学习利器点读笔
  15. delphi 各版本的特性
  16. 谈谈写程序与学英语 --宋劲杉
  17. 【Python百日进阶-Web开发-Feffery】Day437 - fac实例:使用fac中上传组件时实现自主控制uploadId
  18. 计算机毕业设计源代码 javaSSM274基于VUE酒店客房管理系统 论文答辩ppt
  19. 2021年中国智能驾驶行业研究报告
  20. [PHP] PHP7.4.2安全和修复版本的更改日志

热门文章

  1. MySQL计算在线时长(超过2分钟未上传不在计算范围)
  2. Object类toString()和equals()方法剖析
  3. php 代码修改后 重新实例化_从匿名函数到PHP设计模式之容器模式
  4. swift语言 数组定义_Swift3中数组创建方法
  5. 带缓冲的I/O操作和不带缓冲的I/O操作
  6. java多播_Java多播发送数据,未接收
  7. 数据结构与算法 / 数组(Array)
  8. 用启明云端支持ESP32的GUI做了一个测温HMI交互界面
  9. vivo计算机隐藏游戏,vivo
  10. mysql缓存 碎片_Mysql查询缓存碎片、缓存命中率及Nagios监控