Note – This article is part of a series discussing subjects around NiFi monitoring.
There is one configuration file in NiFi that manages all the logging operations performed by NiFi: this file is in the configuration directory (NIFI_HOME/conf) and is named logback.xml. It is good to know that this file can be modified “on-the-fly” and it won’t be required to restart NiFi for the modifications to be taken into account.
This file is a common configuration file for the logback library which is a successor of the famous log4j project. Here is the official website. I won’t get into the details of logback itself (documentation is here) but here is a quick overview of the default configuration when using NiFi.
The most important log file in NiFi is certainly nifi-app.log which is created according to this configuration block:
<appender name="APP_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${org.apache.nifi.bootstrap.config.log.dir}/nifi-app.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <fileNamePattern>${org.apache.nifi.bootstrap.config.log.dir}/nifi-app_%d{yyyy-MM-dd_HH}.%i.log</fileNamePattern> <maxFileSize>100MB</maxFileSize> <maxHistory>30</maxHistory> </rollingPolicy> <immediateFlush>true</immediateFlush> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>%date %level [%thread] %logger{40} %msg%n</pattern> </encoder> </appender> <root level="INFO"> <appender-ref ref="APP_FILE"/> </root>
In this case, log file is rolling every hour or when the file is going over 100MB. Besides we only keep up to 30 files worth of history. Based on your retention policies you can update this file to meet your requirements.
Also note that, by default, you will have the following log files:
- ./logs/nifi-app.log
- ./logs/nifi-bootstrap.log
- ./logs/nifi-user.log
Now… what can we do to use this file for monitoring purpose? Some options here:
- We can use the TailFile processor of NiFi to let NiFi tails its own log file and perform the required operation when some conditions are met. Example to send an HTTP request when logs of WARN and ERROR levels are detected:
- We can also define new appenders in the log configuration file and change it according to our needs. In particular, we could be interested by the SMTP Appender that can send logs via emails based on quite a large set of conditions. Full documentation here.
- Obviously you can also configure this configuration file so that NiFi log files integrate with your existing systems. An idea could be to configure a Syslog appender to also redirect the logs to an external system.
Few remarks regarding the logs as I see recurrent questions:
- At the moment, there is no option to have a log file per processor or per process group. It is discussed by NIFI-3065. However such an approach could have performance implications since each log message would need to be routed to the correct log file.
- Also, at the moment, the custom name of the processor is not displayed in the log messages (only the type is used). It is discussed by NIFI-3877. Right now it looks like:
2017-05-12 10:43:37,780 INFO [Timer-Driven Process Thread-4] o.a.nifi.processors.standard.InvokeHTTP InvokeHTTP[id=f7ebb153-015b-1000-f590-599786e16340] my log message…
This could be a solution in a multi-tenant environment (to get one log file per workflow/use case) assuming each “team” is following the same convention to name the components in the workflows.
As usual feel free to ask questions and comment this post.
[…] Logback configuration […]
LikeLike
I’m trying to specify a log dir outside of the home directory. I’m not sure where it’s documented but it looks like it’s supposed to take the setting from a java system property and I saw in a forum post that it could be done in bootstrap.conf–so I tried adding this:
java.arg.7=-Dorg.apache.nifi.bootstrap.config.log.dir=/var/log/nifi
But on restart, it has no effect. How should I be supplying this? Thanks….
LikeLike
I think the best option would be to update the ./bin/nifi.sh and update the value.
LikeLiked by 1 person
It doesn’t seem to have any effect in bin/nifi.sh. It has to go in bin/nifi-env.sh:
export NIFI_LOG_DIR=/var/log/nifi
The way things are set up gives the impression it can be controlled via env vars but that’s not the case given what nifi-env.sh does. But thanks for pointing me in the right direction.
LikeLike
[…] Monitoring NiFi – Logback configuration by Pierre Villard […]
LikeLike
Thank you. This page helped me to design my alerts workflow.
LikeLike
Thank you. This page is helpful. Is it still the case in NiFi where there is no option to have a log file per processor or per process group?
LikeLike
Correct, there is no such option at the moment as far as I know.
LikeLike
Hi, I see that nifi-user.log is not recording anything. I checked the logback file and see this
${org.apache.nifi.bootstrap.config.log.dir}/nifi-user.log
Other logs like app.log is recording logs, but with user.log I am facing issues. Is there any other place I can check the logs issue?
Thanks in Advance
LikeLike
Anything in nifi-app.log that could indicate an issue? I don’t have anything in mind to explain the behavior you’re seeing.
LikeLike