• 【转载】logback自定义目录及输出格式


    转载自 https://blog.csdn.net/qq_39762975/article/details/102741912

    上一篇文章 回顾 中,我们介绍了一种方法自定义日志输出格式:

    1. 首先,自定义格式转换器,也就是继承 ClassicConverter,实现他的 convert 方法;
    2. 然后,在 logback.xml 中配置<conversionRule>标签,定义其属性 conversionWordconverterClass
    3. 最后,在日志输出格式中,通过 %ip 来动态获取IP值(假设 conversionWord="ip");

    但是,这个 %ip不能用来定义文件路径,接下来介绍另一种方式,既可以自定义日志目录路径,又可以自定义日志输出格式。

    一、解决方案

    1.1 PropertyDefinerBase实现类

    我们创建一个类 com.xxx.utils.IPConverterConfig 并继承 ch.qos.logback.core.PropertyDefinerBase,内容如下:

    package com.xxx.utils;
    
    import ch.qos.logback.core.PropertyDefinerBase;
    
    import java.net.InetAddress;
    import java.net.UnknownHostException;
    
    public class NodeIpProperty extends PropertyDefinerBase  {
      private static String nodeIP;
      static {
        try {
          nodeIP = InetAddress.getLocalHost().getHostAddress();
        } catch (UnknownHostException e) {
          e.printStackTrace();
          nodeIP = "unknown";
        }
      }
    
      @Override
      public String getPropertyValue() {
        return NodeIpProperty.nodeIP;
      }
    }
    

    1.2 <define>标签

    logback.xml中添加如下配置,该配置位于<configuration>标签下

    <define name="NODE_IP" class="com.xxx.utils.NodeIpProperty"/>
    

    1.3 ${属性名}

    继续在 logback.xml 中使用 ${NODE_IP} 动态获取属性值:

    二、测试结果

    如果是 Windows 平台,如果你的项目代码在 F: 盘,那么你的日志就会在 F:\opt\192.168.137.1\logs

    如果是 Linux 平台,日志就在 /opt/192.168.137.1/logs 文件夹;

    打印出的日志形如:

    2022-01-12 15:38:40.621 [192.168.137.1] INFO [main] Main Hello World!
    

    三、完整的 logback.xml

    继续在 logback.xml 中用 ${NODE_IP} 来表示该变量:

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration>
      <define name="NODE_IP" class="com.xxx.utils.NodeIpProperty"/>
      <property name="LOG_PATH" value="/opt/${NODE_IP}/logs" />
    
      <!-- 输出日志到文件,可选择按照时间与每个文件大小进行滚动 -->
      <appender name="FILE"
                class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_PATH}/biz.log</file>
        <rollingPolicy
                class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
          <!-- rollover daily -->
          <fileNamePattern>/opt/app/logs/logback/biz-%d{yyyy-MM-dd_HH}.%i.txt</fileNamePattern>
          <!-- 每个文件最大100MB,即在单位时间(例如一个小时)内,可能会产生多个文件,各文件以1、2、3…阿拉伯数字来标示 -->
          <maxFileSize>100MB</maxFileSize>
          <!-- 保留60天(或小时,根据fileNamePattern来决定单位)的历史日志 -->
          <maxHistory>60</maxHistory>
          <!-- 所有归档文件(不包括当前文件)的总大小不超过1GB -->
          <totalSizeCap>1GB</totalSizeCap>
        </rollingPolicy>
        <encoder>
            <pattern>%date{yyyy-MM-dd HH:mm:ss.SSS} [${NODE_IP}] %level [%thread] %logger{36} %msg%n</pattern>
        </encoder>
      </appender>
      <!--将上面配置的“FILE” appender包装成异步方式来提高性能,但是在高并发写日志请求的情况下默认会丢弃低级别日志,当然也可以选择配置不丢弃日志,但业务线程阻塞,注意只有logback-classic
      1.0.4+才支持AsyncAppender -->
      <appender name="ASYNC_FILE" class="ch.qos.logback.classic.AsyncAppender">
        <!-- 注意一个AsyncAppender只能引用一个appender,不能引用多个 -->
        <appender-ref ref="FILE" />
        <!-- 队列大小(整型,默认值为256,相当于最大可以同时缓存256个写日志请求到内存),值越大,高并发写日志请求的情况下越能提升程序性能,但同时也会占用更多的堆内存。建议结合压测来调整合适的队列大小 -->
        <queueSize>256</queueSize>
        <!-- 阈值(整型,默认值为队列大小queueSize的20%)。默认当队列的剩余空间小于此阈值时, 则会丢弃TRACE、DEBUG、INFO级别的日志,保留WARN、ERROR级别的日志
        。如果设置为0,表示不丢弃日志,但当队列满时,业务线程(不是写日志的异步线程)会阻塞 -->
        <discardingThreshold>0</discardingThreshold>
      </appender>
    
      <root level="INFO">
        <appender-ref ref="ASYNC_FILE" />
      </root>
    </configuration>
    
  • 相关阅读:
    pt-heartbeat(percona toolkit)
    pt-find使用
    pt-duplicate-key-checker使用
    Unity3D 之IAP
    Unity3D 之IAP
    JDK环境变量
    Android环境变量的设置(详细图解版)
    Android sdk 更新失败解决方发整理
    unity开发android游戏(一)搭建Unity安卓开发环境
    Unity使用 UnityVS+VS2013 调试脚本
  • 原文地址:https://www.cnblogs.com/kendoziyu/p/15792923.html
Copyright © 2020-2023  润新知