第一片心意
2018-06-28 08:40
采纳率: 80%
浏览 8.7k
已采纳

slf4j logback日志输出至不同的文件中,日志文件名在程序中动态指定

现在我需要将不同的日志输出至不同的文件中,我怎么在logback.xml文件中配置,然后在代码中动态指定文件名,将不同的日志输出到不同的日志文件中嗯?
有谁能帮我写个logback.xml文件代码和具体的java使用代码么?
万分感谢。

  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

5条回答 默认 最新

  • GG_Garin 2018-06-28 11:30
    已采纳

    <?xml version="1.0" encoding="UTF-8"?>


    <!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->

    <!-- 彩色日志 -->
    <!-- 彩色日志依赖的渲染类 -->



    <!-- 彩色日志格式 -->
    value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}" />
    <!-- Console 输出设置 -->


    ${CONSOLE_LOG_PATTERN}
    utf8

    <!-- 不用彩色控制台输出 -->
    <!--<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">-->
    <!--<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">-->
    <!--&lt;!&ndash;格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符&ndash;&gt;-->
    <!--<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>-->
    <!--</encoder>-->
    <!--</appender>-->
    <!-- 按照每天生成日志文件 -->
    <appender name="DAYINFO"  class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--日志文件输出的文件名-->
            <FileNamePattern>${LOG_HOME}/zhuoyue.server_info.log.%d{yyyy-MM-dd}.log</FileNamePattern>
            <!--日志文件保留天数-->
            <MaxHistory>30</MaxHistory>
        </rollingPolicy>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>info</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
        </encoder>
        <!--日志文件最大的大小-->
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <MaxFileSize>10MB</MaxFileSize>
        </triggeringPolicy>
    </appender>
    
    <appender name="DAYERROR"  class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--日志文件输出的文件名-->
            <FileNamePattern>${LOG_HOME}/zhuoyue.server_error.log.%d{yyyy-MM-dd}.log</FileNamePattern>
            <!--日志文件保留天数-->
            <MaxHistory>30</MaxHistory>
        </rollingPolicy>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>error</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
        </encoder>
        <!--日志文件最大的大小-->
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <MaxFileSize>10MB</MaxFileSize>
        </triggeringPolicy>
    </appender>
    
    <!-- 日志输出级别 -->
    
    <root level="INFO">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="DAYERROR" />
        <appender-ref ref="DAYINFO" />
    </root>
    

    已采纳该答案
    打赏 评论
  • Fatal Error 2018-06-28 09:20

    可以参考一下这个:
    https://blog.csdn.net/mggwct/article/details/77718122
    也许能满足你的需求。

    打赏 评论
  • qq_35116911 2018-06-28 09:25

    这个简单,刚好没事,把你的那个详细的发过来吧,我帮你写。469479045 QQ

    打赏 评论
  • patvice 2018-06-28 09:35

    这么复杂的日志要求,也是变态

    logback.xml示例附在最后

    先说思路

    1. 不同文件
      • logback通过添加不同的appender.在appender里可以设置*输出路径/文件名*,
        • 通过配置不同的logger,引用不同的appender ,达到将指定包/日志级别输出到不同的文件的目的
    2. 配置文件一般是启动时加载的,当然你也可以手动加载,也就是说你用java代码修改logback.xml,然后手动加载一下配置,应该能达到你的要求

    示例代码,

    1. 手动加载,网上有,写这儿就太长了,我贴个地址,手动加载logback.xml的java代码
    2. logback.xml, 这个我贴个我用过的:

      <?xml version="1.0" encoding="UTF-8"?>
      <configuration>
      <!-- 配置文件轮转 -->
      <property name="LOG_PATH" value="site-logs"/>
      <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
      <conversionRule conversionWord="wex"
                      converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
      <conversionRule conversionWord="wEx"
                      converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
      <!-- 彩色日志格式 -->
      <property name="CONSOLE_LOG_PATTERN"
                value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
      <!-- Console 输出设置 -->
      <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
          <encoder>
              <pattern>${CONSOLE_LOG_PATTERN}</pattern>
              <charset>utf8</charset>
          </encoder>
      </appender>
      <!-- 配置文件轮转 -->
      <appender name="DEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender">
          <!--<Encoding>UTF-8</Encoding>-->
          <File>${LOG_PATH}/debug.log</File>
          <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
              <FileNamePattern>${LOG_PATH}/debug.%d{yyyy-MM-dd}.log</FileNamePattern>
              <maxHistory>30</maxHistory>
          </rollingPolicy>
          <!--<layout class="ch.qos.logback.classic.PatternLayout">-->
          <!--<pattern>%date [%thread] %-5level %logger{50}:%L - %msg%n</pattern>-->
          <!--</layout>-->
          <encoder>
              <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
          </encoder>
          <filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只打印错误日志 -->
              <level>DEBUG</level>
              <onMatch>ACCEPT</onMatch>
              <onMismatch>DENY</onMismatch>
          </filter>
      </appender>
      
      <!-- 出错日志 appender  -->
      <appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
          <File>${LOG_PATH}/error.log</File>
      
          <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
              <fileNamePattern>${LOG_PATH}/error-%d{yyyy-MM-dd}.log</fileNamePattern>
              <maxHistory>30</maxHistory>
          </rollingPolicy>
          <encoder>
              <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>
          </encoder>
          <filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只打印错误日志 -->
              <level>ERROR</level>
              <onMatch>ACCEPT</onMatch>
              <onMismatch>DENY</onMismatch>
          </filter>
      </appender>
      
      <!-- info日志 appender  -->
      <appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
          <File>${LOG_PATH}/info.log</File>
          <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
              <!-- 按天回滚 daily -->
              <fileNamePattern>${LOG_PATH}/info-%d{yyyy-MM-dd}.log</fileNamePattern>
              <!-- 日志最大的历史 60天 -->
              <maxHistory>60</maxHistory>
          </rollingPolicy>
          <encoder>
              <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>
          </encoder>
          <filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只打印错误日志 -->
              <level>INFO</level>
              <onMatch>ACCEPT</onMatch>
              <onMismatch>DENY</onMismatch>
          </filter>
      </appender>
      
      <appender name="ASYNC_FILE" class="ch.qos.logback.classic.AsyncAppender">
          <!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
          <discardingThreshold>0</discardingThreshold>
          <!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
          <queueSize>2048</queueSize>
          <includeCallerData>true</includeCallerData>
          <!-- 添加附加的appender,最多只能添加一个 -->
          <appender-ref ref="INFO"/>
      </appender>
      
      <appender name="daoAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
          <file>/logs/venality.log</file>
          <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
              <fileNamePattern>/logs/venality-%d{yyyy-MM-dd}.log</fileNamePattern>
          </rollingPolicy>
          <encoder>
              <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{5} - %msg%n</pattern>
          </encoder>
      </appender>
      
    <logger name="com.biz.repository.dao">
        <appender-ref ref="daoAppender"/>
    </logger>
    
    <root level="INFO">
        <appender-ref ref="ASYNC_FILE"/>
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="INFO"/>
        <appender-ref ref="DEBUG"/>
        <appender-ref ref="ERROR"/>
    </root>
    

    打赏 评论
  • weixin_41623957 2020-05-08 15:14

    怎么在代码中指定文件名和路径啊大哥

    打赏 评论

相关推荐 更多相似问题