小工具      在线工具  汉语词典  css  js  c++  java

Java日志输出Logger,Commons Logging,Log4j的运用

Java,java 额外说明

收录于:152天前

日志

在编写程序的过程中,常常用System.out.println()打印出执行过程中的某些变量,观察每一步的结果与代码逻辑是否符合,然后有针对性地修改代码。改好之后又要删除打印语句,这样很麻烦。

日志是记录程序的运行轨迹,展示关键信息,方便快速定位和解决问题。使用日志来输出程序执行的结果比较方便,有以下好处:

  • 设置输出样式,避免自己每次都写INFO: + message
  • 设置输出级别并禁用某些级别的输出。例如,只输出错误日志;
  • 重定向到文件,以便在程序运行完毕后可以查看日志;
  • 通过包名控制日志级别,仅输出特定包的日志;

Logger

Java标准库内置了日志包java.util.logging,可以直接使用Logger类来输出日志。

JDK Logging定义了7个日志级别,从严重到正常:

  • SEVERE
  • WARNING
  • INFO
  • CONFIG
  • FINE
  • FINER
  • FINEST

由于默认级别为INFO,因此INFO级别以下的日志不会被打印。使用日志级别的好处是,通过调整级别,可以阻止大量与调试相关的日志输出。

public static void main(String[] args) {
    
    Logger logger=Logger.getLogger("hell0");
    logger.severe("severe---success");
    logger.warning("warning---success");
    logger.info("info----success");
    logger.config("config----success");
    logger.fine("fine----success");
    logger.finer("finer----success");
    logger.finest("finest----success");


}

在这里插入图片描述

Logging系统在JVM启动时读取配置文件并完成初始化,一旦开始运行main()方法,就无法修改配置;
配置不太方便,需要在JVM启动时传递参数Djava.util.logging.config.file=<config-file-name>

Commons Logging

与Java标准库提供的日志不同,Commons Logging是一个第三方日志库,它是Apache创建的日志模块。

使用Commons Logging一定要引入工具包。
在这里插入图片描述

Commons Logging 定义了 6 个日志级别:

  • FATAL
  • ERROR
  • WARN
  • INFO
  • DEBUG
  • TRACE

默认级别是INFO

Commons Logging的Log类由LogFactory的getLog()方法构造,参数有两种,第一个是Class类,第二个是String。
在这里插入图片描述
Class类标记某个类,即在实例化类的对象时才会打应日志信息,而String的就是为Log命名,在哪调用日志方法就在哪打印。

//类调用
package com.company.loging;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class Student {
    
    private static Log log= LogFactory.getLog(Student.class);
    private String name="李华";
    private int age=20;

    public String getName() {
    
        log.info("学生类的姓名正在被调用");
        return name;
    }

    public int getAge() {
    
        log.info("学生类的年龄正在被调用");
        return age;
    }
}

//主函数
public static void main(String[] args) {
    
      Student student=new Student();
      System.out.println(student.getName());
      System.out.println(student.getAge());
  }


在这里插入图片描述

//name命名
public static void main(String[] args) {
    
    Log log= LogFactory.getLog("hello");

    log.fatal("fatal---success");
    log.error("error---success");
    log.warn("warn---success");
    log.info("info---success");
    log.debug("debug---success");
    log.trace("trace---success");
}

Log4j

commons-logging不是一个日志控件,没有日志功能,它只是统一了JDK Logging与Log4j的API,并把日志功能交给JDK Loggings或者是log4j。如果要实现日志系统则要使用log4j作为输出类。

在这里插入图片描述
使用Log4j输出一条日志时,Log4j自动通过不同的Appender把同一条日志输出到不同的目的地:

  • console:输出到屏幕;
  • file:输出到文件;
  • socket:通过网络输出到远程计算机;
  • jdbc:输出到数据库。

在输出日志的过程中,通过Filter来过滤日志级别即哪些log需要被输出,哪些log不需要被输出。如,仅输出ERROR级别的日志。通过Layout来格式化日志信息,例如,自动添加日期、时间、方法名称等信息。

引入工具包
在这里插入图片描述
log4j-api-2.x.jar
log4j-core-2.x.jar
log4j-jcl-2.x.jar
下载链接

