[
http://jira.qos.ch/browse/LBCLASSIC-203?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Ceki Gulcu updated LBCLASSIC-203:
---------------------------------
Priority: Critical (was: Major)
> simultaneously logging to all historical logs after rollover
> ------------------------------------------------------------
>
> Key: LBCLASSIC-203
> URL: http://jira.qos.ch/browse/LBCLASSIC-203
> Project: logback-classic
> Issue Type: Bug
> Affects Versions: 0.9.18, 0.9.20
> Environment: Windows XP, Windows 7; jdk1.6.0_16
> Reporter: Ellen Strnod
> Assignee: Ceki Gulcu
> Priority: Critical
> Attachments: logback-test-1.0.zip
>
>
> Logs will roll over (using sifted rolling file appender) and then start
> logging simultaneously to all the historical log files for that application
> (log_1.log, log_2.log, etc.) as well as the current one (log.log). Once this
> happens, application performance is severely degraded.
> I made a test app using first the same versions of logback & slf4j as used by
> dm server 2.0, where the problem was first witnessed. (logback 0.9.18, slf4j
> api 1.5.10). It seems to continue to work fine as long as only one thread is
> logging. 5 threads, and it will happen occasionally/eventually. 10 threads,
> and it is pretty likely to happen as soon as it rolls over the first time.
> I then updated it to use current versions (logback 0.9.20, slf4j api 1.5.11),
> and witnessed the same behavior.
> I have a release zip I can provide if possible (not sure attachments are
> allowed with JIRA); otherwise, here are contents of project files for the
> test case:
> --------------------------------------------------------------
> logback.xml contents:
> ---------------------------------------------------------------
> <configuration>
> <!--
> <appender name="LOG_FILE"
> class="ch.qos.logback.core.rolling.RollingFileAppender">
> <file>logs/test_rollover_daily.log</file> <rollingPolicy
> class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
> rollover
> daily
>
> <FileNamePattern>logs/test_rollover-%d{yyyy-MM-dd}.%i.log</FileNamePattern>
> <timeBasedFileNamingAndTriggeringPolicy
> class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> or
> whenever
> the file size reaches 1000MB <MaxFileSize>1MB</MaxFileSize>
> </timeBasedFileNamingAndTriggeringPolicy> </rollingPolicy>
> <encoder>
> <pattern>%msg</pattern> </encoder> </appender>
> -->
> <appender name="SIFTED_LOG_FILE"
> class="ch.qos.logback.classic.sift.SiftingAppender">
> <discriminator>
> <Key>applicationName</Key>
> <DefaultValue>default</DefaultValue>
> </discriminator>
> <sift>
> <appender name="${applicationName}_LOG_FILE"
>
> class="ch.qos.logback.core.rolling.RollingFileAppender">
> <file>../logs/${applicationName}/log.log
> </file>
> <rollingPolicy
>
> class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
>
> <FileNamePattern>../logs/${applicationName}/log_%i.log
> </FileNamePattern>
> <MinIndex>1</MinIndex>
> <MaxIndex>4</MaxIndex>
> </rollingPolicy>
> <triggeringPolicy
>
> class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
> <MaxFileSize>10MB</MaxFileSize>
> </triggeringPolicy>
> <layout
> class="ch.qos.logback.classic.PatternLayout">
> <Pattern>%d{yyyy-MM-dd
>
> HH:mm:ss.SSS}|%t|%p|%c{35}.%M:%L|%msg %ex%n</Pattern>
> </layout>
> </appender>
> </sift>
> </appender>
> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
> <layout class="ch.qos.logback.classic.PatternLayout">
> <Pattern>%d{yyyy-MM-dd
> HH:mm:ss.SSS}|%t|%p|%c{35}.%M:%L|%msg
> %ex%n</Pattern>
> </layout>
> </appender>
> <logger level="trace" additivity="false" name="Standard.out">
> <appender-ref ref="STDOUT" />
> </logger>
> <logger level="trace" additivity="false" name="com.annealsoft">
> <appender-ref ref="SIFTED_LOG_FILE" />
> </logger>
> <root level="info" additivity="false">
> <appender-ref ref="SIFTED_LOG_FILE" />
> </root>
> </configuration>
> ----------------------------------------------------------------
> Java test app LogbackRolloverTest.java:
> -------------------------------------------------------------------
> package com.annealsoft.test;
> import java.util.Date;
> import org.slf4j.Logger;
> import org.slf4j.LoggerFactory;
> public class LogbackRolloverTest extends Thread {
> private static Logger log =
> LoggerFactory.getLogger(LogbackRolloverTest.class);
> private static final int DEFAULT_THREAD_COUNT = 10;
> private static int threadcount = 10;
>
> public static void main(String[] args){
> if (args.length > 0) {
> try {
> threadcount = Integer.parseInt(args[0]);
> } catch (Exception e){
> System.out.println("Usage: LogbackRolloverTest [<thread
> count>] (defaults to " + DEFAULT_THREAD_COUNT + " threads)");
> System.exit(1);
> }
> }
> System.out.println("Logging from " + threadcount + (threadcount == 1
> ? " thread":" threads") + " (optional thread count parameter defaults to " +
> DEFAULT_THREAD_COUNT + ")");
>
> for (int i = 0; i < threadcount; i++) {
> new LogbackRolloverTest().start();
> }
> }
>
> public void run() {
> int count = 0;
> while (true) {
> doLog(count++);
> }
> }
>
> private void doLog(int count) {
> log.debug("The current date is " + new Date() + " the count is " +
> count);
> log.info("Info Message");
> log.warn("Warn Message");
> log.trace("Trace message");
> log.error("Error message");
> log.info("Info Message");
> log.warn("Warn Message");
> log.trace("Trace message");
> log.error("Error message");
> try {
> throw new Exception("throwing exception " + count + " to create a
> stack trace");
> } catch (Exception e) {
> log.error("caught " + e.toString(), e);
> }
> if (count % 10 == 0) {
> try {
> Thread.sleep(100);
> } catch (InterruptedException e) {
> log.error("Thread interrupted: " + e.toString(), e);
> }
> }
> }
> }
> -------------------------------------------------------------
> Batch file contents logbacktest.bat:
> -------------------------------------------------------------
> @ECHO OFF
> IF "%OS%" == "Windows_NT" SETLOCAL
> IF NOT "%JAVA_HOME%" == "" goto JavaHomeSet
> echo The JAVA_HOME environment variable is not defined
> GOTO:EOF
> :JavaHomeSet
> SET SCRIPT_DIR=%~dp0%
> SET APP_HOME="%SCRIPT_DIR%.."
> setlocal ENABLEDELAYEDEXPANSION
> if defined LOCAL_CLASSPATH (set LOCAL_CLASSPATH=%LOCAL_CLASSPATH%;.) else
> (set LOCAL_CLASSPATH=.)
> FOR /R ..\lib %%G IN (*.jar) DO set LOCAL_CLASSPATH=!LOCAL_CLASSPATH!;%%G
> Echo The Classpath definition is %LOCAL_CLASSPATH%
> "%JAVA_HOME%"\bin\java -Dhomedir="%APP_HOME%" -classpath "%LOCAL_CLASSPATH%"
> com.annealsoft.test.LogbackRolloverTest %1
> ------------------------------------------------------------------
> Maven pom.xml:
> ------------------------------------------------------------------
> <project xmlns="http://maven.apache.org/POM/4.0.0"
> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
> xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
> http://maven.apache.org/maven-v4_0_0.xsd">
> <modelVersion>4.0.0</modelVersion>
> <groupId>com.annealsoft</groupId>
> <artifactId>logback-test</artifactId>
> <packaging>jar</packaging>
> <version>${release-version}</version>
>
> <name>logback-test</name>
> <repositories>
> </repositories>
>
> <dependencies>
> <dependency>
> <groupId>ch.qos.logback</groupId>
> <artifactId>logback-classic</artifactId>
> <version>${logback}</version>
> </dependency>
> <dependency>
> <groupId>org.slf4j</groupId>
> <artifactId>slf4j-api</artifactId>
> <version>${slf4j-api}</version>
> </dependency>
> </dependencies>
> <profiles>
> <profile>
> <id>logback-test</id>
> <activation>
> <activeByDefault>true</activeByDefault>
> </activation>
> <properties>
> <JDK_VERSION>1.6</JDK_VERSION>
> <release-version>1.0</release-version>
> <!-- dependency versions same as used in dm-server
> <logback>0.9.18</logback>
> <slf4j-api>1.5.10</slf4j-api>
> -->
> <!-- dependencies for current release version -->
> <logback>0.9.20</logback>
> <slf4j-api>1.5.11</slf4j-api>
> </properties>
> <build>
> <plugins>
> <plugin>
> <groupId>org.apache.maven.plugins
> </groupId>
> <artifactId>maven-compiler-plugin
> </artifactId>
> <configuration>
> <source>${JDK_VERSION}</source>
> <target>${JDK_VERSION}</target>
> </configuration>
> </plugin>
> <plugin>
> <artifactId>maven-assembly-plugin</artifactId>
> <configuration>
> <descriptor>release.xml</descriptor>
> <outputDirectory>release</outputDirectory>
> </configuration>
> </plugin>
> </plugins>
> <finalName>logback-test</finalName>
> <defaultGoal>package</defaultGoal>
> </build>
> </profile>
> </profiles>
> </project>
> --------------------------------------------------------------------------
> Maven release.xml:
> --------------------------------------------------------------------------
> <assembly>
> <id>${release-version}</id>
> <formats>
> <format>zip</format>
> </formats>
> <includeBaseDirectory>false</includeBaseDirectory>
> <fileSets>
> <fileSet>
> <directory>bin</directory>
> <outputDirectory>bin</outputDirectory>
> </fileSet>
> <fileSet>
> <directory>lib</directory>
> <outputDirectory>lib</outputDirectory>
> </fileSet>
> <fileSet>
> <directory>src</directory>
> <outputDirectory>src</outputDirectory>
> </fileSet>
> <fileSet>
> <directory>src/main/resources</directory>
> <outputDirectory>config</outputDirectory>
> </fileSet>
> <fileSet>
> <directory>logs</directory>
> <outputDirectory>logs</outputDirectory>
> </fileSet>
> </fileSets>
> <dependencySets>
> <dependencySet>
> <unpack>false</unpack>
> <scope>runtime</scope>
> <outputDirectory>lib</outputDirectory>
> </dependencySet>
> </dependencySets>
> </assembly>
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://jira.qos.ch/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
_______________________________________________
logback-dev mailing list
[email protected]
http://qos.ch/mailman/listinfo/logback-dev