LOG4J

2023-05-16

LOG4J

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

官方网站: http://logging.apache.org/log4j/1.2/

案例演示

添加pom.xml文件

 <dependencies>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
    </dependencies>

测试方法

    @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");// 追踪信息,记录程序的所有流程信息
    }

使用配置文件

org.apache.log4j.LogManager中,定义了默认的配置文件的命名log4j.properties,log4j.xml

  static public final String DEFAULT_CONFIGURATION_FILE = "log4j.properties";
  
  static final String DEFAULT_XML_CONFIGURATION_FILE = "log4j.xml";  
  
  static final public String DEFAULT_CONFIGURATION_KEY="log4j.configuration";

  static final public String CONFIGURATOR_CLASS_KEY="log4j.configuratorClass";

  public static final String DEFAULT_INIT_OVERRIDE_KEY = "log4j.defaultInitOverride";

我们使用log4j.properties,在resource下创建文件

#日志的级别和输出端
log4j.rootLogger = trace,console
#控制台输出配置
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.layout = org.apache.log4j.SimpleLayout

测试类

@Test
public void testConfig() throws Exception {
  // 创建日志记录器对象
  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");// 追踪信息,记录程序的所有流程信息
}

日志的级别

日志级别从高到低分为

  • fatal:指出每个严重的错误事件将会导致应用程序的退出。
  • error:指出虽然发生错误事件,但仍然不影响系统的继续运行。
  • warn:表明会出现潜在的错误情形。
  • info:一般和在粗粒度级别上,强调应用程序的运行全程。
  • debug:一般用于细粒度级别上,对调试应用程序非常有帮助。
  • trace:是程序追踪,可以用于输出程序运行中的变量,显示执行的流程。

还有两个特殊的级别:

  • OFF:可用来关闭日志记录
  • ALL:启用所有消息的日志记录

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

log4j组件

Log4J 主要由 Loggers (日志记录器)、Appenders(输出端)和 Layout(日志格式化器)组成。

  • Loggers 控制日志的输出级别与日志是否输出
  • Appenders 指定日志的输出方式(输出到控制台、文件 等)
  • Layout 控制日志信息的输出格式。

loggers

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

例如:nameorg.apache.commonslogger会继承 nameorg.apachelogger

Log4J中有一个特殊的logger叫做“root”,他是所有logger的根,也就意味着其他所有的logger都会直接或者间接地继承自root。

root logger可以用Logger.getRootLogger()方法获取。

Appenders

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

输出端类型作用
ConsoleAppender将日志输出到控制台
FileAppender将日志输出到文件中
DailyRollingFileAppender将日志输出到一个日志文件,并且每天输出到一个新的文件
RollingFileAppender将日志信息输出到一个日志文件,并且制定文件的尺寸,当文件大小达到制定尺寸时,会自动把文件改名,同时产生一个新的文件
JDBCAppender把日志信息保存到数据库中

Layouts

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

格式化器类型作用
HTMLLayout格式化日志输出为HTML表格形式
SimpleLayout简单的日志输出格式化,打印的日志格式为(info - message)
PatternLayout最强大的格式化期,可以根据自定义格式输出日志,如果没有指定转换格式,就是用默认的转换格式

Layout的格式

在 log4j.properties 配置文件中,我们定义了日志输出级别与输出端,在输出端中分别配置日志的输出 格式。

log4j 采用类似 C 语言的 printf 函数的打印格式格式化日志信息,具体的占位符及其含义如下:
        %m 输出代码中指定的日志信息
        %p 输出优先级,及 DEBUG、INFO 等
        %n 换行符(Windows平台的换行符为 "\n",Unix 平台为 "\n")
        %r 输出自应用启动到输出该 log 信息耗费的毫秒数
        %c 输出打印语句所属的类的全名
        %t 输出产生该日志的线程全名
        %d 输出服务器当前时间,默认为 ISO8601,也可以指定格式,如:%d{yyyy年MM月dd日 HH:mm:ss}
        %l 输出日志时间发生的位置,包括类名、线程、及在代码中的行数。如:Test.main(Test.java:10)
        %F 输出日志消息产生时所在的文件名称
        %L 输出代码中的行号 %% 输出一个 "%" 字符
       