Commons Logging 集成了 Log4j 的 API。您只需要配置 Log4j 并遵循 Commons Logging 的语法即可。无需更改任何代码即可获得Log4j的日志输出。

配置log4j文件

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
    <Properties>
        <!-- 定义日志格式 -->
        <Property name="log.pattern">%d{MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36}%n%msg%n%n</Property>
        <!-- 定义文件名变量 -->
        <Property name="file.err.filename">log/err.log</Property>
        <Property name="file.err.pattern">log/err.%i.log.gz</Property>
    </Properties>
    <!-- 定义Appender,即目的地 -->
    <Appenders>
        <!-- 定义输出到屏幕 -->
        <Console name="console" target="SYSTEM_OUT">
            <!-- 日志格式引用上面定义的log.pattern -->
            <PatternLayout pattern="${log.pattern}" />
        </Console>
        <!-- 定义输出到文件,文件名引用上面定义的file.err.filename -->
        <RollingFile name="err" bufferedIO="true" fileName="${file.err.filename}" filePattern="${file.err.pattern}">
            <PatternLayout pattern="${log.pattern}" />
            <Policies>
                <!-- 根据文件大小自动切割日志 -->
                <SizeBasedTriggeringPolicy size="1 MB" />
            </Policies>
            <!-- 保留最近10份 -->
            <DefaultRolloverStrategy max="10" />
        </RollingFile>
    </Appenders>
    <Loggers>
        <Root level="info">
            <!-- 对info级别的日志,输出到console -->
            <AppenderRef ref="console" level="info" />
            <!-- 对error级别的日志,输出到err,即上面定义的RollingFile -->
            <AppenderRef ref="err" level="error" />
        </Root>
    </Loggers>
</Configuration>

主程序

   public static void main(String[] args) {
    
        Log log= LogFactory.getLog("hello");

        log.fatal("fatal---success");
        log.error("error---success");
        log.warn("warn---success");
        log.info("info---success");
        log.debug("debug---success");
        log.trace("trace---success");
    }

如下图在主目录多了一个log目录:
在这里插入图片描述
在这里插入图片描述
这些都是通过配置文件来配置的。

Log4j配置文件详解

配置文件的格式:log2j配置文件可以是xml格式的,也可以是json格式的。
配置文件的位置:log4j2默认会在classpath目录下寻找log4j2.xml、log4j.json、log4j.jsn等名称的文件。
默认使用log4j2.xml进行命名。

根节点Configuration

根节点Configuration有两个属性:statusmonitorinterval,有两个子节点:AppendersLoggers(表明可以定义多个Appender和Logger)。也可以在Configuration中定义Properties用来定义初始化变量。

<Configuration status="" monitorinterval="">
    <Properties>
        <Property name="">value</Property>
        <Property name="">value</Property>
    </Properties>
	<Appenders>
		...
	</Appenders>

	<Loggers>
		...
	</Loggers>
 </Configuration >   

status用来指定log4j本身的打印日志的级别。
monitorinterval用于指定log4j自动重新配置的监测间隔时间,单位是s,最小是5s。

Appenders节点

Appenders节点,有两个子节点:ConsoleRollingFile

 <Appenders>
        <!-- 定义输出到屏幕 -->
        <Console name="console" target="SYSTEM_OUT">
            <!-- 定义日志输出格式 -->
            <PatternLayout pattern="${log.pattern}" />
        </Console>
        <!-- 定义输出到文件,文件名和位置引用初始化变量 -->
        <RollingFile name="err" bufferedIO="true" fileName="${file.err.filename}" filePattern="${file.err.pattern}">
            <PatternLayout pattern="${log.pattern}" />
            <Policies>
                <!-- 根据文件大小自动切割日志 -->
                <SizeBasedTriggeringPolicy size="1 MB" />
            </Policies>
            <!-- 保留最近10份 -->
            <DefaultRolloverStrategy max="10" />
        </RollingFile>

    </Appenders>

Console节点用来定义输出到控制台的Appender。
  name:指定Appender的名字.
  target:SYSTEM_OUT 或 SYSTEM_ERR,一般只设置默认:SYSTEM_OUT。
  PatternLayout:输出格式,不设置默认为:%m%n。(Java占位符)
