2

I want file path (along with file name) set in appender in logback.xml which class i need to use. please help. following is my 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>
Ceki
  • 26,753
  • 7
  • 62
  • 71
user2404847
  • 31
  • 1
  • 3

4 Answers4

2

You could load the appender programatically

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

then you could verify is the appender is a FileAppender and the call the getFile(). Take a look at the doc http://logback.qos.ch/apidocs/ch/qos/logback/core/FileAppender.html

fGo
  • 1,146
  • 5
  • 11
0

This issue related to LOGBACK-833 which was fixed in logback version 1.0.12. Thus, you need to upgrade to logback version 1.0.12 or later. The discriminator instance has to define "threadName" as the key to export. Otherwise, ${threadName} cannot be resolved. Here is the modified discriminator:

<discriminator class="com.hotwaxmedia.logger.ThreadNameBasedDiscriminator">
  <!-- the key to export needs to be defined -->
  <key>threadName</key>
</discriminator>
Ceki
  • 26,753
  • 7
  • 62
  • 71
0

you must user path in "fileNamePattern" tag , for example:

    <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>
0

Refer to fGo's answer, you can get log file path like this (assume your appender name is "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());
     }
  }
}
kai
  • 1,640
  • 18
  • 11