Do not input private or sensitive data. View Qlik Privacy & Cookie Policy.
Skip to main content

Announcements
Join us in Toronto Sept 9th for Qlik's AI Reality Tour! Register Now
cancel
Showing results for 
Search instead for 
Did you mean: 
DBOUAKKAZ
Contributor
Contributor

Use a variable for fileName in log4j

Hello everyone,

I want to keep the log4j output in a file for each job. Is it possible to use a variable with the pattern "jobname_date_hour" for example ?

I tried to put in a TpreJob ====> tjava :

System.setProperty("logFilename", filename);

Where file name is a variable with the full path to the log file.

And added this in Project Settings ===> log4j :

      <File name="MyFile" fileName="${sys:logFilename}">

        <PatternLayout pattern="[%-5level] %d{HH:mm:ss} %logger{36}- %msg%n"/>

      </File>

But i get this error :

ERROR FileManager (${sys:logFilename}) java.io.IOException: The filename, directory name, or volume label syntax is incorrect java.io.IOException: The filename, directory name, or volume label syntax is incorrect.

Is there a different way to assign the variable ?

Labels (4)
1 Solution

Accepted Solutions
gjeremy1617088143

Hi @Djallel BOUAKKAZ​ ,

My log4j xml :

 

<?xml version="1.0" encoding="UTF-8"?>

<Configuration > 

   <Appenders> 

       <Console name="Console" target="SYSTEM_OUT"> 

           <PatternLayout pattern="[%-5level] %d{HH:mm:ss} %logger{36}- %msg%n" />

       </Console> 

   <File name="File" fileName="${sys:TalendJob.log}" >

     <PatternLayout>

       <pattern>%d %p %C{1.} [%t] %m%n</pattern>

     </PatternLayout>

   </File>

   </Appenders> 

 

   <Loggers> 

       <Root level="WARN">

           <AppenderRef ref="File" /> 

       </Root> 

   </Loggers> 

</Configuration>

 

 

at the begining of the job in a tjava :

Advanced settings tab :

 

import org.apache.logging.log4j.core.LoggerContext;

import org.apache.logging.log4j.LogManager;

 

in the basic settings :

 

String taljob = System.getProperty("TalendJob.log");

System.setProperty("TalendJob.log","C:\\coucou2.log");

org.apache.logging.log4j.core.LoggerContext ctx =(org.apache.logging.log4j.core.LoggerContext) LogManager.getContext(false);

ctx.reconfigure();

System.setProperty("TalendJob.log",taljob);

 

 

 

Send me love and kudos

 

 

 

View solution in original post

7 Replies
gjeremy1617088143

Hi @Djallel BOUAKKAZ​ ,

My log4j xml :

 

<?xml version="1.0" encoding="UTF-8"?>

<Configuration > 

   <Appenders> 

       <Console name="Console" target="SYSTEM_OUT"> 

           <PatternLayout pattern="[%-5level] %d{HH:mm:ss} %logger{36}- %msg%n" />

       </Console> 

   <File name="File" fileName="${sys:TalendJob.log}" >

     <PatternLayout>

       <pattern>%d %p %C{1.} [%t] %m%n</pattern>

     </PatternLayout>

   </File>

   </Appenders> 

 

   <Loggers> 

       <Root level="WARN">

           <AppenderRef ref="File" /> 

       </Root> 

   </Loggers> 

</Configuration>

 

 

at the begining of the job in a tjava :

Advanced settings tab :

 

import org.apache.logging.log4j.core.LoggerContext;

import org.apache.logging.log4j.LogManager;

 

in the basic settings :

 

String taljob = System.getProperty("TalendJob.log");

System.setProperty("TalendJob.log","C:\\coucou2.log");

org.apache.logging.log4j.core.LoggerContext ctx =(org.apache.logging.log4j.core.LoggerContext) LogManager.getContext(false);

ctx.reconfigure();

System.setProperty("TalendJob.log",taljob);

 

 

 

Send me love and kudos

 

 

 

gjeremy1617088143

at the end of the job you can delete the file in your workspace\ your job name \poms\jobs\process\your jobname + version\src\main\ext-resources

created at the begining of the job with sys:TalendJob.

you can get the full path with :

System.getProperty("TalendJob.log")

 

TFileDelete:

File Name : System.getProperty("TalendJob.log")

 

an other solution is to just make tfilecopy of the System.getProperty("TalendJob.log") file

DBOUAKKAZ
Contributor
Contributor
Author

