日志处理 - Log4j 1.x

  • Java 日志处理的发展史
  • Log4j 1.x
    • 日志级别 - 6种
    • pattern - 输出格式
  • Log4j 1.x - properties
    • 子Logger
    • Appender - 控制日志的输出目标
      • ConsoleAppender - 将日志输出到控制台
      • FileAppender - 将日志输出到文件(单个)
      • RollingFileAppender - 将日志输出到文件(滚动)
      • DailyRollingFileAppender - 根据日期格式将日志输出到文件(滚动)
  • Log4j 1.x - XML
    • Filter - 让 Appender 在 Logger 的基础上过滤日志信息
  • Log4j 1.x - 开启内部日志信息
  • JCL + Log4j 1.x
    • JCL - 实现原理

Java 从 0 到架构师目录:【Java从0到架构师】学习记录

Gitee 代码:https://gitee.com/szluyu99/mj_java_frame/tree/master/04_SpringBoot


日志 (Log) 的作用:

  • 开发调试:在开发过程中,进行逻辑跟踪、查看运行结果
  • 问题排查:辅助排查和定位线上问题,优化程序运行性能
  • 状态监控:监控系统的运行状态、检测非授权的操作
  • 数据分析
    日志中蕴含了大量的用户数据,包括点击行为,兴趣偏好等
    用户数据对于公司下一步的战略方向有一定的指导方向

Java 日志处理的发展史

最原始

  • System.out、System.err

JUL (Java Util Logging)

  • JDK 自带的日志框架,在 java.util.logging 包下
  • API 不完善、对开发者不友好,很少人使用

Log4j (Log for Java)

  • 由 Apache 组织推出
  • 1.x 版本于 2015年8月5日 宣布停止维护

JCL (Jakarta Commons Logging)

  • 由 Apache 组织推出的日志门面接口
  • 提供一套 API 来实现不同 Logger 之间的切换

SLF4J (Simple Logging Facade For Java)

  • 由 Log4j 作者开发的日志门面接口,比 JCL 更优秀更好用

Logback

  • 由 Log4j 作者开发,比 Log4j 1.x 性能高很多,实现了 SLF4J

Log4j2

  • 由 Apache 组织推出的,Log4j 1.x 的重大升级改进版,改进了 Logback 的一些问题
  • 既是门面接口,又是日志实现

日志框架总结:

  • 门面接口:JCL、SLF4J、Log4j2
  • 日志实现:JUL、Log4j 1.x、Logback、Log4j2

课程大纲:

  • Log4j 1.x(实现)
  • JCL(门面)
    Log4j 1.x(实现)
  • SLF4J(门面)
    Log4j 1.x(实现)
    Logback(实现)+ SpringBoot(重点学习)
    Log4j 2.x(实现)+ SpringBoot
  • Log4j 2.x(门面)
    Log4j 2.x(实现)

Log4j 1.x

示例代码:log4j - properties

<dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version>
</dependency>

配置文件:

  • classpath:log4j.xml(优先级高)
  • classpath:log4j.properties

log4j.properties 功能比 log4j.xml 弱一些

  • 比如 log4j.properties 无法设置 Filter

日志级别 - 6种

public class TestLog4j {public static void main(String[] args) {Logger logger = LogManager.getLogger(TestLog4j.class);logger.fatal("致命_FATAL");logger.error("错误_ERROR");logger.warn("警告_WARN");logger.info("信息_INFO");logger.debug("调试_DEBUG");logger.trace("痕迹_TRACE");}
}

日志的级别由小到大是:TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF

  • 设置了日志级别后,能输出 大于等于 它级别的日志信息,OFF 是关闭日志

pattern - 输出格式

参考:https://logging.apache.org/log4j/2.x/manual/layouts.html#PatternLayout

  • %c:Logger 的全类名
  • %d:时间,%d{yyyy-MM-dd HH:mm:ss.SSS}
  • %t:线程的名称
  • %F:文件名
  • %L:代码行号
  • %M:方法
  • %l:代码的具体位置(哪个类的哪个方法?哪一行?)
  • %m:消息
  • %n:换行
  • %p:日志级别
  • %%:一个%

Log4j 1.x - properties

子Logger

子Logger 可以是包级别类级别

子Logger 默认会继承 父Logger 的 Appender

所有 子Logger 的 最终父Logger 是 rootLogger

log4j.logger.com.mj=ERROR, console, file
# 不继承父级Logger的Appender
log4j.additivity.com.mj=falselog4j.logger.com.mj.TestLog4j=WARN, console
# 不继承父级Logger的Appender
log4j.additivity.com.mj.TestLog4j=false

Appender - 控制日志的输出目标

示例代码:log4j - properties

