精华内容
下载资源
问答
  • 主要介绍了SpringBoot Logback日志记录到数据库的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • 先看一下日志记录到数据库中的效果图:引入logback依赖包:dependencies{compile group: 'ch.qos.logback', name: 'logback-core', version: '1.2.1'compile group: 'ch.qos.logback', name: 'logback-classic', ...

    先看一下日志被记录到数据库中的效果图:

    logback-database-20170309.png

    引入logback依赖包:

    dependencies{

    compile group: 'ch.qos.logback', name: 'logback-core', version: '1.2.1'

    compile group: 'ch.qos.logback', name: 'logback-classic', version: '1.2.1'

    compile group: 'mysql', name: 'mysql-connector-java', version: '6.0.5'

    }

    注:

    1.如果其他依赖包中包含这两个logback依赖包,可省略上面两个;

    2.MySQL的JDBC的驱动包为连接数据库所用。以下以MySQL为例,其他数据库类似。

    配置logback.xml文件:

    com.mysql.jdbc.Driver

    jdbc:mysql://*.*.*.*:3306/databases

    user

    passworld

    注:

    1. *.*.*.*:3306/databases为数据库地址;

    2.user、password为此数据库的登录名和密码。

    在数据库中添加logback日志数据表

    # Logback: the reliable, generic, fast and flexible logging framework.

    # Copyright (C) 1999-2010, QOS.ch. All rights reserved.

    #

    # See http://logback.qos.ch/license.html for the applicable licensing

    # conditions.

    # This SQL script creates the required tables by ch.qos.logback.classic.db.DBAppender.

    #

    # It is intended for MySQL databases. It has been tested on MySQL 5.1.37

    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;

    注:不同数据库的建表sql脚本在logback-classic/src/main/java/ch/qos/logback/classic/db/script文件夹下找到(就是上面引入的logback-classic包里面)。其中包括:db2.sql、h2.sql、hsqldb.sql、mssql.sql、oracle.sql、postgresql.sql、sqlite.sql、sybaseSqlAnyWhere.sql等sql脚本文件。

    加载logback.xml文件

    不同的框架集成logback的方式不一样,此处以Spring Boot为例:

    在application.properties文件中加入下面这句话,并把logback.xml文件放在src/main/resources文件夹下,启动Spring Boot程序即可!

    logging.config=classpath:logback.xml

    展开全文
  • 对于日志的处理,有时候需要把符合条件的日志计入数据库中一、添加pom依赖org.springframework.bootspring-boot-starter-webcommons-dbcpcommons-dbcp1.4mysqlmysql-connector-javaruntime二、创建logback配置文件%d...

    对于日志的处理,有时候需要把符合条件的日志计入数据库中

    一、添加pom依赖

    org.springframework.boot

    spring-boot-starter-web

    commons-dbcp

    commons-dbcp

    1.4

    mysql

    mysql-connector-java

    runtime

    二、创建logback配置文件

    %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n

    ${LOG_HOME}/info/info.log.%d{yyyy-MM-dd}.log

    30

    %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n

    500MB

    ${LOG_HOME}/error/error.log.%d{yyyy-MM-dd}.log

    30

    %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n

    500MB

    error

    ACCEPT

    DENY

    com.mysql.cj.jdbc.Driver

    jdbc:mysql://127.0.0.1:3306/logdb?serverTimezone=Asia/Shanghai

    root

    123456

    三、创建数据库表

    在ch.qos.logback.classic.db包下可以找到对应数据库的表创建语句

    我用的mysql数据库,前提是要首先自己创建库

    mysql的数据库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;

    创建好的表

    四、测试

    1、编写测试代码

    @RunWith(SpringRunner.class)

    @SpringBootTest

    public class Springboot02MybatisApplicationTests {

    private final Logger logger = LoggerFactory.getLogger(Springboot02MybatisApplicationTests.class);

    @Test

    public void contextLoads() {

    logger.info("数据库日志info");

    logger.error("数据库日志error");

    }

    }

    2、运行结果

    默认存储所有符合当前级别的日志记录

    五、自定义数据库表字段和存储内容

    当然,默认的表字段那么多,存储了很多内容,但是我们很多时候只是自己打印的日志内容,为了节省磁盘空间,这个时候可以自定义存储字段和存储内容

    步骤:

    1、创建数据库表

    DROP TABLE IF EXISTS `logging`;

    CREATE TABLE `logging` (

    `id` BIGINT(20) NOT NULL AUTO_INCREMENT,

    `message` VARCHAR(300) NOT NULL COMMENT '内容',

    `level_string` VARCHAR(254) NOT NULL COMMENT '级别',

    `created_time` DATETIME NOT NULL COMMENT '时间',

    `logger_name` VARCHAR(300) NOT NULL COMMENT '全类名',

    PRIMARY KEY (`id`)

    ) ENGINE=INNODB DEFAULT CHARSET=utf8 COMMENT='自定义日志记录表'

    2、重写DBAppender类为LogDBAppender类

    package com.me.study.springboot02mybatis.config;

    import ch.qos.logback.classic.spi.CallerData;

    import ch.qos.logback.classic.spi.ILoggingEvent;

    import ch.qos.logback.core.db.DBAppenderBase;

    import org.springframework.context.annotation.Configuration;

    import java.lang.reflect.Method;

    import java.sql.Connection;

    import java.sql.PreparedStatement;

    import java.sql.SQLException;

    import java.sql.Timestamp;

    @Configuration

    public class LogDBAppender extends DBAppenderBase {

    protected static final Method GET_GENERATED_KEYS_METHOD;

    //插入sql

    protected String insertSQL;

    // message 日志内容

    static final int MESSAGE = 1;

    // level_string

    static final int LEVEL_STRING = 2;

    // created_time 时间

    static final int CREATE_TIME = 3;

    // logger_name 全类名

    static final int LOGGER_NAME = 4;

    static final StackTraceElement EMPTY_CALLER_DATA = CallerData.naInstance();

    static {

    // PreparedStatement.getGeneratedKeys() method was added in JDK 1.4

    Method getGeneratedKeysMethod;

    try {

    // the

    getGeneratedKeysMethod = PreparedStatement.class.getMethod("getGeneratedKeys", (Class[]) null);

    } catch (Exception ex) {

    getGeneratedKeysMethod = null;

    }

    GET_GENERATED_KEYS_METHOD = getGeneratedKeysMethod;

    }

    @Override

    public void start() {

    // 将写好的sql语句赋值给insertSQL

    insertSQL = buildInsertSQL();

    super.start();

    }

    // 自己写新增sql语句

    private static String buildInsertSQL() {

    return "INSERT INTO `logging`(`message`,`level_string`,`created_time`,`logger_name`)" +

    "VALUES (?,?,?,?)";

    }

    @Override

    protected Method getGeneratedKeysMethod() {

    return GET_GENERATED_KEYS_METHOD;

    }

    @Override

    protected String getInsertSQL() {

    return insertSQL;

    }

    /**

    * 主要修改的方法

    *

    * @param stmt

    * @param event

    * @throws SQLException

    */

    private void bindLoggingEventWithInsertStatement(PreparedStatement stmt, ILoggingEvent event) throws SQLException {

    // event.getFormattedMessage() 日志打印内容

    String message = event.getFormattedMessage();

    // 如果只想存储自己打印的日志,可以这样写日志:logger.info("- XXXX")

    if(message.startsWith("-")){ // 判断日志消息首字母为 - 的日志,记录到数据库表

    stmt.setString(MESSAGE, message);

    // event.getLevel().toString() 日志级别

    stmt.setString(LEVEL_STRING, event.getLevel().toString());

    // new Timestamp(event.getTimeStamp()) 时间

    stmt.setTimestamp(CREATE_TIME, new Timestamp(event.getTimeStamp()));

    // event.getLoggerName() 全类名

    stmt.setString(LOGGER_NAME, event.getLoggerName());

    }

    }

    @Override

    protected void subAppend(ILoggingEvent eventObject, Connection connection, PreparedStatement statement) throws Throwable {

    bindLoggingEventWithInsertStatement(statement, eventObject);

    // This is expensive... should we do it every time?

    int updateCount = statement.executeUpdate();

    if (updateCount != 1) {

    addWarn("Failed to insert loggingEvent");

    }

    }

    @Override

    protected void secondarySubAppend(ILoggingEvent eventObject, Connection connection, long eventId) throws Throwable {

    }

    }

    3、修改logback日志文件,引用自定义的LogDBAppender类

    com.mysql.cj.jdbc.Driver

    jdbc:mysql://127.0.0.1:3306/logdb?serverTimezone=Asia/Shanghai

    root

    admin

    4、测试运行

    1)编写测试代码

    @Test

    public void contextLoads() {

    logger.info("- 数据库日志info");

    logger.error("- 数据库日志error");

    logger.info("一条不带‘-’的日志,看会不会记录如数据库");

    }

    2)运行结果

    数据库存储结果只存储了自定义的日志记录

    展开全文
  • 也用 Log4Net 之将日志记录到数据库的后台实现 (二)    大家下午好,昨天讲了配置,今天我们讲讲后台实现,在完成了后台实现后,我们才能真正意义上的解决把自定义属性字段值录入到数据库中。    在开写...

    也用 Log4Net 之将日志记录到数据库的后台实现 (二)

     

      大家下午好,昨天讲了配置,今天我们讲讲后台实现,在完成了后台实现后,我们才能真正意义上的解决把自定义属性字段值录入到数据库中。

     

      在开写之前我先着重强调一下,“日志”的概念非常广泛,有错误日志、操作日志、访问日志、事件日志等等。我们并不提倡把所有的日志都记录到数据库,因为这样做没有必要。同时如果日志数据表与业务表同在一个数据库的话,频繁的记录日志的操作会影响性能(Log4Net提供了缓存机制,可以在缓存日志数据达到设定值,比如200条时,Log4Net会批量将数据录入到数据库中。即便是这么好的机制,我还是建议大家一定要分清情况,一般错误日志和事件日志我们采用文件形式记录,相应的操作日志我们可以采用数据库记录)。

     

      “通用日志记录系统” 的重点是通用。能适应各种要求,比如要提供丰富的日志记录形式(如:文件、数据库等等),以及适应不同的业务需求,比如A业务希望记录A1,A2,A3字段,B业务希望记录B1,B2,B3字段。同时还要做到灵活性,能适应业务变更。Log4Net正是这样的一种开源框架,说了这么多,我想表述的是:数据库记录日志的方式并不是唯一的和最好的,大家一定在酌情而定。

     

      好了,言归正传,我们现在开始讲后台的处理代码:

     

      (1)、日志对象,就是在存放日志的载体:

    public class LogMessage  
    {
        public int UserID { get; set; }
    }

      

      在项目中 LogMessage 充当日志对象,大家一定很奇怪,为什么我的只有一个属性UserID。原因是我在测试自定义属性能不能记录到日志数据库中,所以弄太多的属性也没必要。

     

      Log4Net在将日志记录到数据库时会提供一些缺省的属性,他们分别是:

    [Id] [int] IDENTITY (1, 1) NOT NULL,       
    [Date] [datetime]  NULL,        --异常记录时间
    [Thread] [varchar] (255)  NULL, --线程ID(数字)
    [Level] [varchar] (50)  NULL,   --日志级别(FALAT,ERROR,WARN,INFO,DEBUG)
    [Logger] [varchar] (255)  NULL,  --记录的类
    [Message] [varchar] (4000) NULL,   --消息

     

      这些缺省值我们最好在每个日志表里都加上,我测试的时候自行把 Message给删除了,结果怎么也记录不进去日志。所以我建议大家把这几个都带了。字段名字你可以自己改,比如,我就把Date改成了RecordTime,但是在配置文件中,RecordTime字段对应的值依然是@log_date,忘记了的同学回上一篇中去看配置去。

      

     

      (2)、CustomLayout 类

      CustomLayout 类继承至 log4net.Layout.PatternLayout

     

      关于Layout大家应该不陌生,“Layout 组件用于向用户显示最后经过格式化的输出信息。输出信息可以以多种格式显示,主要依赖于我们采用的Layout组件类型。可以是线性的或一个XML文件。Layout组件和一个Appender组件一起工作。API帮助手册中有关于不同Layout组件的列表。一个Appender对象,只能对应一个Layout对象。要实现你自己的Layout类,你需要从log4net.Layout.LayoutSkeleton类继承,它实现了ILayout接口。”

     

      因为我们要使用自定义属性UserID,所以我们要实现自己的Layout类,我们来看代码:

    复制代码
    public class CustomLayout : log4net.Layout.PatternLayout
    {
       public CustomLayout()
       {
            this.AddConverter("UserID", typeof(UserIDPatternConverter));
       }
    }
    复制代码

      typeof(UserIDPatternConverter)语句中的UserIDPatternConverter实现了格式化的输出信息。

    复制代码
    internal sealed class UserIDPatternConverter : PatternLayoutConverter 
    {
        override protected void Convert(TextWriter writer, LoggingEvent loggingEvent)
        {
            LogMessage logMessage = loggingEvent.MessageObject as LogMessage;
               
            if (logMessage != null)
                 writer.Write(logMessage.UserID);
        }
    }
    复制代码

     

      (3)、对Log4Net的简单封装

     

    复制代码
       public class LogHelper
        {
            public LogHelper()
            {
    
            }
    
            public static string LoggerName = string.Empty;
    
            private static LogMessage message = null;
    
            private static ILog _log;
    
            public static ILog log
            {
                get
                {
                    string path = @"C:\Log4Net.config";
                    log4net.Config.XmlConfigurator.Configure(new FileInfo(path));
    
                    if (_log == null)
                    {
                        //从配置文件中读取Logger对象  
                        //WebLogger 里面的配置信息是用来将日志录入到数据库的
                        //做为扩展 做判断来确定日志的记录形式,数据库也好,txt文档也好,控制台程序也好。
                        _log = log4net.LogManager.GetLogger(LoggerName); //log4net.LogManager.GetLogger("WebLogger");
                    }
                    else
                    {
                        if (_log.Logger.Name != LoggerName)
                        {
                            _log = log4net.LogManager.GetLogger(LoggerName);
                        }
                    }
    
                    return _log;
                }
            }
    
    
            /// <summary>
            /// 调试
            /// </summary>
            public static void debug()
            {
                if (log.IsDebugEnabled)
                {
                    log.Debug(message);
                }
            }
    
    
            /// <summary>
            /// 错误
            /// </summary>
            public static void error()
            {
                if (log.IsErrorEnabled)
                {
                    log.Error(message);
                }
            }
    
            /// <summary>
            /// 严重错误
            /// </summary>
            public static void fatal()
            {
                if (log.IsFatalEnabled)
                {
                    log.Fatal(message);
                }
            }
    
            /// <summary>
            /// 记录一般日志
            /// </summary>
            public static void info( )
            {
                if (log.IsInfoEnabled)
                {
                    //log.Info("Jerry");
                    log.Info(message);
                }
            }
    
    
            /// <summary>
            /// 记录警告
            /// </summary>
            public static void warn()
            {
                if (log.IsWarnEnabled)
                {
                    log.Warn(message);
                }
            }
    
    
            /// <summary>  
            /// 需要写日志的地方调用此方法  
            /// </summary>  
            /// <param name="level">自定义级别</param>  
            public static void SaveMessage(LogMessage logMessage,int level)
            {
                message = logMessage;
    
                switch (level)
                {
                    case 1:
                        info();
                        break;
                    
                    case 2: 
                        warn(); 
                        break;
                    
                    case 3:  
                        error();
                        break;
                    
                    case 4: 
                        fatal();
                        break;
    
                    default: break;
                }
            }
    
        }
    复制代码

     

      Log4Net根据不同的日志级别提供了不同的记录方法,对了,这里所说的日志级别就是对应的 Level 字段,我们来看一下 Log4Net的日志级别:

      这是我从别的网站上找到的图,用来说明一下级别。好了,到此为此,我们就已经把 Log4Net 底层这好了,注意,你可以把上页的这些类都统一写到一个类库中。这样做的好处是,当其它项目要用到日志记录功能的时候,直接引用你类库的 dll 就可以了,是不是很方便。同时这样做也实现了对Log4Net的简单封装,让其它项目组的人更易使用。

     

      重点强调一下,记得在这个类库中引用Log4Net.dll。毕竟我们是要用Log4Net来实现日志记录的,别写了半天都没引用,那就要出问题了。

     

      (4)、好了,让我们在Web展示层中调用他吧! Default.aspx

    复制代码
    protected void Page_Load(object sender, EventArgs e)
    {
        LogHelper.LoggerName = "WebLogger";
        LogMessage logMessage = new LogMessage();
    
        logMessage.UserID = 123456;
        LogHelper.SaveMessage(logMessage,1);
    }
    复制代码


      因为我们在配置文件中设定了缓存数,<bufferSize value="10"/> 所以你刷新十下,这时候数据就进入到数据库了。不过聪明的做法是,将bufferSize 的value值改为1

     

      (5)、数据库中的信息

     

      (6)、对不起,刚才自己看的时候发现没有建表的Sql语句,现在补上。

    复制代码
    USE [LogSys]
    GO
    
    /****** Object:  Table [dbo].[Log]    Script Date: 08/29/2012 14:56:11 ******/
    SET ANSI_NULLS ON
    GO
    
    SET QUOTED_IDENTIFIER ON
    GO
    
    SET ANSI_PADDING ON
    GO
    
    CREATE TABLE [dbo].[Log](
        [Id] [int] IDENTITY(1,1) NOT NULL,
        [LevelName] [varchar](50) NULL,
        [UserID] [int] NULL,
        [Message] [varchar](4000) NULL,
        [Exception] [varchar](2000) NULL,
        [RecordTime] [varchar](50) NULL,
     CONSTRAINT [PK_Log_1] PRIMARY KEY CLUSTERED 
    (
        [Id] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    
    GO
    
    SET ANSI_PADDING OFF
    GO
    复制代码

     

      好了,就写到这里,我是百灵,祝大家天天好心情,身体健康。

    展开全文
  • System.out.println("将日志记录到数据库" ); } } 6.接下来就可以在需要监控的方法上添加 aop的自定义注解 格式为 @+自定义注解的类名  @Controller @RequestMapping( "/test" ) public class ...

    1. pom添加依赖包

    <!--添加aop依赖-->
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
    </dependency>

    2.配置文件application.yml添加
    spring:
        aop:
        auto: true

    3 创建实体类

    package com.spring4all.entity;
    
    import java.io.Serializable;
    import java.util.Date;
    
    /**
     * @author shafei
     * @version 1.0
     * @date 10:28 2019/9/7
     * @fun
     */
    public class SysLogDO implements Serializable {
        private Long id;
    
        private String username; //用户名
    
        private String operation; //操作
    
        private String method; //方法名
    
        private String params; //参数
    
        private String ip; //ip地址
    
        private Date createDate; //操作时间
    
        public Long getId() {
            return id;
        }
    
        public void setId(Long id) {
            this.id = id;
        }
    
        public String getUsername() {
            return username;
        }
    
        public void setUsername(String username) {
            this.username = username;
        }
    
        public String getOperation() {
            return operation;
        }
    
        public void setOperation(String operation) {
            this.operation = operation;
        }
    
        public String getMethod() {
            return method;
        }
    
        public void setMethod(String method) {
            this.method = method;
        }
    
        public String getParams() {
            return params;
        }
    
        public void setParams(String params) {
            this.params = params;
        }
    
        public String getIp() {
            return ip;
        }
    
        public void setIp(String ip) {
            this.ip = ip;
        }
    
        public Date getCreateDate() {
            return createDate;
        }
    
        public void setCreateDate(Date createDate) {
            this.createDate = createDate;
        }
    }

     4.使用spring 的 aop 技术切到自定义注解上,所以先创建一个自定义注解类

    package com.spring4all.config.intercepors;
    
    import java.lang.annotation.*;
    /**
     * @author shafei
     * @version 1.0
     * @date 10:06 2019/9/7
     */
    @Target(ElementType.METHOD) //注解放置的目标位置,METHOD是可注解在方法级别上
    @Retention(RetentionPolicy.RUNTIME) //注解在哪个阶段执行
    @Documented //生成文档
    public @interface MyLog {
        String value() default "";
    }

    5.AOP实现:

    package com.spring4all.config;
    
    import com.alibaba.fastjson.JSON;
    import com.spring4all.config.intercepors.MyLog;
    import com.spring4all.entity.SysLogDO;
    import com.spring4all.service.SysLogService;
    import org.aspectj.lang.JoinPoint;
    import org.aspectj.lang.annotation.AfterReturning;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Pointcut;
    import org.aspectj.lang.reflect.MethodSignature;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Component;
    
    import javax.servlet.http.HttpServletRequest;
    import java.lang.reflect.Method;
    import java.util.Date;
    /**
     * @author shafei
     * @version 1.0
     * @date 10:08 2019/9/7
     * fun: 
     */
    @Aspect
    @Component
    public class SysLogAspect {
    
        @Autowired
        private SysLogService sysLogService;
    
        //定义切点 @Pointcut
        //在注解的位置切入代码
        @Pointcut("@annotation( com.spring4all.config.intercepors.MyLog)")
        public void logPoinCut() {
        }
    
        //切面 配置通知
        @AfterReturning("logPoinCut()")
        public void saveSysLog(JoinPoint joinPoint) {
            System.out.println("切面。。。。。");
            //保存日志
            SysLogDO sysLog = new SysLogDO();
    
            //从切面织入点处通过反射机制获取织入点处的方法
            MethodSignature signature = (MethodSignature) joinPoint.getSignature();
            //获取切入点所在的方法
            Method method = signature.getMethod();
    
            //获取操作
            MyLog myLog = method.getAnnotation(MyLog.class);
            if (myLog != null) {
                String value = myLog.value();
                sysLog.setOperation(value);//保存获取的操作
            }
    
            //获取请求的类名
            String className = joinPoint.getTarget().getClass().getName();
            //获取请求的方法名
            String methodName = method.getName();
            sysLog.setMethod(className + "." + methodName);
    
            //请求的参数
            Object[] args = joinPoint.getArgs();
            //将参数所在的数组转换成json
            String params = JSON.toJSONString(args);
            sysLog.setParams(params);
    
            sysLog.setCreateDate(new Date());
            //获取用户名
            sysLog.setUsername("shafei");
            //获取用户ip地址
    //        HttpServletRequest request = HttpContextUtils.getHttpServletRequest();
            sysLog.setIp("192.168.3.11");
    
            //调用service保存SysLog实体类到数据库
    //        sysLogService.save(sysLog);
            System.out.println("将日志记录到数据库");
        }
    }

    6.接下来就可以在需要监控的方法上添加 aop的自定义注解

    格式为 @+自定义注解的类名 

    @Controller
    @RequestMapping("/test")
    public class UserController {
     
        @MyLog(value = "测试一下")
        @GetMapping("/test")
        @ResponseBody
        public String test(){
            return "test";
        }
    
    }

     

    说明:

    记录日志的服务层接口SysLogService需要另外写,这个应该都会写;

     

     

    参考https://www.jianshu.com/p/d0bbdf1974bd

    转载于:https://www.cnblogs.com/chafe/p/11479511.html

    展开全文
  • Yii2默认日志记录到文件中,通过配置log组件来重新将日志保存到数据库中 打开config目录下console.php文件,修改log配置 'log' => [ 'targets' => [ [ 'class' => 'yii\log\DbTa...
  • 也用 Log4Net 之将日志记录到数据库的配置 (一)    前段时间我一直想做一个通用一点的日志记录系统,可以便于不同的业务组调用进行日志记录及分析。本来打算着自己下手写一个,后面发现各业务组可能会需要...
  • Yii2默认日志记录到文件中,通过配置log组件来重新将日志保存到数据库中打开config目录下console.php文件,修改log配置'log' => ['targets' => [['class' => 'yii\log\DbTarget','levels' => ['error', ...
  • 对于日志的处理,有时候需要把符合条件的日志计入数据库中一、添加pom依赖org.springframework.bootspring-boot-starter-webcommons-dbcpcommons-dbcp1.4mysqlmysql-connector-javaruntime二、创建logback配置文件%d...
  • 很早以前弄过将log4j的日志存储到数据库,不过是配置在properties文件,包括数据库配置也是写死的。现在正好有个需求要把日志存储到数据库中,还要进行过滤,只有本项目的才会进行保存,像Spring,mybatis,...
  • 对于日志的处理,有时候需要把符合条件的日志计入数据库中一、添加pom依赖org.springframework.bootspring-boot-starter-webcommons-dbcpcommons-dbcp1.4mysqlmysql-connector-javaruntime二、创建logback配置文件%d...
  • log4j API提供 org.apache.log4j.jdbc.JDBCAppender 对象,它能够将日志信息在指定的数据库。 JDBCAppender 配置: Property描述 bufferSize 设置缓冲区的大小。默认大小为1 driver 设置驱动程序类为...
  • 为了解决这个问题,就想到:当系统出现异常时,将异常信息记录到数据库中,然后以短信或邮件的形式通知管理员登录到管理系统后台页面进行查看具体异常信息,从而快速定位和判断出现异常的位置和原因,直到修复。...
  • 大家下午好,昨天讲了配置,今天我们讲讲后台...我们并不提倡把所有的日志记录到数据库,因为这样做没有必要。同时如果日志数据表与业务表同在一个数据库的话,频繁的记录日志的操作会影响性能(Log4Net提供了缓存...
  • 为了能快速定位非开发环境系统异常,解决bug,有必要对系统日志做记录分析,将日志信息记录到DB,如下开发步骤: 1、logger表创建,需手动创建并且授权用户或者角色 a).postgresql数据库 -- Logback: the ...
  • log4j API提供了 org.apache.log4j.jdbc.JDBCAppender 对象,该对象可以将日志记录信息放入指定的数据库中。 JDBCAppender配置 属性 描述 bufferSize 设置缓冲区的大小。默认大小为1 driver 设置驱动程序...
  • log.info("---------------接口日志记录---------------"); //用于保存日志 AdminLog adminLog = new AdminLog(); //从切面织入点处通过反射机制获取织入点处的方法 MethodSignature signature = (Method...
  • 将log4net日志记录到数据库中log4net是一个优秀的开源日志项目,现将本人使用写成一个demo,如下 0:准备 去http://logging.apache.org/,可下载log4net,最新为1.2版本, 建立一个asp.net web 项目,并将log4net.dll...
  • 安装rsyslog-mysqlyum install rsyslog-mysql这个包里面主要有两个文件一个是usr\lib\rsyslog\ommysql.so这是rsyslog的Mysql插件在/etc/rsyslog.conf中加入$ModLoad ommysql...4.4.2\createDB.sql这是创建数据库结构的s
  • 表示对于PrintUtil类的INFO级别的日志采取数据库记录方式,我采取使用的是c3p0的数据库连接池。 如果不采用连接池的方式: 向MySQL数据库发送500条记录事件耗时5秒,即每个请求10毫秒。 如果采用连接池的...
  • 现在正好有个需求要把日志存储到数据库中,还要进行过滤,只有本项目的才会进行保存,像Spring,mybatis,zookeeper这类的日志不需要进行保存,而且现在配置是动态的,根据不同的环境,有不同的数据库,而使用...
  • 转贴:将log4net日志记录到数据库

    千次阅读 2010-04-02 17:35:00
    log4net是一个优秀的开源日志项目,现将本人使用写成一个demo,如下 0:准备 去http://logging.apache.org/,可下载log4net,最新为1.2版本, 建立一个asp.net web 项目,并将log4net.dll添加引用 1:建立数据表 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,733
精华内容 3,093
关键字:

日志记录到数据库