Thank you so much for your answer I'm able to generate the file with the pattern I was looking for but I'm still getting this error :

2021-07-28 16:57:32,658 main ERROR FileManager (${sys:filename}) java.io.IOException: The filename, directory name, or volume label syntax is incorrect java.io.IOException: The filename, directory name, or volume label syntax is incorrect

at java.io.WinNTFileSystem.canonicalize0(Native Method)

at java.io.WinNTFileSystem.canonicalize(Unknown Source)

at java.io.File.getCanonicalPath(Unknown Source)

at java.io.File.getCanonicalFile(Unknown Source)

at org.apache.logging.log4j.core.util.FileUtils.makeParentDirs(FileUtils.java:142)

at org.apache.logging.log4j.core.appender.FileManager$FileManagerFactory.createManager(FileManager.java:429)

at org.apache.logging.log4j.core.appender.FileManager$FileManagerFactory.createManager(FileManager.java:417)

at org.apache.logging.log4j.core.appender.AbstractManager.getManager(AbstractManager.java:113)

at org.apache.logging.log4j.core.appender.OutputStreamManager.getManager(OutputStreamManager.java:114)

at org.apache.logging.log4j.core.appender.FileManager.getFileManager(FileManager.java:182)

at org.apache.logging.log4j.core.appender.FileAppender$Builder.build(FileAppender.java:96)

at org.apache.logging.log4j.core.appender.FileAppender$Builder.build(FileAppender.java:52)

at org.apache.logging.log4j.core.config.plugins.util.PluginBuilder.build(PluginBuilder.java:122)

at org.apache.logging.log4j.core.config.AbstractConfiguration.createPluginObject(AbstractConfiguration.java:1002)

at org.apache.logging.log4j.core.config.AbstractConfiguration.createConfiguration(AbstractConfiguration.java:942)

at org.apache.logging.log4j.core.config.AbstractConfiguration.createConfiguration(AbstractConfiguration.java:934)

at org.apache.logging.log4j.core.config.AbstractConfiguration.doConfigure(AbstractConfiguration.java:552)

at org.apache.logging.log4j.core.config.AbstractConfiguration.initialize(AbstractConfiguration.java:241)

at org.apache.logging.log4j.core.config.AbstractConfiguration.start(AbstractConfiguration.java:288)

at org.apache.logging.log4j.core.LoggerContext.setConfiguration(LoggerContext.java:579)

at org.apache.logging.log4j.core.LoggerContext.reconfigure(LoggerContext.java:651)

at org.apache.logging.log4j.core.LoggerContext.reconfigure(LoggerContext.java:668)

at org.apache.logging.log4j.core.LoggerContext.start(LoggerContext.java:253)

at org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:153)

at org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:45)

at org.apache.logging.log4j.LogManager.getContext(LogManager.java:194)

at org.apache.logging.log4j.LogManager.getLogger(LogManager.java:581)

at rmmdb_on_premise.testcopyfile_0_1.TestCopyFile.<clinit>(TestCopyFile.java:58)

 

2021-07-28 16:57:32,665 main ERROR Could not create plugin of type class org.apache.logging.log4j.core.appender.FileAppender for element File: java.lang.IllegalStateException: ManagerFactory [org.apache.logging.log4j.core.appender.FileManager$FileManagerFactory@458c1321] unable to create manager for [${sys:filename}] with data [org.apache.logging.log4j.core.appender.FileManager$FactoryData@11438d26] java.lang.IllegalStateException: ManagerFactory [org.apache.logging.log4j.core.appender.FileManager$FileManagerFactory@458c1321] unable to create manager for [${sys:filename}] with data [org.apache.logging.log4j.core.appender.FileManager$FactoryData@11438d26]

at org.apache.logging.log4j.core.appender.AbstractManager.getManager(AbstractManager.java:115)

at org.apache.logging.log4j.core.appender.OutputStreamManager.getManager(OutputStreamManager.java:114)

at org.apache.logging.log4j.core.appender.FileManager.getFileManager(FileManager.java:182)

at org.apache.logging.log4j.core.appender.FileAppender$Builder.build(FileAppender.java:96)

at org.apache.logging.log4j.core.appender.FileAppender$Builder.build(FileAppender.java:52)

at org.apache.logging.log4j.core.config.plugins.util.PluginBuilder.build(PluginBuilder.java:122)

at org.apache.logging.log4j.core.config.AbstractConfiguration.createPluginObject(AbstractConfiguration.java:1002)

