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

ASF GitHub Bot commented on NIFI-1170:
--------------------------------------

Github user pvillard31 commented on a diff in the pull request:

    https://github.com/apache/nifi/pull/980#discussion_r78437746
  
    --- Diff: 
nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/TailFile.java
 ---
    @@ -245,58 +490,82 @@ private void recoverState(final ProcessContext 
context, final Map<String, String
                             + "this indicates that the file has rotated. Will 
begin tailing current file from beginning.", new 
Object[]{existingTailFile.length(), position});
                 }
     
    -            state = new TailFileState(currentFilename, tailFile, reader, 
position, timestamp, checksum, ByteBuffer.allocate(65536));
    +            states.get(filePath).setState(new TailFileState(filePath, 
tailFile, reader, position, timestamp, length, checksum, 
ByteBuffer.allocate(65536)));
             } else {
    -            resetState(currentFilename);
    +            resetState(filePath);
             }
     
    -        getLogger().debug("Recovered state {}", new Object[]{state});
    +        getLogger().debug("Recovered state {}", new 
Object[]{states.get(filePath).getState()});
         }
     
    -    private void resetState(final String currentFilename) {
    -        expectedRecoveryChecksum = null;
    -        state = new TailFileState(currentFilename, null, null, 0L, 0L, 
null, ByteBuffer.allocate(65536));
    +    private void resetState(final String filePath) {
    +        states.get(filePath).setExpectedRecoveryChecksum(null);
    +        states.get(filePath).setState(new TailFileState(filePath, null, 
null, 0L, 0L, 0L, null, ByteBuffer.allocate(65536)));
         }
     
         @OnStopped
         public void cleanup() {
    -        final TailFileState state = this.state;
    -        if (state == null) {
    +        for (TailFileObject tfo : states.values()) {
    +            cleanReader(tfo);
    +            final TailFileState state = tfo.getState();
    +            tfo.setState(new TailFileState(state.getFilename(), 
state.getFile(), null, state.getPosition(), state.getTimestamp(), 
state.getLength(), state.getChecksum(), state.getBuffer()));
    +        }
    +    }
    +
    +    private void cleanReader(TailFileObject tfo) {
    +        if (tfo.getState() == null) {
                 return;
             }
     
    -        final FileChannel reader = state.getReader();
    +        final FileChannel reader = tfo.getState().getReader();
             if (reader == null) {
                 return;
             }
     
             try {
                 reader.close();
    +            getLogger().debug("Closed FileChannel {}", new 
Object[]{reader});
             } catch (final IOException ioe) {
                 getLogger().warn("Failed to close file handle during cleanup");
             }
    -
    -        getLogger().debug("Closed FileChannel {}", new Object[]{reader});
    -
    -        this.state = new TailFileState(state.getFilename(), 
state.getFile(), null, state.getPosition(), state.getTimestamp(), 
state.getChecksum(), state.getBuffer());
         }
     
         @Override
         public void onTrigger(final ProcessContext context, final 
ProcessSession session) throws ProcessException {
    +        if(isMultiChanging.get()) {
    +            long timeSinceLastLookup = new Date().getTime() - 
lastLookup.get();
    +            if(timeSinceLastLookup > 
context.getProperty(LOOKUP_FREQUENCY).asTimePeriod(TimeUnit.MILLISECONDS)) {
    +                try {
    +                    recoverState(context);
    +                } catch (IOException e) {
    +                    getLogger().warn("Exception raised while looking up 
for new files", e);
    --- End diff --
    
    Good catch.


> TailFile "File to Tail" property should support Wildcards
> ---------------------------------------------------------
>
>                 Key: NIFI-1170
>                 URL: https://issues.apache.org/jira/browse/NIFI-1170
>             Project: Apache NiFi
>          Issue Type: Improvement
>          Components: Core Framework
>    Affects Versions: 0.4.0
>            Reporter: Andre
>
> Because of challenges around log rotation of high volume syslog and app 
> producers, it is customary to logging platform developers to promote file 
> variables based file names such as DynaFiles (rsyslog), Macros(syslog-ng)as 
> alternatives to getting SIGHUPs being sent to the syslog daemon upon every 
> file rotation.
> (To certain extent, used even NiFi's has similar patterns, like for example, 
> when one uses Expression Language to set PutHDFS destination file).
> The current TailFile strategy suggests rotation patterns like:
> {code}
> log_folder/app.log
> log_folder/app.log.1
> log_folder/app.log.2
> log_folder/app.log.3
> {code}
> It is possible to fool the system to accept wildcards by simply using a 
> strategy like:
> {code}
> log_folder/test1
> log_folder/server1
> log_folder/server2
> log_folder/server3
> {code}
> And configure *Rolling Filename Pattern* to * but it feels like a hack, 
> rather than catering for an ever increasingly prevalent use case 
> (DynaFile/macros/etc).
> It would be great if instead, TailFile had the ability to use wildcards on 
> File to Tail property



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

Reply via email to