当前位置: 首页 > news >正文

Log4j日志框架讲解(全面,详细)

Log4j概述

Log4j是Apache下的一款开源的日志框架,通过在项目中使用 Log4J,我们可以控制日志信息输出到控制台、文件、甚至是数据库中。我们可以控制每一条日志的输出格式,通过定义日志的输出级别,可以 更灵活的控制日志的输出过程。方便项目的调试。

log4j这个日志框架是现在那些流行的日志框架实现的始祖,现在流行的logback,log4j2这些都是基于或者参考log4j这个日志框架实现的,所以学习log4j可以让我们更好的理解和使用现在流行的主流日志框架

官网地址:http://logging.apache.org/log4j/1.2/

log4j的架构(组成)

Loggers

日志记录器,负责收集处理日志记录,实例的命名就是类“XX”的full quailied name(类的全限定名),Logger的名字大小写敏感,其命名有继承机制:例如:name为org.apache.commons的logger会继承 name为org.apache的logger。

Log4J中有一个特殊的logger叫做“root”,他是所有logger的根,也就意味着其他所有的logger都会直接 或者间接地继承自root。root logger可以用Logger.getRootLogger()方法获取。

但是,自log4j 1.2版以来, Logger 类已经取代了 Category 类。对于熟悉早期版本的log4j的人来说, Logger 类可以被视为 Category 类的别名。

  • 早期架构

 Appenders

Appender 用来指定日志输出到哪个地方,可以同时指定日志的输出目的地。Log4j 常用的输出目的地有以下几种:

Layouts

布局器 Layouts用于控制日志输出内容的格式,让我们可以使用各种需要的格式输出日志。Log4j常用 的Layouts:

  • Layout的格式 

Log4J 主要由 Loggers (日志记录器)、Appenders(输出端)和 Layout(日志格式化器)组成。其中 Loggers 控制日志的输出级别与日志是否输出;Appenders 指定日志的输出方式(输出到控制台、文件 等);Layout 控制日志信息的输出格式。

看log4j的组成,其实架构和JUL很像,都是由三部分组成,loffers -->logger,appenders-->handler,layouts-->fomatter  。但具体的实现细节还是有差别的

快速入门

  • 依赖

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

  •  java代码

 public class Log4jTest {
    @Test
    public void testQuick() throws Exception {
        // 初始化系统配置,不需要配置文件
        BasicConfigurator.configure();
        // 创建日志记录器对象
        Logger logger = Logger.getLogger(Log4jTest.class);
        // 日志记录输出
        logger.info("hello log4j");
        // 日志级别
        logger.fatal("fatal");  // 严重错误,一般会造成系统崩溃和终止运行
        logger.error("error");  // 错误信息,但不会影响系统运行
        logger.warn("warn");    // 警告信息,可能会发生问题
        logger.info("info");    // 程序运行信息,数据库的连接、网络、IO操作等
        logger.debug("debug");  // 调试信息,一般在开发阶段使用,记录程序的变量、参数等
        logger.trace("trace");  // 追踪信息,记录程序的所有流程信息
    }


 }

日志的级别

注:一般只使用4个级别,优先级从高到低为 ERROR > WARN > INFO > DEBUG 

log4j.properties

#指定日志的输出级别与输出端

log4j.rootLogger=INFO,Console

# 控制台输出配置

log4j.appender.Console=org.apache.log4j.ConsoleAppender log4j.appender.Console.layout=org.apache.log4j.PatternLayout log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n

# 文件输出配置

log4j.appender.A = org.apache.log4j.DailyRollingFileAppender

#指定日志的输出路径

log4j.appender.A.File = D:/log.txt log4j.appender.A.Append = true

#使用自定义日志格式化器

log4j.appender.A.layout = org.apache.log4j.PatternLayout #指定日志的输出格式 log4j.appender.A.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [%t:%r] - [%p] %m%n

#指定日志的文件编码

log4j.appender.A.encoding=UTF-8

#mysql

log4j.appender.logDB=org.apache.log4j.jdbc.JDBCAppender log4j.appender.logDB.layout=org.apache.log4j.PatternLayout log4j.appender.logDB.Driver=com.mysql.jdbc.Driver log4j.appender.logDB.URL=jdbc:mysql://localhost:3306/test log4j.appender.logDB.User=root log4j.appender.logDB.Password=root log4j.appender.logDB.Sql=INSERT INTO log(project_name,create_date,level,category,file_name,thread_name,line,all_categ ory,message) values('itcast','%d{yyyy-MM-dd HH:mm:ss}','%p','%c','%F','%t','%L','%l','%m')

