5 Log4j示例程序

Log4j示例程序

我们已经学会了如何创建配置文件,本章讲述如何生成调试信息,并将其写入一个简单的文本文件。

项目结构

展开/折叠
E:\workspacne_JDK8Tomcat8.5\Log4jDemo
├─lib\
│ ├─commons-logging-1.2.jar
│ ├─log4j-1.2.17.jar
│ ├─log4j-api-2.13.3.jar
│ ├─log4j-core-2.13.3.jar
│ └─mysql-connector-java-8.0.17.jar
├─log.out
├─Log4jConfig\
│ ├─DailyRollingFileAppender\
│ │ └─log4j.properties
│ ├─file\
│ │ └─log4j.properties
│ ├─FileAppender\
│ │ ├─log4j.properties
│ │ └─log4j.xml
│ ├─file_and_stout\
│ │ └─log4j.properties
│ ├─grammar\
│ │ └─log4j.properties
│ ├─HTMLLayout\
│ │ └─log4j.properties
│ ├─JDBCAppender\
│ │ ├─log4j.properties
│ │ └─log4j.xml
│ ├─Level\
│ │ └─log4j.properties
│ ├─loggerPackage\
│ │ └─log4j.xml
│ ├─PatternLayout\
│ │ └─log4j.properties
│ ├─RollingFileAppender\
│ │ └─log4j.properties
│ ├─stdout\
│ │ └─log4j.properties
│ └─xml_file_stdout\
│   └─log4j.xml
├─README.md
└─src\
  ├─demo\
  │ ├─file\
  │ │ └─appender\
  │ │   └─XMLFileAppenderTest.java
  │ ├─level\
  │ │ ├─SetLevelByMethod.java
  │ │ └─SetLevleByConfig.java
  │ ├─Log4jExample.java
  │ ├─logpackage\
  │ │ └─LoggerPackage.java
  │ └─method\
  │   └─LoggerMethodTest.java
  └─log4j.properties

源代码

https://github.com/lanlan2017/Log4jDemo

日志输出到文件

Log4j.properties

下面是为我们的例子创建的一个简单配置文件,让我们再来复习一遍:

  • 定义根日志级别为DEBUG,并将名为FILEappender添加其上。
  • appender FILE定义为org.apache.log4j.FileAppender,它将日志写入log目录下一个名为log.out的文件中。
  • layout被定义为%m%n,即先打印日志信息,然后打印换行。

Log4j.properties文件的内容如下:

/Log4jDemo/Log4jConfig/file/log4j.properties
1
2
3
4
5
6
7
8
9
10
11
12
13
## 定义变量,保存日志文件所在的目录
log = E:/workspacne_JDK8Tomcat8.5/Log4jDemo
## Define the root logger with appender file
log4j.rootLogger = DEBUG, FILE

## Define the file appender
log4j.appender.FILE=org.apache.log4j.FileAppender
## 设置日志文件路径
log4j.appender.FILE.File=${log}/log.out

## Define the layout for file appender
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.conversionPattern=%m%n

Log4jExample.java

/Log4jDemo/src/demo/Log4jExample.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package demo;

import java.io.IOException;
import java.sql.SQLException;
import org.apache.log4j.Logger;

public class Log4jExample
{
/* Get actual class name to be printed on */
static Logger log = Logger.getLogger(Log4jExample.class.getName());

public static void main(String[] args) throws IOException, SQLException
{
log.debug("Hello this is a debug message");
log.info("Hello this is an info message");
}
}

运行效果

复制文件Log4jConfig/file/log4j.properties,粘贴到src目录下,然后运行Log4jExample.java程序,此时项目根目录下,会生成一个log.out文件:

展开/折叠
E:\workspacne_JDK8Tomcat8.5\Log4jDemo
├─lib\
│ ├─commons-logging-1.2.jar
│ ├─log4j-1.2.17.jar
│ ├─log4j-api-2.13.3.jar
│ └─log4j-core-2.13.3.jar
├─log.out
├─Log4jConfig\
│ ├─file\
│ │ └─log4j.properties
│ ├─file_and_stout\
│ │ └─log4j.properties
│ ├─grammar\
│ │ └─log4j.properties
│ ├─Level\
│ │ └─log4j.properties
│ └─stdout\
│   └─log4j.properties
└─src\
  ├─demo\
  │ ├─level\
  │ │ ├─SetLevelByMethod.java
  │ │ └─SetLevleByConfig.java
  │ ├─Log4jExample.java
  │ └─method\
  │   └─LoggerMethodTest.java
  └─log4j.properties

打开这个log.out文件,可以看到如下内容

/Log4jDemo/log.out
1
2
3
Hello this is a debug message
Hello this is an info message

日志输出到控制台

log4j.properties

/Log4jDemo/Log4jConfig/stdout/log4j.properties
1
2
3
4
5
6
7
8
9
# Root logger option
#log4j.rootLogger=INFO, STDOUT
log4j.rootLogger=DEBUG, STDOUT

# Direct log messages to STDOUT
log4j.appender.STDOUT=org.apache.log4j.ConsoleAppender
log4j.appender.STDOUT.Target=System.out
log4j.appender.STDOUT.layout=org.apache.log4j.PatternLayout
log4j.appender.STDOUT.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

替换log4j配置文件 重新运行

复制文件/Log4jDemo/Log4jConfig/stdout/log4j.properties,粘贴到src目录下,然后运行Log4jExample.java.此时日志将会输出在控制台.

1
2
3
2020-08-03 17:34:14 DEBUG Log4jExample:14 - Hello this is a debug message
2020-08-03 17:34:14 INFO Log4jExample:15 - Hello this is an info message

日志同时输出到文件和控制台

log4j.properties

/Log4jDemo/Log4jConfig/file_and_stout/log4j.properties
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 定义变量,保存日志文件所在的目录
log = E:/workspacne_JDK8Tomcat8.5/Log4jDemo
# Define the root logger with appender file and stdout
log4j.rootLogger = DEBUG, FILE, STDOUT

# Define the FILE appender
log4j.appender.FILE=org.apache.log4j.FileAppender
# 设置日志文件路径
log4j.appender.FILE.File=${log}/log.out
# Define the layout for file appender
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.conversionPattern=%m%n

# Define the STDOUT appender
log4j.appender.STDOUT=org.apache.log4j.ConsoleAppender
log4j.appender.STDOUT.Target=System.out
# Define the layout for STDOUT appender
log4j.appender.STDOUT.layout=org.apache.log4j.PatternLayout
log4j.appender.STDOUT.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

复制文件/Log4jDemo/Log4jConfig/file_and_stout/log4j.properties,覆盖src目录下的log4j.properties,删除掉项目根目录下的log.out文件,然后运行Log4jExample.java
这样会重新生成log.out,并写一份日志写到该文件中:

/Log4jDemo/log.out
1
2
3
Hello this is a debug message
Hello this is an info message

另一份日志打印在控制台中:

控制台输出
1
2
3
2020-08-03 17:41:36 DEBUG Log4jExample:14 - Hello this is a debug message
2020-08-03 17:41:36 INFO Log4jExample:15 - Hello this is an info message