Here’s what I do in SpringBoot on Windows to read an environment variable (location of log folder).
-
In Windows Server, I set a System environment variable for "LOG_HOME" with the value with the directory that SpringBoot should use to write logs.
-
In SpringBoot’s application.properties, I have:
logging.file.name= ${LOG_HOME}/ws.log
Works great!
But in Ubuntu Linux 20.04, the same approach doesn’t work for me at all.
When the WAR file tries to deploy on Ubuntu 20.04 using this similar technique:
- (in .bashrc): export LOG_HOME = /home/ubuntu/logs
- reboot (to reload the environment for sure)
I get this error in the Tomcat log when trying to deploy the WAR file:
java.lang.IllegalArgumentException: Could not resolve placeholder ‘LOG_HOME’ in value "${LOG_HOME}/ws.log"
So, it seems that Spring doesn’t see the environment variable set in Ubuntu.
I wrote a simple Java program just to check the value of the environment variables and they were all created as expected including the LOG_HOME as shown in Linux "printenv".
If possible, I need a technique that will work on Ubuntu without changing the working SpringBoot implementation on Windows Server.
Thanks in advance for suggestions.
3
Answers
The solution for me posted by the extremely helpful satyesht above, was to edit the Catalina.sh file and add the "-D" name-value pair option under CATALINA_OPTS. Thanks to all who posted. :)
Instead of exporting in shell session like
try this as -D VM argument in your starup command
eg:
java -cp=xxx mainclass -DLOG_HOME=/home/ubuntu/log
if you are using tomcat then :
VM args can be added
catalina.sh file under CATALINA_OPTS.
For tomcat, add your environment variables to
$TOMCAT_HOME/bin/setenv.sh
where$TOMCAT_HOME
is the directory of your tomcat installation.