lab4中要求为经过异常处理、错误处理的程序增加日志功能,我选择使用第三方java日志库log4j2,在安装使用中遇到一些问题,借此在这里分享。
log4j2的安装
系统:Windows 10
工具:Eclipse
首先搜索log4j2,进入其官方网站的下载界面,我使用Windows10系统,选择第二个binary压缩包的下载链接进行镜像下载即可。
其中binary是编译好的可以直接使用,source是还没编译过的源代码,需要自行编译,在这里选择binary版本即可。
下载好压缩包后进行解压,按照官网上的说明,至少要导入
- log4j-api-2.13.3.jar
- log4j-core-2.13.3.jar
然后将日志库导入到项目中,右键→Build Path→Configure Build Path,然后选择Add JARs或Add External JARs,取决于JAR包放在哪里,不再赘言。
log4j2的配置
新建XML文件
log4j2安装后需要配置,即日志的记录方式、格式,以及输出到文件等工作。在这里我遇到了一个问题,实验指导书上给的第三方java日志库是log4j,即log4j的第一代版本,但其网站上提供的下载是第二代版本即我选用的log4j2。这两者的配置方式不同,log4j通过log4j.properties进行配置,但log4j2通过log4j2.xml进行配置,如果搜索log4j的话会导致下载的版本和网上提供的教程有冲突,这点需要注意。
log4j2会在编译时搜索在同一文件夹下的log4j2.xml,进行自动配置,log4j则是搜索log4j.properties。
首先在源文件夹下右键→New→Other…以新建一个空的xml文件
新建好文件重命名后,会看到一个空白的表格,这时需要调整到Source视图进行编辑。
XML文件示例
接下来,我给出对于我的log4j2进行的配置文件内容,并会在下一节进行具体的解析。
不过首先要了解以下两点:
- log4j2的日志包含几种级别,其优先级为:OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL,用于对于日志的分类,例如一些无法处理的异常,可以用error级别记录,一些可以进行处理的异常可以将异常信息及处理信息用debug级别记录,输出到文件时可以选择输出的最低级别,这就是优先级的作用之一;
- log4j2自身也有优先级,Configuration后面的status就是用于设置log4j2自身内部的信息输出,如果调整优先级至debug或trace,输出到控制台上的内容就会不止你源代码中想要记录的日志,还包括log4j2自身的日志;
<?xml version="1.0" encoding="UTF-8"?>
<!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出 -->
<!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数 -->
<configuration status="WARN" monitorInterval="30">
<!--先定义所有的appender -->
<appenders>
<!--这个输出控制台的配置 -->
<console name="Console" target="SYSTEM_OUT">
<!--输出日志的格式 -->
<PatternLayout
pattern="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%p] - %l - %m%n" />
</console>
<!-- 这个会打印出所有的error及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档 -->
<RollingFile name="RollingFileError"
fileName="logInformation/error.log"
filePattern="logInformation/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log">
<!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) -->
<ThresholdFilter level="error" onMatch="ACCEPT"
onMismatch="DENY" />
<PatternLayout
pattern="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%p] - %l - %m%n" />
<Policies>
<TimeBasedTriggeringPolicy />
<SizeBasedTriggeringPolicy size="100 MB" />
</Policies>
</RollingFile>
<RollingFile name="RollingFileDebug"
fileName="logInformation/debug.log"
filePattern="logInformation/$${date:yyyy-MM}/debug-%d{yyyy-MM-dd}-%i.log">
<ThresholdFilter level="debug" onMatch="ACCEPT"
onMismatch="DENY" />
<PatternLayout
pattern="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%p] - %l - %m%n" />
<Policies>
<TimeBasedTriggeringPolicy />
<SizeBasedTriggeringPolicy size="100 MB" />
</Policies>
<!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件,这里设置了20 -->
<DefaultRolloverStrategy max="20" />
</RollingFile>
<RollingFile name="RollingFileInfo"
fileName="logInformation/info.log"
filePattern="logInformation/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log">
<ThresholdFilter level="info" onMatch="ACCEPT"
onMismatch="DENY" />
<PatternLayout
pattern="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%p] - %l - %m%n" />
<Policies>
<TimeBasedTriggeringPolicy />
<SizeBasedTriggeringPolicy size="100 MB" />
</Policies>
<!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件,这里设置了20 -->
<DefaultRolloverStrategy max="20" />
</RollingFile>
</appenders>
<!--然后定义logger,只有定义了logger并引入的appender,appender才会生效 -->
<loggers>
<!--过滤掉spring和mybatis的一些无用的DEBUG信息 -->
<logger name="org.springframework" level="INFO"></logger>
<logger name="org.mybatis" level="INFO"></logger>
<root level="all">
<appender-ref ref="Console" />
<appender-ref ref="RollingFileError" />
<appender-ref ref="RollingFileDebug" />
<appender-ref ref="RollingFileInfo" />
</root>
</loggers>
</configuration>
XML文件具体内容
控制台配置
这部分构成相对简单,需要了解的是pattern的内容含义:
- %d:表示日期,后面是日期的格式,可以按喜好设置;
- %p:表示日志记录的异常的类别或者说日志的级别;
- %l:表示日志记录的异常的类名、方法名、具体行数;
- %m:表示传入的具体信息,字符串;
- %n:对应不同系统的换行符;
<!--这个输出控制台的配置 -->
<console name="Console" target="SYSTEM_OUT">
<!--输出日志的格式 -->
<PatternLayout
pattern="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%p] - %l - %m%n" />
</console>
输出到文件配置
以输出error及以上级别日志到文件的配置为例,
<!-- 这个会打印出所有的error及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档 -->
<RollingFile name="RollingFileError"
fileName="logInformation/error.log"
filePattern="logInformation/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log">
<!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) -->
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY" />
<PatternLayout
pattern="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%p] - %l - %m%n" />
<Policies>
<TimeBasedTriggeringPolicy />
<SizeBasedTriggeringPolicy size="100 MB" />
</Policies>
</RollingFile>
- 这里使用了RollingFile,可以规定每个log文件的大小;
- fileName这个字符串表示要输出的文件的位置,以及文件名称;
- filePattern表示当输出的日志信息超出RollingFile文件规定的大小时,可以将文件自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档;
- level表示可以输出的文件的级别,在这里ThresholdFilter的设置可以输出 error及以上优先级的日志;
- size是每个log文件的大小上限;
定义logger
只有定义了logger并引入的appender,appender才会生效
<!--然后定义logger,只有定义了logger并引入的appender,appender才会生效 -->
<loggers>
<!--过滤掉spring和mybatis的一些无用的DEBUG信息 -->
<logger name="org.springframework" level="INFO"></logger>
<logger name="org.mybatis" level="INFO"></logger>
<root level="all">
<appender-ref ref="Console" />
<appender-ref ref="RollingFileError" />
<appender-ref ref="RollingFileDebug" />
<appender-ref ref="RollingFileInfo" />
</root>
</loggers>
log4j的配置
由于开始的时候没有注意到下载的版本是log4j2,以及log4j2和log4j的区别,所以看了很多关于log4j配置的文章,发现后本想重新下载log4j,但本着使用新技术的原则,还是继续学习寻找的log4j2的配置,接下来对于log4j简要地给与介绍。
首先在下面的链接处下载log4j的1.2.17:
Download Apache log4j 1.2.17 如前所述,log4j的配置使用的是log4j.properties文件,这里的导入库和配置的模式和log4j2大致相同,添加文件为General下的File,将文件名手动改为带后缀名的log4j.properties即可。
具体语法详见下面的链接进行学习:
log4j2的使用简介
示例代码如下:
package logging;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class logTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
Logger logger = LogManager.getLogger(logTest.class);
for (int i = 0; i < 100; i++) {
logger.debug("This is debug message.");
logger.error("This is error message.");
logger.warn("This is warn message.");
logger.info("This is info message.");
}
}
}
首先通过 Logger logger = LogManager.getLogger(logTest.class); 新建一个logger,接下来可以通过其debug, error, warn, info方法记录日志信息,输出如下:
这里logger的构造方法和log4j1.x中的方法不同,如果想要使用log4j1.x中的方式,可以尝试导入 log4j-1.2-api-2.13.3.jar 的包,其可以保证log4j1.x中的方法在log4j2中兼容。