【问题标题】:how to get file path set in appender in logback.xml如何在 logback.xml 的 appender 中设置文件路径
【发布时间】:2013-05-29 09:51:08
【问题描述】:

我想在 logback.xml 的 appender 中设置文件路径(连同文件名) 我需要使用哪个类。请帮忙。以下是我的附加程序

<appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender">
    <discriminator class="com.hotwaxmedia.logger.ThreadNameBasedDiscriminator"/>
    <sift>
        <appender class="ch.qos.logback.core.FileAppender">
            <file>runtime/logs/app-${threadName}.html</file>
            <layout class="ch.qos.logback.classic.PatternLayout">
                <pattern>%p %d ${threadName} [%logger{0} : %-5level] %msg%n%rEx</pattern>
            </layout>
        </appender>
    </sift>
</appender>

【问题讨论】:

  • 你有什么问题?
  • 我只想在我的 java 代码中获取文件路径(即 runtime/logs/app-${threadName}.html)。那么是否有任何返回文件路径的类或方法。

标签: java filepath logback appender


【解决方案1】:

您可以通过编程方式加载附加程序

LoggerContext context = (LoggerContext)LoggerFactory.getILoggerFactory();
for (Logger logger : context.getLoggerList()) {
  for (Iterator<Appender<ILoggingEvent>> index = logger.iteratorForAppenders();     index.hasNext();) {
     Appender<ILoggingEvent> appender = index.next();
  }
}

然后您可以验证 appenderFileAppender 并且调用 getFile()。看看文档http://logback.qos.ch/apidocs/ch/qos/logback/core/FileAppender.html

【讨论】:

    【解决方案2】:

    此问题与 LOGBACK-833 相关,已在 logback 版本 1.0.12 中修复。因此,您需要升级到 logback 版本 1.0.12 或更高版本。鉴别器实例必须将“threadName”定义为要导出的键。否则,${threadName} 无法解析。这是修改后的鉴别器:

    <discriminator class="com.hotwaxmedia.logger.ThreadNameBasedDiscriminator">
      <!-- the key to export needs to be defined -->
      <key>threadName</key>
    </discriminator>
    

    【讨论】:

      【解决方案3】:

      必须在“fileNamePattern”标签中使用用户路径,例如:

          <Discriminator>
      
              <Key>userId</Key>
      
              <DefaultValue>general</DefaultValue>
      
          </Discriminator>
      
      
      
          <sift>
      
              <appender name="FILE-MODULENAME-${userId}" class="ch.qos.logback.core.rolling.RollingFileAppender">
      
                      <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                        <!-- rollover daily -->
                        <fileNamePattern>/opt/webligic12/user_projects/domains/myDomain/servers/AdminServer/logs/%d{yyyy-MM-dd}/byUser/modulename/${userId}-%d{yyyy-MM-dd}.%i.log.zip</fileNamePattern>
                        <timeBasedFileNamingAndTriggeringPolicy
                              class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                          <!-- or whenever the file size reaches maxFileSize -->
                          <maxFileSize>2MG</maxFileSize>
                        </timeBasedFileNamingAndTriggeringPolicy>
                      </rollingPolicy>
      
      
                  <Append>true</Append>
      
                  <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
      
                      <Pattern>%d %X{user} %level %msg %n</Pattern>
      
                  </encoder>
      
              </appender>
      
          </sift>
      
      </appender>
      

      【讨论】:

        【解决方案4】:

        参考fGo的回答,你可以得到这样的日志文件路径(假设你的appender名称是“SIFT”):

        LoggerContext context = (LoggerContext)LoggerFactory.getILoggerFactory();
        for (Logger logger : context.getLoggerList()) {
          for (Iterator<Appender<ILoggingEvent>> index = logger.iteratorForAppenders();     index.hasNext();) {
             Appender<ILoggingEvent> appender = index.next();
             if (appender.getName().equals("SIFT")) {
                FileAppender<ILoggingEvent> fileAppender = (FileAppender) appender;
                System.out.println(fileAppender.getFile());
             }
          }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-07-16
          • 1970-01-01
          • 2020-04-19
          • 1970-01-01
          相关资源
          最近更新 更多