You are viewing a plain text version of this content. The canonical link for it is here.
Posted to log4j-dev@logging.apache.org by "Bernhard Mähr (JIRA)" <ji...@apache.org> on 2016/07/04 14:21:11 UTC

[jira] [Comment Edited] (LOG4J2-904) RollingFile appender doesn't zip and create new files

    [ https://issues.apache.org/jira/browse/LOG4J2-904?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15361376#comment-15361376 ] 

Bernhard Mähr edited comment on LOG4J2-904 at 7/4/16 2:20 PM:
--------------------------------------------------------------

I have now a working FileRenameAction which does a truncate even if the log-file is locked some way and logs what it is doing and why it is failing. This implementation solved the problem on my Windows machine even if deleting the log-File was noch possible. 

Please check and add to the source code.

{code:java}

    public static boolean execute(final File source, final File destination, final boolean renameEmptyFiles) {
        if (renameEmptyFiles || (source.length() > 0)) {
            final File parent = destination.getParentFile();
            if ((parent != null) && !parent.exists()) {
                // LOG4J2-679: ignore mkdirs() result: in multithreaded scenarios,
                // if one thread succeeds the other thread returns false
                // even though directories have been created. Check if dir exists instead.
                parent.mkdirs();
                if (!parent.exists()) {
                    AbstractAction.LOGGER.error("Unable to create directory {}", parent.getAbsolutePath());
                    return false;
                }
            }
            try {
                try {
                    Files.move(Paths.get(source.getAbsolutePath()), Paths.get(destination.getAbsolutePath()), StandardCopyOption.ATOMIC_MOVE,
                            StandardCopyOption.REPLACE_EXISTING);
                    AbstractAction.LOGGER.trace("Renamed file {} to {} with Files.move", source.getAbsolutePath(), destination.getAbsolutePath());
                    return true;
                } catch (final IOException exMove) {
                    AbstractAction.LOGGER.error("Unable to move file {} to {}: {} {}", source.getAbsolutePath(), destination.getAbsolutePath(),
                            exMove.getClass().getName(), exMove.getMessage());
                    final boolean result = source.renameTo(destination);
                    if (!result) {
                        try {
                            Files.copy(Paths.get(source.getAbsolutePath()), Paths.get(destination.getAbsolutePath()), StandardCopyOption.REPLACE_EXISTING);
                            try {
                                Files.delete(Paths.get(source.getAbsolutePath()));
                                AbstractAction.LOGGER.trace("Renamed file {} to {} with Files.copy and Files.delete", source.getAbsolutePath(),
                                        destination.getAbsolutePath());
                            } catch (final IOException exDelete) {
                                AbstractAction.LOGGER.error("Unable to delete file {}: {} {}", source.getAbsolutePath(), exDelete.getClass().getName(),
                                        exDelete.getMessage());
                                try {
                                    new PrintWriter(source.getAbsolutePath()).close();
                                    AbstractAction.LOGGER.trace("Renamed file {} to {} with Files.copy and overwrite old file", source.getAbsolutePath(),
                                            destination.getAbsolutePath());
                                } catch (final IOException exOwerwrite) {
                                    AbstractAction.LOGGER.error("Unable to overwrite file {}: {} {}", source.getAbsolutePath(), exOwerwrite.getClass().getName(),
                                            exOwerwrite.getMessage());
                                }
                            }
                        } catch (final IOException exCopy) {
                            AbstractAction.LOGGER.error("Unable to copy file {} to {}: {} {}", source.getAbsolutePath(), destination.getAbsolutePath(),
                                    exCopy.getClass().getName(), exCopy.getMessage());
                        }
                    } else {
                        AbstractAction.LOGGER.trace("Renamed file {} to {} with source.renameTo", source.getAbsolutePath(), destination.getAbsolutePath());
                    }
                    return result;
                }
            } catch (final RuntimeException ex) {
                AbstractAction.LOGGER.error("Unable to rename file {} to {}: {} {}", source.getAbsolutePath(), destination.getAbsolutePath(),
                        ex.getClass().getName(), ex.getMessage());
            }
        } else {
            try {
                source.delete();
            } catch (final Exception exDelete) {
                AbstractAction.LOGGER.error("Unable to delete empty file {}: {} {}", source.getAbsolutePath(), exDelete.getClass().getName(),
                        exDelete.getMessage());
            }
        }

        return false;
    }

{code} 


was (Author: bmaehr):
I have now a working FileRenameAction which does a truncate even if the log-file is locked some way and logs what it is doing and why it is failing. This implementation solved the problem on my Windows machine even if deleting the log-File was noch possible. 

Please check and add to the source code.

{code:java}

    public static boolean execute(final File source, final File destination, final boolean renameEmptyFiles) {
        if (renameEmptyFiles || (source.length() > 0)) {
            final File parent = destination.getParentFile();
            if ((parent != null) && !parent.exists()) {
                // LOG4J2-679: ignore mkdirs() result: in multithreaded scenarios,
                // if one thread succeeds the other thread returns false
                // even though directories have been created. Check if dir exists instead.
                parent.mkdirs();
                if (!parent.exists()) {
                    AbstractAction.LOGGER.error("Unable to create directory {}", parent.getAbsolutePath());
                    return false;
                }
            }
            try {
                try {
                    Files.move(Paths.get(source.getAbsolutePath()), Paths.get(destination.getAbsolutePath()), StandardCopyOption.ATOMIC_MOVE,
                            StandardCopyOption.REPLACE_EXISTING);
                    AbstractAction.LOGGER.trace("Renamed file {} to {} with Files.move", source.getAbsolutePath(), destination.getAbsolutePath());
                    return true;
                } catch (final IOException exMove) {
                    AbstractAction.LOGGER.error("Unable to move file {} to {}: {} {}", source.getAbsolutePath(), destination.getAbsolutePath(),
                            exMove.getClass().getName(), exMove.getMessage());
                    final boolean result = source.renameTo(destination);
                    if (!result) {
                        try {
                            Files.copy(Paths.get(source.getAbsolutePath()), Paths.get(destination.getAbsolutePath()), StandardCopyOption.REPLACE_EXISTING);
                            try {
                                Files.delete(Paths.get(source.getAbsolutePath()));
                                AbstractAction.LOGGER.trace("Renamed file {} to {} with Files.copy and Files.delete", source.getAbsolutePath(),
                                        destination.getAbsolutePath());
                            } catch (final IOException exDelete) {
                                AbstractAction.LOGGER.error("Unable to delete file {}: {} {}", source.getAbsolutePath(), exDelete.getClass().getName(),
                                        exDelete.getMessage());
                                try {
                                    new PrintWriter(source.getAbsolutePath()).close();
                                    AbstractAction.LOGGER.trace("Renamed file {} to {} with Files.copy and overwrite old file", source.getAbsolutePath(),
                                            destination.getAbsolutePath());
                                } catch (final IOException exOwerwrite) {
                                    AbstractAction.LOGGER.error("Unable to overwrite file {}: {} {}", source.getAbsolutePath(), exDelete.getClass().getName(),
                                            exDelete.getMessage());
                                }
                            }
                        } catch (final IOException exCopy) {
                            AbstractAction.LOGGER.error("Unable to copy file {} to {}: {} {}", source.getAbsolutePath(), destination.getAbsolutePath(),
                                    exCopy.getClass().getName(), exCopy.getMessage());
                        }
                    } else {
                        AbstractAction.LOGGER.trace("Renamed file {} to {} with source.renameTo", source.getAbsolutePath(), destination.getAbsolutePath());
                    }
                    return result;
                }
            } catch (final RuntimeException ex) {
                AbstractAction.LOGGER.error("Unable to rename file {} to {}: {} {}", source.getAbsolutePath(), destination.getAbsolutePath(),
                        ex.getClass().getName(), ex.getMessage());
            }
        } else {
            try {
                source.delete();
            } catch (final Exception exDelete) {
                AbstractAction.LOGGER.error("Unable to delete empty file {}: {} {}", source.getAbsolutePath(), exDelete.getClass().getName(),
                        exDelete.getMessage());
            }
        }

        return false;
    }

{code} 

> RollingFile appender doesn't zip and create new files
> -----------------------------------------------------
>
>                 Key: LOG4J2-904
>                 URL: https://issues.apache.org/jira/browse/LOG4J2-904
>             Project: Log4j 2
>          Issue Type: Bug
>          Components: Appenders
>    Affects Versions: 2.1
>         Environment: Windows 7
>            Reporter: Stephen A. Weinfield
>
> Using TimeBasedTriggeringPolicy, with a filePattern of {{f:/Log4J/$$\{date:yyyy-MM}/IIB-%d\{MM-dd-yyyy}-%i.log.zip}} and a fileName of f:/Log4J/IIB.log:
> on date change, directory is created but filename is not zipped. Also old file is not cleared out, but just appended to.
> Log4j2.xml:
> {code}
> <Configuration status = "warn" name = "Log4j2_Configuration" monitorInterval = "60" packages = "">
>     <Appenders>
>         <RollingFile name = "RollingFile" fileName = "f:/Log4J/IIB.log" filePattern = "f:/Log4J/$${date:yyyy-MM}/IIB-%d{MM-dd-yyyy}-%i.log.zip" >
>             <PatternLayout>
>                 <Pattern>%d %p %c{1} %m%n%n</Pattern>
>             </PatternLayout>
>             <Policies>
>                 <TimeBasedTriggeringPolicy interval = "1" modulate = "true"/>
>             </Policies>
>             <DefaultRolloverStrategy fileIndex = "min" max = "7" compressionLevel = "5"/>
>         </RollingFile>
>     </Appenders>
>     <Loggers>
>         <Root level = "trace">
>             <AppenderRef ref = "RollingFile" level = "warn"/>
>         </Root>
>     </Loggers>
> </Configuration>
> {code}



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

---------------------------------------------------------------------
To unsubscribe, e-mail: log4j-dev-unsubscribe@logging.apache.org
For additional commands, e-mail: log4j-dev-help@logging.apache.org