at org.apache.logging.log4j.core.config.AbstractConfiguration.createConfiguration(AbstractConfiguration.java:942)

at org.apache.logging.log4j.core.config.AbstractConfiguration.createConfiguration(AbstractConfiguration.java:934)

at org.apache.logging.log4j.core.config.AbstractConfiguration.doConfigure(AbstractConfiguration.java:552)

at org.apache.logging.log4j.core.config.AbstractConfiguration.initialize(AbstractConfiguration.java:241)

at org.apache.logging.log4j.core.config.AbstractConfiguration.start(AbstractConfiguration.java:288)

at org.apache.logging.log4j.core.LoggerContext.setConfiguration(LoggerContext.java:579)

at org.apache.logging.log4j.core.LoggerContext.reconfigure(LoggerContext.java:651)

at org.apache.logging.log4j.core.LoggerContext.reconfigure(LoggerContext.java:668)

at org.apache.logging.log4j.core.LoggerContext.start(LoggerContext.java:253)

at org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:153)

at org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:45)

at org.apache.logging.log4j.LogManager.getContext(LogManager.java:194)

at org.apache.logging.log4j.LogManager.getLogger(LogManager.java:581)

at rmmdb_on_premise.testcopyfile_0_1.TestCopyFile.<clinit>(TestCopyFile.java:58)

 

2021-07-28 16:57:32,683 main ERROR Unable to invoke factory method in class org.apache.logging.log4j.core.appender.FileAppender for element File: java.lang.IllegalStateException: No factory method found for class org.apache.logging.log4j.core.appender.FileAppender java.lang.IllegalStateException: No factory method found for class org.apache.logging.log4j.core.appender.FileAppender

at org.apache.logging.log4j.core.config.plugins.util.PluginBuilder.findFactoryMethod(PluginBuilder.java:234)

at org.apache.logging.log4j.core.config.plugins.util.PluginBuilder.build(PluginBuilder.java:134)

at org.apache.logging.log4j.core.config.AbstractConfiguration.createPluginObject(AbstractConfiguration.java:1002)

at org.apache.logging.log4j.core.config.AbstractConfiguration.createConfiguration(AbstractConfiguration.java:942)

at org.apache.logging.log4j.core.config.AbstractConfiguration.createConfiguration(AbstractConfiguration.java:934)

at org.apache.logging.log4j.core.config.AbstractConfiguration.doConfigure(AbstractConfiguration.java:552)

at org.apache.logging.log4j.core.config.AbstractConfiguration.initialize(AbstractConfiguration.java:241)

at org.apache.logging.log4j.core.config.AbstractConfiguration.start(AbstractConfiguration.java:288)

at org.apache.logging.log4j.core.LoggerContext.setConfiguration(LoggerContext.java:579)

at org.apache.logging.log4j.core.LoggerContext.reconfigure(LoggerContext.java:651)

at org.apache.logging.log4j.core.LoggerContext.reconfigure(LoggerContext.java:668)

at org.apache.logging.log4j.core.LoggerContext.start(LoggerContext.java:253)

at org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:153)

at org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:45)

at org.apache.logging.log4j.LogManager.getContext(LogManager.java:194)

at org.apache.logging.log4j.LogManager.getLogger(LogManager.java:581)

at rmmdb_on_premise.testcopyfile_0_1.TestCopyFile.<clinit>(TestCopyFile.java:58)

 

2021-07-28 16:57:32,688 main ERROR Null object returned for File in Appenders.

2021-07-28 16:57:32,707 main ERROR Unable to locate appender "File" for logger config "root"

 

The job then continue and execute till the end correctly. Do you also have the same error ? and how do I avoid it ?

gjeremy1617088143

you use [${sys:filename}] instead of "${sys:TalendJob.log}"

"${sys:TalendJob.log}" is one of the only variable wich is set before the creation of the log4j appenders and logger

 

filename will be created after so it crash

DBOUAKKAZ
Contributor
Contributor
Author

Thank you so much for your help. Now it works perfectly.

Also, is there some documentation on this ? this is my first time using log4j in Talend and I didn't find anything about the "TalendJob.log"

gjeremy1617088143

I search in the java code of a talend project.

the first thing that talend do is :

System.setProperty("TalendJob.log", "yourjobname.log");

then it create the logger

 

gjeremy1617088143

I'm French : j'espere que Talend va reduire le retard des trains 😉