Logback DBAppender + Mysql 配置简述

版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/sunknew/article/details/79292567

简述

Logback DBAppender

  • Marker 过滤
  • Mysql 数据库,c3p0 数据源
  • 异步记录

配置文件

配置文件示例

    <!-- 数据库日志记录 -->
    <appender name="DB_APPENDER" class="ch.qos.logback.classic.db.DBAppender">
        <filter class="com.sunknew.logging.filter.LogbackMarkerFilter">
            <marker>DB</marker>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <connectionSource class="ch.qos.logback.core.db.DataSourceConnectionSource">
            <dataSource class="com.mchange.v2.c3p0.ComboPooledDataSource">
                <driverClass>com.mysql.jdbc.Driver</driverClass>
                <jdbcUrl>${DS_URL}</jdbcUrl>
                <user>${DS_USERNAME}</user>
                <password>${DS_PASSWORD}</password>
            </dataSource>
        </connectionSource>
    </appender>

    <!-- 异步日志记录 -->
    <appender name="ASYNC_APPENDER" class="ch.qos.logback.classic.AsyncAppender">
        <appender-ref ref="DB_APPENDER" />
        <includeCallerData>true</includeCallerData>
    </appender>

    <!-- 日志输出级别 -->
    <root level="${LOG_LEVEL}">
        <appender-ref ref="ASYNC_APPENDER" />
    </root>

数据库连接及数据源包

    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.32</version>
    </dependency>
    <dependency>
        <groupId>com.mchange</groupId>
        <artifactId>c3p0</artifactId>
        <version>0.9.5.2</version>
    </dependency>

过滤方法

package angel.stone.web.filter;

import org.slf4j.Marker;
import org.slf4j.MarkerFactory;

import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.filter.AbstractMatcherFilter;
import ch.qos.logback.core.spi.FilterReply;

public class LogbackMarkerFilter extends AbstractMatcherFilter<ILoggingEvent> {

    private Marker markerToMatch = null;

    @Override
    public void start() {
        if (null != this.markerToMatch) {
            super.start();
        } else {
            addError(" no marker yet !");
        }
    }

    @Override
    public FilterReply decide(ILoggingEvent event) {
        Marker marker = event.getMarker();
        if (!isStarted()) {
            return FilterReply.NEUTRAL;
        }
        if (null == marker) {
            return onMismatch;
        }
        if (markerToMatch.contains(marker)) {
            return onMatch;
        }
        return onMismatch;
    }

    public void setMarker(String markerStr) {
        if(null != markerStr) {
            markerToMatch = MarkerFactory.getMarker(markerStr);
        }
    }

记录日志

MDC.put("prop01", "prop value 01.");
logger.info(MarkerFactory.getMarker("DB"), "log msg.");

建表语句

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;

保存至自定义表

未尝试,可参考:
1.Store log data into user defined table using Logback db appender
2.Interface DBNameResolver

参考

1.Logback Manual Chapter 4: Appenders
2.Logback Manual Chapter 7: Filters
3.logback-examples
4.SQL script creates the required tables by ch.qos.logback.classic.db.DBAppender
5.Markers in Logback
6.Best practices for using Markers in SLF4J/Logback
7.Slf4j MDC 使用和 基于 Logback 的实现分析

猜你喜欢

转载自blog.csdn.net/sunknew/article/details/79292567