name和tartget是属性,PatternLayout是子节点,有一个pattern属性定义输出格式。

RollingFile当满足一定条件(如文件达到了指定的大小,达到了指定的时间)后,就重命名原日志文件进行归档,并生成新的日志文件用于log写入。如果还设置了一定时间内允许归档的日志文件的最大数量,将对过旧的日志文件进行删除操作。

RollingFile节点定义输出到指定位置的文件,实现日志文件滚动更新
   name:指定Appender的名字。
  fileName:指定输出日志的目的文件带全路径的文件名。
  filePattern:指定新建日志文件的名称格式。
  bufferedIO:开启缓冲区
  ThresholdFilter属性:onMatch表示匹配设定的日志级别后是DENY还是ACCEPTonMismatch表示不匹配设定的日志级别是DENY还是ACCEPT还是NEUTRAL。
这四个是属性,后面是子节点。
在这里插入图片描述
  Policies:指定滚动日志的策略,就是什么时候进行新建日志文件输出日志。有两个子节点:
    TimeBasedTriggeringPolicy:Policies子节点,基于时间的滚动策略,interval属性用来指定多久 滚动一次,默认是1 hour。modulate=true用来调整时间:比如现在是早上3am,interval是4,那么第一次滚动是在4am,接着是8am,12am…而不是7am。
    SizeBasedTriggeringPolicy:Policies子节点,基于指定文件大小的滚动策略,size属性用来定义每个日志文件的大小。
  PatternLayout:输出格式,不设置默认为:%m%n。
  DefaultRolloverStrategy:用来指定同一个文件夹下最多有几个日志文件时开始删除最旧的,创建新的(通过max属性)。

Loggers节点

Loggers节点,用来配置日志输出级别,常见的有两种:RootLogger

Root节点用来指定项目的根日志,如果没有单独指定Logger,那么就会默认使用该Root日志输出
  level:日志输出级别,共有8个级别,按照从低到高为:All < Trace < Debug < Info < Warn < Error < Fatal < OFF。
Logger节点用来单独指定日志的形式,比如要为指定包下的class指定不同的日志级别等。
  level:日志输出级别,共有8个级别,按照从低到高为:All < Trace < Debug < Info < Warn < Error < Fatal < OFF。
  name:用来指定该Logger所适用的类或者类所在的包全路径,继承自Root节点。
AppenderRef:Logger和Root的子节点,用来指定该日志输出到哪个Appender,如果没有指定,就会默认继承自Root.如果指定了,那么会在指定的这个Appender和Root的Appender中都会输出,此时我们可以设置Logger的additivity="false"只在自定义的Appender中进行输出。

日志级别
共有8个级别,按照从低到高为:All < Trace < Debug < Info < Warn < Error < Fatal < OFF。
  all:最低等级的,用于打开所有日志记录。
  trace:是追踪,就是程序推进以下,你就可以写个trace输出,所以trace应该会特别多,不过没关系,我们可以设置最低日志级别不让他输出。
  debug:指出细粒度信息事件对调试应用程序是非常有帮助的。
  info:消息在粗粒度级别上突出强调应用程序的运行过程。
  warn:输出警告及warn以下级别的日志。
  error:输出错误信息日志。
  fatal:输出每个严重的错误事件将会导致应用程序的退出的日志。
  off:最高等级的,用于关闭所有日志记录。
程序会打印高于或等于所设置级别的日志,设置的日志等级越高,打印出来的日志就越少。

各种Pattern参数意义

	%d{
    HH:mm:ss.SSS} 表示输出到毫秒的时间
 	%t 输出当前线程名称
  	%-5level 输出日志级别,-5表示左对齐并且固定输出5个字符,如果不足在右边补0
  	%logger 输出logger名称,因为Root Logger没有名称,所以没有输出
 	%msg 日志文本
  	%n 换行
  其他常用的占位符有:
  	%F 输出所在的类文件名,如Log4j2Test.java
  	%L 输出行号
  	%M 输出所在方法名
  	%l 输出语句所在的行数, 包括类名、方法名、文件名、行数