可以在 % 与字符之间加上修饰符来控制最小宽度、最大宽度和文本的对其方式。如:
        %5c 输出category名称,最小宽度是5,category<5,默认的情况下右对齐
        %-5c 输出category名称,最小宽度是5,category<5,"-"号指定左对齐,会有空格
        %.5c 输出category名称,最大宽度是5,category>5,就会将左边多出的字符截掉,<5不会有空格
        %20.30c category名称<20补空格,并且右对齐,>30字符,就从左边交远销出的字符截掉

Appender的输出

控制台

log4j.appender.Console=org.apache.log4j.ConsoleAppender这个配置中,log4j.appender.ConsoleConsole就是输出端的名字

#指定日志的输出级别与输出端
log4j.rootLogger=INFO,Console

# 控制台输出配置 log4j.appender.Console 的Console就是名字,对应上面的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.rootLogger=INFO,A

# 文件输出配置
log4j.appender.A=org.apache.log4j.DailyRollingFileAppender
#指定日志的输出路径
log4j.appender.A.File=/Users/machoul/IdeaProjects/machoul-log-test/machoul-log4j-test/logger/logger.log
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

数据库

#指定日志的输出级别与输出端
log4j.rootLogger=INFO,logDB

#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://172.16.140.130:3306/machoul_common_test
log4j.appender.logDB.User=machoul
log4j.appender.logDB.Password=machoul
log4j.appender.logDB.Sql=INSERT INTO sys_log(project_name,create_date,level,category,file_name,thread_name,line,all_category,message) values('pro-service-name','%d{yyyy-MM-dd HH:mm:ss}','%p','%c','%F','%t','%L','%l','%m')

需要添加mysql的驱动

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.30</version>
        </dependency>

另外建表语句

CREATE TABLE `sys_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`)
);

自定义logger

修改配置

#指定日志的输出级别与输出端
#log4j.rootLogger=INFO,Console
# 自定义Logger
log4j.logger.com.machoul = info,A,Console
log4j.logger.org.apache = error,logDB,Console

添加测试类