CREATE TABLE `log` ( `log_id` int(11) NOT NULL AUTO_INCREMENT, `project_name` varchar(255) DEFAULT NULL COMMENT '目项名', `create_date` varchar(255) DEFAULT NULL COMMENT '创建时间', `level` varchar(255) DEFAULT NULL COMMENT '优先级', `category` varchar(255) DEFAULT NULL COMMENT '所在类的全名', `file_name` varchar(255) DEFAULT NULL COMMENT '输出日志消息产生时所在的文件名称 ', `thread_name` varchar(255) DEFAULT NULL COMMENT '日志事件的线程名', `line` varchar(255) DEFAULT NULL COMMENT '号行', `all_category` varchar(255) DEFAULT NULL COMMENT '日志事件的发生位置', `message` varchar(4000) DEFAULT NULL COMMENT '输出代码中指定的消息', PRIMARY KEY (`log_id`) ) 

 待完善。。。。。。。。。。。。。。。。。。。。。。。

相关文章:

  • 上帝之眼(BEVSee):多相机间无需标定,将各自目标统一到同一坐标系下(代码开源,提供数据集)
  • C++编程(五)单例模式 友元
  • 如何寻找一个领域的顶级会议,并且判断这个会议的影响力?
  • SpringBoot学习04-[定制SpringMVC]
  • 在Qt中,直接include <moc_xxxxx.cpp> 为什么不会出现符号冲突的错误?
  • UTONMOS:探索未来区块链与元宇宙的游戏奇妙融合
  • linux的常用系统维护命令
  • Linux的一些杂项函数总结
  • rabbitmq消息队列提出的问题(个人想法)
  • 有哪些好的 Stable Diffusion 提示词(Prompt)可以参考?
  • hive零基础入门
  • QT5:在窗口右上角显示图标
  • 天猫商品列表数据接口(Tmall.item_search)
  • VSCode中常用的快捷键
  • Opencv学习项目6——pyzbar
  • 【剑指offer】让抽象问题具体化
  • 【面试系列】之二:关于js原型
  • create-react-app项目添加less配置
  • crontab执行失败的多种原因
  • js操作时间(持续更新)
  • js对象的深浅拷贝
  • laravel5.5 视图共享数据
  • MySQL-事务管理(基础)
  • passportjs 源码分析
  • React16时代,该用什么姿势写 React ?
  • Twitter赢在开放,三年创造奇迹
  • use Google search engine
  • Yeoman_Bower_Grunt
  • 高程读书笔记 第六章 面向对象程序设计
  • 利用DataURL技术在网页上显示图片
  • 前端每日实战 2018 年 7 月份项目汇总(共 29 个项目)
  • 三栏布局总结
  • 一个SAP顾问在美国的这些年
  • 在Unity中实现一个简单的消息管理器
  • 中国人寿如何基于容器搭建金融PaaS云平台
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • #includecmath
  • (C11) 泛型表达式
  • (pojstep1.3.1)1017(构造法模拟)
  • (十六)串口UART
  • (十七)devops持续集成开发——使用jenkins流水线pipeline方式发布一个微服务项目
  • (使用vite搭建vue3项目(vite + vue3 + vue router + pinia + element plus))
  • (四)JPA - JQPL 实现增删改查
  • (原创)攻击方式学习之(4) - 拒绝服务(DOS/DDOS/DRDOS)
  • (源码版)2024美国大学生数学建模E题财产保险的可持续模型详解思路+具体代码季节性时序预测SARIMA天气预测建模
  • (转)大道至简,职场上做人做事做管理
  • .NET IoC 容器(三)Autofac
  • .NET 反射 Reflect
  • .Net 中Partitioner static与dynamic的性能对比
  • .NET运行机制
  • @AutoConfigurationPackage的使用
  • @JSONField或@JsonProperty注解使用
  • @PreAuthorize注解
  • @RestControllerAdvice异常统一处理类失效原因
  • [ solr入门 ] - 利用solrJ进行检索