ConsoleAppender - 将日志输出到控制台

ConsoleAppender 表示输出目标是控制台

# 全局配置
CHARSET=UTF-8
PATTERN=%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5p] [%t]: %m%n# 全局Logger配置(日志级别,输出目标)
log4j.rootLogger=TRACE, console# 输出到控制台
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.encoding=${CHARSET}
# 输出格式
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.conversionPattern=${PATTERN}

FileAppender - 将日志输出到文件(单个)

FileAppender 表示输出目标是文件,缺点是只会将所有日志输出到一个文件中

# 全局Logger配置(日志级别,输出目标)
log4j.rootLogger=TRACE, console# 输出目标(文件)
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.encoding=${CHARSET}
log4j.appender.file.file=F:/logs/log4j.log
# 输出格式
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.conversionPattern=${PATTERN}

还有其他的 Layout,比如:HTMLLayout

RollingFileAppender - 将日志输出到文件(滚动)

滚动:当日志文件大到一定程度的时候,会生成新的日志文件,将内容输出到新的文件中

# 输出到滚动文件
log4j.appender.rollingFile=org.apache.log4j.RollingFileAppender
log4j.appender.rollingFile.encoding=${CHARSET}
log4j.appender.rollingFile.file=F:/logs/log4j.log
# 每个文件最多占用1MB
log4j.appender.rollingFile.maxFileSize=1MB
# 文件的最大索引是10,最多会产生11个文件
# 当文件数量满了,会优先删除事件较早的日志
log4j.appender.rollingFile.maxBackupIndex=10
log4j.appender.rollingFile.layout=org.apache.log4j.PatternLayout
log4j.appender.rollingFile.layout.conversionPattern=${PATTERN}

DailyRollingFileAppender - 根据日期格式将日志输出到文件(滚动)

RollingFileAppender 可以根据指定大小和数量,将内容输出到新的文件,但是不太方便根据时间定位日期,DailyRollingFileAppender 可以设置一个 datePattern(日期格式),从而实现以日期来划输出的日志文件:

示例:

  • datePattern='.'yyyy-MM-dd-HH-mm 则会将每一秒的日志信息输出到不同文件;
  • datePattern='.'yyyy-MM-dd 则会将每一天的日志信息输出到不同的文件;
# 输出到滚动文件
log4j.appender.dailyRollingFile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.dailyRollingFile.encoding=${CHARSET}
log4j.appender.dailyRollingFile.file=F:/logs/log4j.log
# 文件名格式,这里精确到秒
log4j.appender.dailyRollingFile.datePattern='.'yyyy-MM-dd-HH-mm
log4j.appender.dailyRollingFile.layout=org.apache.log4j.PatternLayout
log4j.appender.dailyRollingFile.layout.conversionPattern=${PATTERN}

Log4j 1.x - XML

示例代码:log4j - xml

理解了前面的 properties 的写法后,利用 XML 去配置就会十分容易:

  • ConsoleAppender - 将日志输出到控制台
  • FileAppender - 将日志输出到单个文件
  • RollingFileAppender - 将日志输出到滚动文件
  • DailyRollingFileAppender - 将日志根据日期格式输出到滚动文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configurationPUBLIC "-//log4j/log4j Configuration//EN" "log4j.dtd"><log4j:configuration><!-- appender --><appender name="console" class="org.apache.log4j.ConsoleAppender"><param name="encoding" value="UTF-8"/><layout class="org.apache.log4j.PatternLayout"><param name="conversionPattern" value="%d{HH:mm:ss.SSS} [%-5p] %c: %m%n"/></layout></appender><!-- 将日志输出到文件 --><appender name="file" class="org.apache.log4j.FileAppender"><param name="encoding" value="UTF-8"/><param name="file" value="F:/logs/log4j.log"/><layout class="org.apache.log4j.PatternLayout"><param name="conversionPattern" value="%d{HH:mm:ss.SSS} [%-5p] %c: %m%n"/></layout></appender><!-- 将日志输出到滚动文件 --><appender name="rollingFile" class="org.apache.log4j.RollingFileAppender"><param name="encoding" value="UTF-8"/><param name="file" value="F:/logs/log4j.log"/><param name="maxFileSize" value="1MB"/><param name="maxBackupIndex" value="10"/><layout class="org.apache.log4j.PatternLayout"><param name="conversionPattern" value="%d{HH:mm:ss.SSS} [%-5p] %c: %m%n"/></layout></appender><!-- 将日志根据时间格式输出到滚动文件 --><appender name="dailyRollingFile" class="org.apache.log4j.DailyRollingFileAppender"><param name="encoding" value="UTF-8"/><param name="file" value="F:/logs/log4j.log"/><param name="datePattern" value="'.'yyyy-MM-dd-HH-mm-ss"/><layout class="org.apache.log4j.PatternLayout"><param name="conversionPattern" value="%d{HH:mm:ss.SSS} [%-5p] %c: %m%n"/></layout></appender><!-- logger --><logger name="com.mj" additivity="false"><level value="TRACE"/><appender-ref ref="dailyRollingFile"/></logger><root><level value="TRACE"/><appender-ref ref="console"/><appender-ref ref="file"/></root>