@Test
public void testCustomLogger(){
  Logger logger1 = Logger.getLogger(Log4jTest.class);
  logger1.fatal("fatal");
  logger1.error("error");
  logger1.warn("warn");
  logger1.info("info");
  logger1.debug("debug");
  logger1.trace("trace");
  
  Logger logger2 = Logger.getLogger(Logger.class);
  logger2.fatal("fatal");
  logger2.error("error");
  logger2.warn("warn");
  logger2.info("info");
  logger2.debug("debug");
  logger2.trace("trace");
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LOG4J 的相关文章

随机推荐

  • centos安装wxWidgets,erlang,RabbitMq

    centos安装wxWidgets erlang RabbitMq 默认已经安装了java环境 而安装RabbitMq需要安装erlang xff0c 安装erlang又需要安装wxWidgets 安装wxWidgets 更新系统 yum
  • 2.rabbitmq概述和helloworld

    rabbitmq概述 rabbitmq中的几个概念 BROKER 接收和分发消息的应用 xff0c RabbitMQ Server 就是 Message Broker Virtual Host 出于多租户和安全因素设计的 xff0c 把 A
  • 3.rabbitmq轮询和不公平分发

    rabbitmq轮询和不公平分发 rabbitmq轮询分发 rabbitmq默认是使用轮询来分发消息的 测试代码如下所示 生产者代码 span class token comment 生产者 task rabbitmq 轮询演示 span
  • 4.rabbitmq消息应答

    rabbitmq消息应答 概述 消息应答就是消费者在收到消息的时候 xff0c 在它接收到消息并处理完毕之后 xff0c 告诉rabbitmq它已经处理完了 xff0c rabbitmq可以删除这个消息了 消息应答的方式 channel b
  • 5.rabbitmq持久化

    rabbitmq持久化 队列的持久化 队列的持久化需要我们在声明的时候指定其持久化 使用durable 61 true来持久化队列 span class token comment 队列的持久化 span span class token
  • 关于双控阵列的实现原理的讨论

    xfeff xfeff http bbs chinaunix net forum viewthread tid 4140392 html 对于一个支持FC SAN的双控存储阵列 xff0c 对外号称active active xff0c 实
  • 6.rabbitmq中exchange的几种形式

    rabbitmq中exchange的几种形式 RabbitMQ 消息传递模型的核心思想是 生产者生产的消息从不会直接发送到队列 实际上 xff0c 通常生产 者甚至都不知道这些消息传递传递到了哪些队列中 相反 xff0c 生产者只能将消息发
  • 7.rabbitmq死信和死信队列

    rabbitmq死信和死信队列 概述 先从概念解释上搞清楚这个定义 xff0c 死信 xff0c 顾名思义就是无法被消费的消息 xff0c 字面意思可以这样理 解 xff0c 一般来说 xff0c producer 将消息投递到 broke
  • 8.rabbitmq发布确认

    rabbitmq发布确认 生产者将信道设置成 confirm 模式 xff0c 一旦信道进入 confirm 模式 xff0c 所有在该信道上面发布的 消息都将会被指派一个唯一的 ID 从 1 开始 xff0c 一旦消息被投递到所有匹配的队
  • 9.延迟队列

    延迟队列 延迟队列的概念 延时队列 队列内部是有序的 xff0c 最重要的特性就体现在它的延时属性上 xff0c 延时队列中的元素是希望 在指定时间到了以后或之前取出和处理 xff0c 简单来说 xff0c 延时队列就是用来存放需要在指定时
  • 10.回退消息

    rabbitmq回退消息 mandatory参数 在仅开启了生产者确认机制的情况下 xff0c 交换机接收到消息后 xff0c 会直接给消息生产者发送确认消息 xff0c 如果发现该消息不可路由 xff0c 那么消息会被直接丢弃 xff0c
  • 11.备份交换机

    备份交换机 概念 当交换机收到一条不可路由消息时 xff0c 将会把这条消息转发到备份交换机中 xff0c 由备份交换机来进行转发和处理 xff0c 通常备份交换机的类型为fanout xff0c 这样就能把所有消息都投递到与其绑定的队列中
  • 12.优先级队列和惰性队列

    优先级队列 如何添加优先级 选择Maximum priority xff0c 指定优先级的数值 xff0c 设定范围为0 255 xff0c 如果值为10 xff0c 那么就是0 10 xff0c 最大不能超过255 代码形式 span c
  • 13.rabbitmq集群搭建

    rabbitmq集群搭建和镜像队列 集群搭建 准备三台服务器 172 16 140 133 Jan172 16 140 132 Feb172 16 140 133 Mar 修改3台机器的hosts文件 span class token fu
  • 14.haproxy+keepalived负载均衡和高可用

    haproxy 43 keepalived负载均衡和高可用 概述 多个rabbitmq服务形成集群 xff0c 由haproxy来做负载均衡 xff0c haproxy会暴露出来一个端口 xff0c 客户端可以通过haproxy所在的服务器
  • 15.federation

    federation和shovel federation exchange 问题的由来 xff1a 城市A有rabbitmqA xff0c 城市B有rabbitmqB xff0c 当城市B的应用要发消息到exchangeA的时候 xff0c
  • vue瀑布流插件vue-waterfall-easy 2.x

    不知道大家都是怎么用瀑布流的 xff0c 一开始尝试用flex布局失败 xff0c 后面找到了这个组件 xff0c 还是挺好用的 xff0c 记录一下 首先是用npm安装npm install vue waterfall easy save
  • 1.JUL

    JUL JUL全称Java util Logging是java原生的日志框架 xff0c 使用时不需要另外引用第三方类库 xff0c 相对其他日志框架使用方便 xff0c 学习简单 xff0c 能够在小型应用中灵活使用 架构介绍 Logge
  • Log4j2

    Log4j2 目前市面上最主流的日志门面就是SLF4J xff0c 虽然Log4j2也是日志门面 xff0c 因为它的日志实现功能非常强 大 xff0c 性能优越 所以大家一般还是将Log4j2看作是日志的实现 xff0c Slf4j 43
  • LOG4J

    LOG4J Log4j是Apache下的一款开源的日志框架 xff0c 通过在项目中使用 Log4J xff0c 我们可以控制日志信息输出到控 制台 文件 甚至是数据库中 我们可以控制每一条日志的输出格式 xff0c 通过定义日志的输出级别