记一个完成的log4jdbc.log4j2 的完整配置

该文章描述了如何配置log4jdbc与logback.xml来实现数据库的日志记录和监控,包括SLF4J的设置、日志输出路径、不同级别日志的分离以及SQL日志的详细程度。同时,文章还展示了如何使用注解进行方法级别的日志记录。
摘要由CSDN通过智能技术生成

适用于1.8版本

数据库配置

 log4jdbc.log4j2.properties 配置文件

# If you use SLF4J. First, you need to tell log4jdbc-log4j2 that you want to use the SLF4J logger
log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator
log4jdbc.auto.load.popular.drivers=false
log4jdbc.drivers=com.mysql.cj.jdbc.Driver

logbock.xml配置  ,这里是直接下载到 D:/resource/logs

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="30 seconds" debug="false">
    <!--上下文名称,可加可不加,为了美观可写自己公司名称缩写-->
    <contextName>MXK</contextName>
    <!-- 日志存放目录 -->
    <property name="log.path" value="D:/resource/logs" />
    <property name="log.charset" value="utf-8" />
<!--                                             上下文名称      红色 日期格式                     绿色   线程                   等级                   日志最长36          方法     行数        换行          -->
    <property name="log.consolePattern" value="%contextName- %red(%d{yyyy-MM-dd HH:mm:ss}) %green([%thread]) %highlight(%-5level) %boldMagenta(%logger{36}) - %red([%method,%line]) - %msg%n" />
   <!--基本他同上, 具体可看资料3-->
    <property name="log.filePattern" value="%contextName- %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" />

    <!--输出到控制台-->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${log.consolePattern}</pattern>
            <charset>${log.charset}</charset>
        </encoder>
    </appender>

    <!-- 系统日志输出 -->
    <appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}/sys-info.log</file>
        <!-- 循环政策:基于时间创建日志文件 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 日志文件名格式 -->
            <fileNamePattern>${log.path}/sys-info.%d{yyyy-MM-dd}.log</fileNamePattern>
            <!-- 日志最大的历史 60天 -->
            <maxHistory>60</maxHistory>
        </rollingPolicy>
        <!--编码器-->
        <encoder>
            <pattern>${log.filePattern}</pattern>
            <charset>${log.charset}</charset>
        </encoder>

        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!-- 过滤的级别 -->
            <level>INFO</level>
            <!-- 匹配时的操作:接收(记录) -->
            <onMatch>ACCEPT</onMatch>
            <!-- 不匹配时的操作:拒绝(不记录) -->
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!-- 系统日志输出 -->
    <appender name="file_debug" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}/sys-debug.log</file>
        <!-- 循环政策:基于时间创建日志文件 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 日志文件名格式 -->
            <fileNamePattern>${log.path}/sys-debug.%d{yyyy-MM-dd}.log</fileNamePattern>
            <!-- 日志最大的历史 60天 -->
            <maxHistory>60</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${log.filePattern}</pattern>
            <charset>${log.charset}</charset>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!-- 过滤的级别 -->
            <level>DEBUG</level>
            <!-- 匹配时的操作:接收(记录) -->
            <onMatch>ACCEPT</onMatch>
            <!-- 不匹配时的操作:拒绝(不记录) -->
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}/sys-error.log</file>
        <!-- 循环政策:基于时间创建日志文件 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 日志文件名格式 -->
            <fileNamePattern>${log.path}/sys-error.%d{yyyy-MM-dd}.log</fileNamePattern>
            <!-- 日志最大的历史 60天 -->
            <maxHistory>60</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${log.filePattern}</pattern>
            <charset>${log.charset}</charset>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!-- 过滤的级别 -->
            <level>ERROR</level>
            <!-- 匹配时的操作:接收(记录) -->
            <onMatch>ACCEPT</onMatch>
            <!-- 不匹配时的操作:拒绝(不记录) -->
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <root level="info">
        <appender-ref ref="console" />
    </root>

    <!--系统操作日志-->
    <root level="info">
        <appender-ref ref="file_info" />
        <appender-ref ref="file_error" />
        <appender-ref ref="file_debug" />
    </root>

    <!--监控sql日志输出 -->
    <!--      仅仅记录 SQL 语句,会将占位符替换为实际的参数-->
    <logger name="jdbc.sqlonly" level="INFO" additivity="false">
        <appender-ref ref="console" />
    </logger>
    <!--  包含 ResultSet 的信息,输出篇幅较长  -->
    <logger name="jdbc.resultset" level="ERROR" additivity="false">
        <appender-ref ref="console" />
    </logger>

    <!--  如想看到表格数据,将OFF改为INFO  -->
    <logger name="jdbc.resultsettable" level="OFF" additivity="false">
        <appender-ref ref="console" />
    </logger>
    <!-- 输出了 Connection 的 open、close 等信息  -->
    <logger name="jdbc.connection" level="OFF" additivity="false">
        <appender-ref ref="console" />
    </logger>
    <!--    包含 SQL 语句实际的执行时间 及sql语句(与jdbc.sqlonly功能重复)   -->
    <logger name="jdbc.sqltiming" level="OFF" additivity="false">
        <appender-ref ref="console" />
    </logger>
    <!--    除了 ResultSet 之外的所有JDBC调用信息,篇幅较长 -->
    <logger name="jdbc.audit" level="OFF" additivity="false">
        <appender-ref ref="console" />
    </logger>
</configuration>

 在记一个日志输出:这里需要重新配置一个:annotaion

 

package com.mxktech.common.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;


@Retention(RetentionPolicy.RUNTIME)//定义注解何时有效
@Target(ElementType.METHOD)//定义注解可以修饰方法
public @interface RequiredLog {
    String value() default "";
}
package com.mxktech.common.aspect;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class LogAspect {

    private final static Logger log = LoggerFactory.getLogger(LogAspect.class);

    //通过Pointcut定义一个切入点,@annotation方式为定义切入点的一种方式
    @Pointcut("@annotation(com.mxktech.common.annotation.RequiredLog)")
    public void doLog(){}

    /**
     * @Around 注解描述的方法可以在目标方法执行前后做功能扩展
     * @param joinPoint 封装了目标方法信息的一个对象(连接点对象)
     * @return  目标方法的执行结果
     */
    @Around("doLog()")
    public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {
        try {
            long t1 = System.currentTimeMillis();
            Object result = joinPoint.proceed();//去调用目标方法,其返回值为目标方法返回值
            long t2 = System.currentTimeMillis();
            System.out.println("time: " + (t2-t1));
            //将正常的用户行为写入到数据库
            return result;
        }catch (Throwable e){
            logError(joinPoint,e.getMessage());
            throw e;
        }
    }



    //将错误日志输出并记录
    private void logError(ProceedingJoinPoint joinPoint, String exceptionMessage) throws JsonProcessingException {
        String targetClassName = joinPoint.getTarget().getClass().getName();
        String methodName = joinPoint.getSignature().getName();
        String params = new ObjectMapper().writeValueAsString(joinPoint.getArgs());
        log.error("error.message: {}--->{}--->{}",targetClassName+"."+methodName,params,exceptionMessage);
    }
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值