</log4j:configuration>

Filter - 让 Appender 在 Logger 的基础上过滤日志信息

DenyAllFilter 的作用是:关闭所有的日志输出

<appender name="console" class="org.apache.log4j.ConsoleAppender"><layout class="org.apache.log4j.PatternLayout"><param name="conversionPattern" value="%d{HH:mm:ss.SSS} [%-5p] %c: %m%n"/></layout><!-- 关闭所有的日志输出 --><filter class="org.apache.log4j.varia.DenyAllFilter">
</appender>

Filte 中还有以下的概念:

  • LevelMatchFilter - 根据日志级别进行过滤,常用来关闭某个级别的日志
  • LevelRangeFilter - 根据日志级别范围进行过滤
  • StringMatchFilter - 匹配 %m 中的字符串信息

LevelMatchFilter 的使用:关闭 INFO 级别、DEBUG 级别的日志

<!-- 关闭INFO级别的日志 -->
<filter class="org.apache.log4j.varia.LevelMatchFilter"><param name="levelToMatch" value="INFO"/><param name="acceptOnMatch" value="false"/>
</filter>
<!-- 关闭DEBUG级别的日志 -->
<filter class="org.apache.log4j.varia.LevelMatchFilter"><param name="levelToMatch" value="DEBUG"/><param name="acceptOnMatch" value="false"/>
</filter>

LevelRangeFilter 的使用:关闭 [DEBUG, ERROR] 之间的日志

<!-- 只输出[DEBUG, ERROR]之间的日志 -->
<filter class="org.apache.log4j.varia.LevelRangeFilter"><param name="levelMin" value="DEBUG"/><param name="levelMax" value="ERROR"/>
</filter>

StringMatchFilter 的使用:关闭 %m 中包含字符串 “E” 的日志

<!-- 关闭打印信息中包含字符串"E"的日志 -->
<filter class="org.apache.log4j.varia.StringMatchFilter"><param name="stringToMatch" value="E"/><param name="acceptOnMatch" value="false"/>
</filter>

Log4j 1.x - 开启内部日志信息

3种方法开启内部日志信息:

  1. 在 log4j.properties 中配置:
# log4j.properties
log4j.debug=true
  1. 在 log4j.xml 中配置:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configurationPUBLIC "-//log4j/log4j Configuration//EN" "log4j.dtd">
<log4j:configuration debug="true">
</log4j>
  1. 在代码中配置:
LogLog.setInternalDebugging(true);

JCL + Log4j 1.x

示例代码:jcl + log4j1.x

添加依赖:

<dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version>
</dependency><dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.2</version>
</dependency>

使用:

public class TestJCL_Log4j1 {public static void main(String[] args) {Log log = LogFactory.getLog(TestJCL_Log4j.class);log.fatal("致命_FATAL");log.error("错误_ERROR");log.warn("警告_WARN");log.info("信息_INFO");log.debug("调试_DEBUG");log.trace("痕迹_TRACE");}
}

使用 Lombook 自动生成 JCL 的 Log 定义:

@CommonsLog
public class TestJCL_Log4j {// 使用@CommonsLog相当于生成了下面的代码// private static final Log log = LogFactory.getLog(TestJCL_Log4j.class);public static void main(String[] args) {log.fatal("致命_FATAL");log.error("错误_ERROR");log.warn("警告_WARN");log.info("信息_INFO");log.debug("调试_DEBUG");log.trace("痕迹_TRACE");}
}

JCL - 实现原理

JCL 的实现原理是:JCL 内部实现了适配器,在适配器中调用 JUL、Log4j

它有个致命的缺点:一旦要适配新推出的日志框架,JCL 需要修改内部源码,对框架的维护要求十分苛刻,目前已经被 apache 淘汰。

