日志处理方案

环境:springboot
日志:logback
可以实现不同业务的日志在不同文件里存放

依赖

<!-- 日志模块 -->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-logging</artifactId>
</dependency>

自定义配置

  • 在resources目录下建立logback-spring.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- logback 自定义配置
        适用于复杂场景下的日志生成
        参考:https://blog.youkuaiyun.com/Inke88/article/details/75007649
        -->
<configuration debug="false">

    <!-- 通过${}来调用变量 -->
    <property name="logback.logdir" value="/Users/spz/etc/log/shiroStudyDemo"/>

    <!-- 系统日志 - 输出到文件 -->
    <appender name="systemLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 日志名称 -->
        <File>${logback.logdir}/system.log</File>
        <!--滚动策略,按照时间滚动 TimeBasedRollingPolicy-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--文件路径,定义了日志的切分方式——把每一天的日志归档到一个文件中,以防止日志填满整个磁盘空间-->
            <FileNamePattern>${logback.logdir}/system.%d{yyyy-MM-dd}.log</FileNamePattern>
            <!--只保留最近90天的日志-->
            <maxHistory>90</maxHistory>
            <!--用来指定日志文件的上限大小,那么到了这个值,就会删除旧的日志-->
            <!--<totalSizeCap>1GB</totalSizeCap>-->
        </rollingPolicy>
        <!--日志输出编码格式化-->
       <encoder>
            <charset>UTF-8</charset>
            <pattern>%d [%thread] [%-5level] [%-25file: %-3line] - %msg%n</pattern>
        </encoder>

    </appender>

    <!-- 用户操作日志 - 输出到文件 -->
    <appender name="userLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 日志名称 -->
        <File>${logback.logdir}/user.log</File>
        <!--滚动策略,按照时间滚动 TimeBasedRollingPolicy-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--文件路径,定义了日志的切分方式——把每一天的日志归档到一个文件中,以防止日志填满整个磁盘空间-->
            <FileNamePattern>${logback.logdir}/user.%d{yyyy-MM-dd}.log</FileNamePattern>
            <!--只保留最近90天的日志-->
            <maxHistory>90</maxHistory>
            <!--用来指定日志文件的上限大小,那么到了这个值,就会删除旧的日志-->
            <!--<totalSizeCap>1GB</totalSizeCap>-->
        </rollingPolicy>
        <!--日志输出编码格式化-->
       <encoder>
            <charset>UTF-8</charset>
            <pattern>%d [%thread] [%-5level] [%-25file: %-3line] - %msg%n</pattern>
        </encoder>

    </appender>

    <!-- 控制台日志 -->
    <appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender">
        <!--展示格式 layout-->
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>%d [%thread] [%-5level] [%file-%line] - %msg%n</pattern>
        </layout>
    </appender>

    <!-- 不同日志输出到不同文件夹
            使用时,先创建:private final static Logger log = LoggerFactory.getLogger("SYSTEM_LOG");
            -->
    <logger name="SYSTEM_LOG" additivity="false" level="INFO">
        <appender-ref ref="systemLog"/>
    </logger>
    <logger name="USER_LOG" additivity="false" level="INFO">
        <appender-ref ref="userLog"/>
    </logger>
    <logger name="CONSOLE_LOG" additivity="false" level="INFO">
        <appender-ref ref="consoleLog"/>
    </logger>

    <root level="info">
        <appender-ref ref="systemLog" />
        <appender-ref ref="consoleLog" />
        <appender-ref ref="userLog" />
    </root>

</configuration>

使用

使用前需要创建实例

private final static Logger log = LoggerFactory.getLogger("SYSTEM_LOG");

然后直接使用

log.info("xxxx");
log.error("xxxx");

开发时和发布时配置

开发时,可以将logback-spring.xml里的

<logger name="SYSTEM_LOG" additivity="false" level="INFO">
        <appender-ref ref="systemLog"/>
    </logger>
    <logger name="USER_LOG" additivity="false" level="INFO">
        <appender-ref ref="userLog"/>
    </logger>
    <logger name="CONSOLE_LOG" additivity="false" level="INFO">
        <appender-ref ref="consoleLog"/>
    </logger>

配置为

<logger name="SYSTEM_LOG" additivity="false" level="INFO">
        <appender-ref ref="consoleLog"/>
    </logger>
    <logger name="USER_LOG" additivity="false" level="INFO">
        <appender-ref ref="consoleLog"/>
    </logger>
    <logger name="CONSOLE_LOG" additivity="false" level="INFO">
        <appender-ref ref="consoleLog"/>
    </logger>

这样不需要改动代码,所有日志都会输出到控制台,便于开发。
而在发布时,只需要改回来即可,日志将输出到文件,非常方便。

结合lombok使用

lombok安装办法百度有,lombok有个注解@Slf4j(topic = "loggerName"),在类上加上这个注解,相当于这行代码:

private final static Logger log = LoggerFactory.getLogger("loggerName");

也很方便

自定义完整异常输出

如果你需要输出异常详情,则可以试用下面的代码

public static String getDetailExceptionMsg(Throwable e){
        if(e == null || e.getStackTrace() == null ||
                e.getStackTrace().length <= 0){
            return null;
        }
        StackTraceElement[] stackTraces = e.getStackTrace();
        String msg = e.getMessage() + "\n";
        for(StackTraceElement s : stackTraces){
            msg += "\t" + s.toString() + "\n";//这里建议使用自带的s.toString()方法,这样控制台输出的日志可以被idea识别,使得我们可以点击日志进入代码
        }
        return msg;
    }

关于msg += "\t" + s.toString() + "\n";这行代码,建议使用StackTraceElement类自带的toString方法进行输出,因为IDEA等编辑器的控制台在检查到类似(ImagePay.java:23)格式的日志时,会将其与源码中对应的代码联系起来,这样我们在调试时可直接点击日志进入源代码。

返回的日志类似下面:

···
com.zp.util.pay.common.http.UriVariables.getMapToParameters(UriVariables.java:115)
com.zp.util.pay.ali.api.AliPayService.genQrPay(AliPayService.java:285)
com.zp.util.pay.ali.web.AliController.imagePay(AliController.java:64)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:498)
org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:215)
org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:142)
org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:102)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:800)
···

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值