Logback自带数据库输出类型。
需要在Logback的配置文件(默认logback-spring.xml)中额外配置如下的appender:
<appender name="dbLogTask" class="ch.qos.logback.classic.db.DBAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>Warn</level>
</filter>
<connectionSource class="ch.qos.logback.core.db.DriverManagerConnectionSource">
<driverClass>com.mysql.jdbc.Driver</driverClass>
<url>jdbc:mysql://127.0.0.1:3306/logback?useSSL=true&characterEncoding=utf-8&useUnicode=true</url>
<user>root</user>
<password>root</password>
</connectionSource>
</appender>
注意filter的目的是过滤掉INFO以及以下级别的Log信息。
<url>标签中的&符号需要用转义符来替代:&
配置Logback的数据库输出,需要默认在数据库里生成三张记录表,可以导入如下SQL语句进行配置:
BEGIN;
DROP TABLE IF EXISTS logging_event_property;
DROP TABLE IF EXISTS logging_event_exception;
DROP TABLE IF EXISTS logging_event;
COMMIT;
BEGIN;
CREATE TABLE logging_event
(
timestmp BIGINT NOT NULL,
formatted_message TEXT NOT NULL,
logger_name VARCHAR(254) NOT NULL,
level_string VARCHAR(254) NOT NULL,
thread_name VARCHAR(254),
reference_flag SMALLINT,
arg0 VARCHAR(254),
arg1 VARCHAR(254),
arg2 VARCHAR(254),
arg3 VARCHAR(254),
caller_filename VARCHAR(254) NOT NULL,
caller_class VARCHAR(254) NOT NULL,
caller_method VARCHAR(254) NOT NULL,
caller_line CHAR(4) NOT NULL,
event_id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY
);
COMMIT;
BEGIN;
CREATE TABLE logging_event_property
(
event_id BIGINT NOT NULL,
mapped_key VARCHAR(254) NOT NULL,
mapped_value TEXT,
PRIMARY KEY(event_id, mapped_key),
FOREIGN KEY (event_id) REFERENCES logging_event(event_id)
);
COMMIT;
BEGIN;
CREATE TABLE logging_event_exception
(
event_id BIGINT NOT NULL,
i SMALLINT NOT NULL,
trace_line VARCHAR(254) NOT NULL,
PRIMARY KEY(event_id, i),
FOREIGN KEY (event_id) REFERENCES logging_event(event_id)
);
COMMIT;
使用JPA配置数据库表反向生成,需要编写如下5个Entity类。注意类名随意,但是TABLE表名不能修改:
package com.ldap.entity;
import lombok.Getter;
import lombok.Setter;
import javax.persistence.*;
import java.io.Serializable;
@Getter
@Setter
@Entity
@Table(name = "logging_event")
public class loggingEvent implements Serializable{
@Column(nullable = false)
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Id
private long event_id;
@Column
private long timestmp;
@Lob
@Column(columnDefinition="TEXT",nullable = false)
private String formatted_message;
@Column(length = 254,nullable = false)
private String logger_name;
@Column(length = 254,nullable = false)
private String level_string;
@Column(length = 254)
private String thread_name;
@Column(columnDefinition="SMALLINT")
private int reference_flag;
@Column(length = 254)
private String arg0;
@Column(length = 254)
private String arg1;
@Column(length = 254)
private String arg2;
@Column(length = 254)
private String arg3;
@Column(length = 254)
private String arg4;
@Column(length = 254)
private String arg5;
@Column(length = 254,nullable = false)
private String caller_filename;
@Column(length = 254,nullable = false)
private String caller_class;
@Column(length = 254,nullable = false)
private String caller_method;
@Column(columnDefinition="CHAR(4)",nullable = false)
private char caller_line;
}
package com.ldap.entity;
import lombok.Getter;
import lombok.Setter;
import javax.persistence.*;
@Getter
@Setter
@Entity
@Table(name = "logging_event_exception")
public class loggingEventException {
@EmbeddedId
private loggingEventExceptionIdentity loggingEventExceptionIdentity;
@Column(nullable = false,length = 254)
private String trace_line;
}
package com.ldap.entity;
import lombok.*;
import javax.persistence.*;
import java.io.Serializable;
@Setter
@Getter
@ToString
@EqualsAndHashCode
@Embeddable
@NoArgsConstructor
@AllArgsConstructor
public class loggingEventExceptionIdentity implements Serializable{
@ManyToOne(fetch=FetchType.EAGER)
@JoinColumn(name="event_id",nullable = false,foreignKey = @ForeignKey(name="FOREIGN_EXCEPTION_EVENT",value = ConstraintMode.CONSTRAINT))
private loggingEvent loggingEvent;
@Column(columnDefinition="SMALLINT",nullable = false)
private int i;
}
package com.ldap.entity;
import lombok.Getter;
import lombok.Setter;
import javax.persistence.*;
@Getter
@Setter
@Entity
@Table(name = "logging_event_property")
public class loggingEventProperty {
@EmbeddedId
private loggingEventPropertyIdentity loggingEventPropertyIdentity;
@Lob
@Column(columnDefinition="TEXT")
private String mapped_value;
}
package com.ldap.entity;
import lombok.*;
import javax.persistence.*;
import java.io.Serializable;
@Setter
@Getter
@ToString
@EqualsAndHashCode
@Embeddable
@NoArgsConstructor
@AllArgsConstructor
public class loggingEventPropertyIdentity implements Serializable{
@ManyToOne(fetch= FetchType.EAGER)
@JoinColumn(name="event_id",nullable = false,foreignKey = @ForeignKey(name="FOREIGN_PROPERTY_EVENT",value = ConstraintMode.CONSTRAINT))
private loggingEvent loggingEvent;
@Column(length = 254,nullable = false)
private String mapped_key;
}