【Java从0到架构师】日志处理 - Log4j 1.x、JCL相关推荐

  1. 【Java从0到架构师】交错的日志系统、SpringBoot 集成日志框架

    交错的日志系统.SpringBoot 集成日志框架 交错复杂的日志系统① - 多个项目实现 SLF4J 门面 交错复杂的日志系统② - 统一底层实现为 Logback 交错复杂的日志系统③ - 统一底 ...

  2. 【Java从0到架构师】日志处理 - SLF4J、Logback、Log4j 2.x

    日志处理 - SLF4J.Logback.Log4j 2.x SLF4J + Log4j 1.x SLF4J + Logback Logback - 配置文件 Logback - 控制台彩色打印 Lo ...

  3. 【Java从0到架构师】SpringCloud - Sleuth、Zipkin、Config

    SpringCloud 链路追踪组件 Sleuth Zipkin 分布式配置中心 - Config Git + Config 分布式配置中心 Java 从 0 到架构师目录:[Java从0到架构师]学 ...

  4. 【Java从0到架构师】SpringCloud - Hystrix、Zuul

    SpringCloud 基本概念 熔断和降级 服务雪崩效应 服务熔断与降级 - Hystrix SpringBoot 集成 Hystrix 熔断降级服务异常报警通知 重点属性 - 熔断隔离策略.超时时 ...

  5. 【Java从0到架构师】RocketMQ 使用 - 发送消息、接收消息、特殊消息

    RocketMQ 消息中间件 入门案例 NameServer 地址 发送消息 同步发送消息 异步发送消息 一次性发送消息 生产者组.消息封装 接收消息 消费方式:推式消费.拉式消费 消息方式:集群模式 ...

  6. 【Java从0到架构师】RocketMQ 基础 - 应用、核心组件、安装

    RocketMQ 消息中间件 基础知识 消息中间件的应用 异步解耦 削峰填谷 消息分发 RocketMQ 核心组件 RocketMQ 安装 源码安装 修改配置参数 启动 管理控制台安装 测试项目 Ja ...

  7. 【Java从0到架构师】Redis 进阶 - 持久化(RBD、AOF)、高可用(主从复制、哨兵机制、Cluster)

    Redis 原理与实战 持久化 Redis 持久化 - RDB Redis 持久化 - AOF AOF 文件重写机制 Redis 高可用 Redis 主从复制 搭建主从复制环境 全量复制和部分复制 R ...

  8. 【Java从0到架构师】Redis 基础 - 数据类型

    Redis 原理与实战 Redis 基础 为什么 Redis 这么快? Redis 安装.启动 Redis 常用配置 Redis 数据类型 通用命令 String - value 可以是字符串.数值. ...

  9. 【Java从0到架构师】Linux 应用 - 软件包管理、软件安装

    Linux 应用 - 软件包管理.软件安装 软件包管理器 rpm yum 软件的安装 jdk 1.8 mysql 5.7 tomcat8 Java 从 0 到架构师目录:[Java从0到架构师]学习记 ...

最新文章

  1. java连连看源代码在哪_连连看java源代码
  2. 4'.deploy.prototxt
  3. 扎心!“我学了六个月 Python,怎么还是会找不到工作”
  4. 收藏!一张图帮你快速建立大数据知识体系
  5. antv图例出现分页_图例-自定义文本样式
  6. 计算机虚拟现实技术论文好写吗,计算机虚拟现实技术论文.docx
  7. 单片机移频防啸叫_基于ARM9的防啸叫音频放大器的设计
  8. php header什么意思,php header的用法是什么
  9. Topological Spaces(拓扑空间)
  10. 浏览器兼容性检查从5.5到11的Internet Explorer版本_IETester
  11. 2021年危险化学品经营单位安全管理人员考试内容及危险化学品经营单位安全管理人员考试报名
  12. 实用工具系列 - Xshell安装下载与使用
  13. gitlab内网部署clone push速度快,网页反应慢
  14. 现在基因测序的瓶颈主要在哪里?精度?速度?
  15. word插入页眉、页码无法正常插入
  16. 计算机应用技术毕业后的简历,计算机应用技术毕业生个人简历模板
  17. hackinglab-脚本关10——基情燃烧的岁月
  18. matlab 填补空洞,OpenCV空洞填充算法
  19. 快手自研直播多码率标准对行业发布
  20. 【MockJS】使用MockJS模拟数据 (超级详细)

热门文章

  1. win10家庭版与专业版有什么区别?
  2. 华为鸿蒙HarmonyOS-面向全场景的分布式操作系统
  3. 2021 年高教社杯全国大学生数学建模竞赛题目(A 题 “FAST”主动反射面的形状调节)
  4. c 结构体之位域(位段)
  5. sql server 跟踪_SQL Server跟踪标志指南; 从-1到840
  6. power bi形状地图_如何使用内置形状图在Power BI中创建地理图
  7. sql server注入_SQL注入:SQL Server中的介绍和预防方法
  8. ssas 维度属性_Analysis Services(SSAS)多维数据集–维度属性和层次结构
  9. sql数据库磁盘响应时间长_SQL Server性能–测量磁盘响应时间
  10. Go语言之进阶篇 netcat工具的使用