🌸 log4j日志过滤:连接MySQL数据库

在软件构造Lab4中,为了实现日志过滤功能,我将log4j与MySQL数据库相连接,在本地数据库中存储日志信息。这样,就可以在MySQL中利用SQL查询语句轻松过滤日志了。

准备MySQL

下载安装MySQL

Windows 10(64bit)下载安装MySQL社区版的步骤很简单:只需在下载页面下载压缩包即可:

image-20200607170938428

下载到本地后解压,假设解压路径为F:\Tools\mysql-8.0.20-winx64。接下来配置MySQL的配置文件。在解压目录下创建my.ini文件,写入如下信息:

[client]
# 设置mysql客户端默认字符集
default-character-set=utf8
 
[mysqld]
# 设置3306端口
port = 3306
    
# 设置mysql的安装目录
basedir=F:\Tools\mysql-8.0.20-winx64
    
# 允许最大连接数
max_connections=20
    
# 服务端使用的字符集默认为8比特编码的latin1字符集
character-set-server=utf8
    
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB

然后以管理员身份打开命令行工具,切换目录到安装目录。

初始化数据库:

$ .\mysqld --initialize --console

执行完成后,会输出 root 用户的初始默认密码。如果要修改root的密码,需要记下这个默认密码。

输入以下安装命令:

$ .\mysqld install

输入以下命令,启动MySQL服务:

$ net start mysql

下载安装NaviCat

NaviCat是MySQL的一个强大的可视化工具。在NaviCat官网下载

image-20200607172142368

正常下载安装即可。软件免费试用14天。接下来用NaviCat添加专用于Lab4日志功能的用户和数据库。

添加用户

image-20200607175237644

点击用户选项卡,新建用户。按下图填写信息:

image-20200607175610595

其中密码设为123456。填写完毕后保存即可。

添加数据库与表

新建MySQL连接,

image-20200607175735278

按下图配置新连接conn

image-20200607175853641

注意用户使用log4j。完成后点击确定。

打开刚刚新建的连接conn

image-20200607180105887

然后新建数据库lab4,配置如下:

image-20200607180254079

接着在lab4中新建表,

image-20200607180432943

然后按下F6键(或点击 工具 => 命令列界面),进入命令行,输入以下代码:

CREATE TABLE LOGS
   (LEVEL     VARCHAR(10)    NOT NULL,
    DATETIME  DATETIME       NOT NULL,
    METHOD    VARCHAR(50)    NOT NULL,
    LINE      VARCHAR(500)   NOT NULL,
    EXCEPTION VARCHAR(200)   NOT NULL,
    MESSAGE   VARCHAR(1000)  NOT NULL
   );

这样就新建了一个名为log的表。这个表共有6列,从左至右依次代表日志级别、发生时间、方法名、位置(具体到类的行号)、异常信息(如果有抛出异常)、具体日志信息。

至此,MySQL中的准备工作就基本完成了。

准备log4j

设置log4j.properties

先在项目的pom.xml中添加如下这三个包的依赖:

<!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>

<!-- https://mvnrepository.com/artifact/log4j/apache-log4j-extras -->
<dependency>
    <groupId>log4j</groupId>
    <artifactId>apache-log4j-extras</artifactId>
    <version>1.2.17</version>
</dependency>

<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.20</version>
</dependency>

然后在项目src目录下新建log4j.properties,配置log4j

# PART_1
log4j.rootLogger=debug,D,DB
log4j.appender.D=org.apache.log4j.RollingFileAppender
log4j.appender.D.File=AppLog.log
log4j.appender.D.Append=false
log4j.appender.D.Threshold=DEBUG
log4j.appender.D.layout=org.apache.log4j.EnhancedPatternLayout
log4j.appender.D.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss} method:%l%n%m%n%n%n

# PART_2
log4j.appender.DB=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.DB.Threshold=DEBUG
log4j.appender.DB.URL=jdbc:mysql://localhost:3306/LAB4?useSSL=false&serverTimezone=UTC
log4j.appender.DB.driver=com.mysql.cj.jdbc.Driver
log4j.appender.DB.user=lab4log
log4j.appender.DB.password=123456
log4j.appender.DB.layout=org.apache.log4j.EnhancedPatternLayout
log4j.appender.DB.layout.ConversionPattern=INSERT INTO LOGS VALUES('%p','%d{yyyy-MM-dd HH:mm:ss}','%C','%l','%throwable{short}','%m')

注意,与MySQL数据库连接的URL使用的是3306接口、名为lab4的数据库,且用户名为lab4log,密码为123456,这都是在之前设置好的。

再新建一个无MySQL连接的log4j_without_mysql.properties,把设置JDBCAppender的部分去掉即可:

log4j.rootLogger=debug,D,DB
log4j.appender.D=org.apache.log4j.RollingFileAppender
log4j.appender.D.File=AppLog.log
log4j.appender.D.Append=false
log4j.appender.D.Threshold=DEBUG
log4j.appender.D.layout=org.apache.log4j.EnhancedPatternLayout
log4j.appender.D.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss} method:%l%n%m%n%n%n

在App类中添加Logger

在App类中添加Logger成员:

private static final Logger logger = Logger.getLogger(XxxApp.class);

注意这个Loggerorg.apache.log4j.Logger

如果用户需要连接MySQL,就用log4j.properties配置文件,否则使用log4j_without_mysql.properties配置文件。

if (needSQL) {
	PropertyConfigurator.configure("src/log4j.properties");
}
else {
	PropertyConfigurator.configure("src/log4j_without_mysql.properties");
}

// 在JVM关闭时关闭LogManager,以免缓存丢失
Runtime.getRuntime().addShutdownHook(new Thread(LogManager::shutdown));

然后在各命令方法的try块和catch块中用Logger.info()Logger.error()等方法记录操作信息和异常信息即可。

运行与过滤

运行App,进行一些操作(其中包含一些有意的非法操作)。MySQL中存储了操作信息和异常信息:

image-20200607213913427

点击表格上方的「筛选」按钮,输入条件,即可筛选出想要的日志。例如,下面是条件为「操作时间在6月6日16:00到17:00之间的、操作类别为ManageAirport」的操作日志信息。可以看到,仅有四条日志符合条件。

image-20200607214204985

至此,利用log4j自动记录日志并存储值MySQL,并在MySQL中实现日志筛选的功能就完成了。

参考资料

Powered by Jekyll and Theme by solid