问题:logback的DBAppender只能写入4个参数,而且参数名字固定,保存数据的表名固定,因此解决以上问题,需要重写DBAppender;
而且还自己从数据库定义各种类型的日志级别
方案:除logback的三张表外,其它再增加2张表,分别为分类表和需要定义的package或class,logback的表名可以进行修改
1、修改表名和列名:logback的表名可以修改成你需要的表名,只需要在AppDBNameResolver里面修改getTableName方法的返回值;
列名也是一样的,只需要修改getColumnName的返回值;
如下:
public
class
MyDBNameResolver
implements
DBNameResolver {
private
String
tableNamePrefix
=
"s_"
;
private
String
tableNameSuffix
=
""
;
private
String
columnNamePrefix
=
""
;
private
String
columnNameSuffix
=
""
;
//修改表名
public
<N
extends
Enum<?>> String getTableName(N
tableName
) {
System.
out
.println(
" getTableName "
+
tableName
);
return
tableNamePrefix
+
tableName
.name().toLowerCase() +
tableNameSuffix
;
}
//修改列名
public
<N
extends
Enum<?>> String getColumnName(N
columnName
) {
System.
out
.println(
" getColumnName "
+
columnName
+
" "
+
columnName
.name().toLowerCase() );
if
(
"arg0"
.equals(
columnName
.name().toLowerCase())){
return
"log_type"
;
}
else
return
columnNamePrefix
+
columnName
.name().toLowerCase() +
columnNameSuffix
;
}
}
logback.xml中增加如下:
<
dbNameResolver
class
=
"com.javacodegeeks.examples.logbackmdcexample.MyDBNameResolver"
/>增加到
<
appender>中
2、增加参数
需要重写DBAppender,主要在以下地方:
static
final
int
TIMESTMP_INDEX
= 1;
static
final
int
FORMATTED_MESSAGE_INDEX
= 2;
static
final
int
LOGGER_NAME_INDEX
= 3;
static
final
int
LEVEL_STRING_INDEX
= 4;
static
final
int
THREAD_NAME_INDEX
= 5;
static
final
int
REFERENCE_FLAG_INDEX
= 6;
static
final
int
ARG0_INDEX
= 7;
static
final
int
ARG1_INDEX
= 8;
static
final
int
ARG2_INDEX
= 9;
static
final
int
ARG3_INDEX
= 10;
static
final
int
ARG4_INDEX
= 11;//增加的一个参数
bindLoggingEventArgumentsWithPreparedStatement方法中修改:对应的数字4改成你增加到的数字
void
bindLoggingEventArgumentsWithPreparedStatement (PreparedStatement
stmt
,
Object[]
argArray
)
throws
SQLException {
int
arrayLen
=
argArray
!=
null
?
argArray
.
length
: 0;
for
(
int
i
= 0;
i
<
arrayLen
&&
i
< 5;
i
++) {
stmt
.setString(
ARG0_INDEX
+
i
, asStringTruncatedTo254(
argArray
[
i
]));
}
if
(
arrayLen
< 5) {
for
(
int
i
=
arrayLen
;
i
< 5;
i
++) {
stmt
.setString(
ARG0_INDEX
+
i
,
null
);
}
}
}
如果还增加了其它字段到数据库且,可以修改
bindCallerDataWithPreparedStatement
方法
void
bindCallerDataWithPreparedStatement(PreparedStatement
stmt
,
StackTraceElement[]
callerDataArray
)</