Pattern可以定义在<Properties>节点中,作为初始化变量,之后的配置都引用该变量:

<Properties>
     <!-- 定义日志格式 -->
     <Property name="log.pattern">%d{MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36}%n%msg%n%n</Property>
     <!-- 定义文件名变量 -->
     <Property name="file.err.filename">log/err.log</Property>
     <Property name="file.err.pattern">log/err.%i.log.gz</Property>
 </Properties>

通过${}引用
<PatternLayout pattern="${log.pattern}" />
<RollingFile name="err" bufferedIO="true" fileName="${file.err.filename}" filePattern="${file.err.pattern}"></RollingFile>

${}依赖复制表达式引入log4j-jcl.jar

. . .

相关推荐

额外说明

kafka安装与测试

1. 简介   kafka (官网地址: http://kafka.apache.org )是一款分布式消息发布和订阅的系统,具有高性能和高吞吐率。    i. 消息的发布(publish)称作producer,消息的订阅(subscribe)称作con

额外说明

CTF-合天WEB漏洞靶场

WEB漏洞靶场 实验环境 测试内容 打开burp 开启代理 观察http响应头 Referer理解 X-Forwarded-For理解 Client-IP理解 实验环境 https://www.hetianlab.com/expc.do?ce=34dc9

额外说明

Spring IOC源码解析笔记

 小伙伴们,你们好,我是老寇 Spring最重要的概念就算IOC和AOP,本篇主要记录Spring IOC容器的相关知识,本文适合有spring相关基础并且想了解spring ioc的相关原理的人看 本文采用的源码为Spring 5.3.23,基于注解的

额外说明

PowerDesigner 数据库建模使用详解

目录 一、前言 二、PowerDesigner概述 2.1 PowerDesigner核心能力 2.1.1 集成多种建模能力

额外说明

Ubuntu为julia安装深度学习框架MXNet(支持CUDA和OPenCV编译)

Ubuntu为julia安装深度学习框架MXNet(支持CUDA和OPenCV编译) 环境介绍与注意事项 下载源文件 安装依赖 编译 环境配置 安装MXNet 测试 后记 环境介绍与注意事项 Ubuntu18.04 julia 1.5.3 CUDA 10

额外说明

Java中Iterator用法

迭代器(Iterator) 迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。迭代器通常被称为“轻量级”对象,因为创建它的代价小。 Java中的Iterator功能比较简单,并且只能单向移动: (1)

额外说明

第三届阿里云磐久智维算法大赛——GRU BaseLine

赛题 比赛链接:第三届阿里云磐久智维算法大赛-天池大赛-阿里云天池 (aliyun.com) 大赛概况 庸医只知头痛医头脚痛医脚,凡良医者,必会抽丝剥茧,察其根本,方得药到病除。第一届和第二届磐久智维算法大赛,我们针对异常预测开展了积极的探索和卓有成效的

额外说明

初试微软翻译App

初试微软翻译App Microsoft Translator让能够翻译文字或语音,进行翻译对话,甚至下载语言以供离线使用。微软翻译已经支持9种语言的语音输入,包括阿拉伯语、德语、俄语、法语、繁体中文(台湾)、简体中文、葡萄牙语(巴西)、西班牙语、意大利语

额外说明

wordpress弹窗通知_如何在WordPress中为您的客户添加警告通知

WordPress 弹出通知 作为一名顾问、开发人员或设计师,有时你只是被雇用来做项目然后就离开了。通常在这种情况下,许多开发人员会自定义 WordPress 管理区域并删除所有主要设置选项,以便客户端无法破坏网站。 ,当另一个开发人员进来只是发现他必须

额外说明

新抖音连怼技术,抖音轻松上热门,别再被割了

标题:掌握新媒体运营策略,助你快速爆红抖音,不再“割韭菜” 正文:随着社交媒体的不断发展,抖音已经成为最受欢迎的平台之一。然而,对于很多刚刚入行的新创作者来说,想要在抖音上脱颖而出并走红并不容易。幸运的是,我们可以学习和掌握一些新媒体运营策略,帮助你快速

ads via 小工具