Log4j入门使用(什么是日志? 为什么要使用Log4j)

发布时间 2023-11-14 22:42:22作者: 是小言

什么是Log4j?

Log4j是一个Java日志组件,通过日志记录器接口,为程序提供了灵活的配置选项,可以将不同级别的消息输出到不同的目的地,如控制台,文件,数据库等。Log4j可以帮助开发人员更好地调试应用程序,同时也方便了运维人员对应用程序进行监控和故障排查

为什么要使用Log4j?

Log4j是一个流行的Java日志框架,它有以下几点优点:

1、灵活性:Log4j具有高度的配置灵活性,允许根据需要进行配置和定制。可以根据具体的应用程序要求进行配置。
2、高效性:Log4j实现了多种日志级别,使得可以选择不同的日志级别来记录不同的信息。它还能够在不影响应用程序性能的情况下记录大规模日志数据。
3、可扩展性:Log4j可以轻易地扩展,以满足应用程序要求。
4、统一性:Log4j作为一个标准的日志框架,可以帮助应用程序开发人员在不同的应用程序中使用相同的日志流程。
5、简易性:Log4j拥有易于使用的API,使得记录日志变得非常方便。

怎么使用(配置)Log4j ?

使用Log4j可以大致分为以下几个步骤:

1. 引入Log4j库。可以在Maven中添加以下依赖项:

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

2. 创建和配置log4j.properties文件。在项目的src/main/resources目录下创建log4j.properties文件,编写以下代码:

# 设置日志输出的级别
log4j.rootLogger=DEBUG, console
 
# 配置控制台输出
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.Target=System.out
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

3. 在Java代码中定义Logger对象。在需要记录日志的Java文件中,引入Log4j库并创建Logger对象。

import org.apache.log4j.Logger;
 
public class MyClass {
    private static final Logger logger = Logger.getLogger(MyClass.class);
}

4. 使用Logger对象记录日志。在代码中使用Logger对象的不同方法记录日志,如下所示:

logger.debug("Debug message");
logger.info("Info message");
logger.warn("Warn message");
logger.error("Error message");
logger.fatal("Fatal message");

5. 运行程序并查看日志输出。运行程序后,可以在控制台中看到Log4j输出的日志信息,根据log4j.properties文件中的设置输出不同级别的日志信息

什么是日志?

日志是一种记录软件运行情况、错误和警告的文件或数据库。在软件开发、运维和故障排除过程中,日志可以提供有用的信息,帮助开发人员和运维人员了解应用程序的行为和问题,从而更好地进行调试、测试、性能监控和故障排除。日志通常包含时间戳、事件类型、事件描述、错误码、堆栈跟踪、异常信息等。

为什么要使用日志? 

以下是使用日志的几个原因:

1. 故障排除:日志记录能够提供有用的信息,帮助诊断和解决问题。

2. 软件调试:日志记录可以帮助开发人员更好地了解软件的行为以及问题。

3. 性能调优:日志可以记录应用程序的性能数据,帮助优化应用程序的性能。

4. 安全审计:日志记录可以帮助跟踪可能的安全问题。

5. 维护历史记录:日志可以提供有价值的历史记录,帮助了解软件的演进历史和维护。

6. 业务分析:日志记录可以提供有关用户使用软件的情况、流量和其他业务数据。

总之,日志记录可以提供运营、维护、开发等多方面的有用信息,方便我们优化软件一系列的操作。

怎么使用日志?

经过前面的Log4j日志配置后,可以编辑一个测试实例:

public class log {
 
    public static void main(String[] args) {
        //获取日志记录器
        Logger logger = Logger.getLogger(log.class);
        
        //记录debug日志信息
        logger.debug("这是debug级别的信息");
        
        //记录info日志信息
        logger.info("这是info级别的信息");
        
        //记录error日志信息
        logger.error("这是error级别的信息");
    }
}

控制台结果:

D:\log中的日志文件结果如下:

Log4J采用类似C语言中的printf函数的打印格式格式化日志信息,打印参数如下:

%t 用来输出生成该日志事件的线程的名称
%p 用于输出日志事件的优先级,即DEBUG,INFO,WARN,ERROR,FATAL
%r 用于输出从layout(布局)的构建到日志事件创建所经过的毫秒数
%c 用于输出日志事件的category(类别),通常就是所在类的全名
%F 用于输出被发出日志记录请求,其中的文件名
%d 用于输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd
HH:mm:ss,SSS},输出类似:20017年02月18日 22:10:28,921
%L 用于输出日志事件的发生位置,即在代码中的行数。举例:10
%l用于输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10)
%% 用于输出%标志
%M 用于输出打印该条日志的方法名
%m 用于输出代码中指定的消息
%n 用于输出一个回车换行符,Windows平台为“rn”,Unix平台为“n”

日志级别:

每个Logger都被了一个日志级别(log level),用来控制日志信息的输出。日志级别从高到低分为:
A:off 最高等级,用于关闭所有日志记录。
B:fatal 指出每个严重的错误事件将会导致应用程序的退出。
C:error 指出虽然发生错误事件,但仍然不影响系统的继续运行。
D:warm 表明会出现潜在的错误情形。
E:info 一般和在粗粒度级别上,强调应用程序的运行全程。
F:debug 一般用于细粒度级别上,对调试应用程序非常有帮助。
G:all 最低等级,用于打开所有日志记录。

日志输出:

日志既然都有级别,那么日志输入时也会作用到,在前面配置Log4j时设置了日志输出级别:

当时设置了日志输出级别为debug,那么输出时只会输出日志级别高于等于debug的日志信息到控制台;为了更直观的看到效果,我们先把日志级别设置到info:

再次执行测试示例:

public class log {
 
    public static void main(String[] args) {
        //获取日志记录器
        Logger logger = Logger.getLogger(log.class);
        
        //记录debug日志信息
        logger.debug("这是debug级别的信息");
        
        //记录info日志信息
        logger.info("这是info级别的信息");
        
        //记录error日志信息
        logger.error("这是error级别的信息");
    }
}

控制台结果:

可以看到debug级别的日志信息没有输出,因为它的级别低于我们设置的日志输出级别info。