Please see 
https://stackoverflow.com/questions/61270801/slf4j-log4j-how-to-use-a-new-output-file-for-each-logger-where-the-file-name-is/61276705#61276705
 
<https://stackoverflow.com/questions/61270801/slf4j-log4j-how-to-use-a-new-output-file-for-each-logger-where-the-file-name-is/61276705#61276705>
 and see if the solution provided there works for you.

Ralph

> On Apr 28, 2020, at 6:08 AM, Kamatnurkar, Praveen 
> <praveen.kamatnur...@siemens.com> wrote:
> 
> Hi
> We have an application that sends packages from one s/w to another. Each data 
> package has a unique id.
> 
> We have following requirements
> 
>  1.  For each package transfer different log files should be created.
>  2.  The log file name  should be appended by unique id
>  3.  All the logs that are generated in the transfer of each package should 
> be written in that package specific log file.
> 
> We are open to customize the logger code-fully. We tried some tricks by 
> creating own appenders, LoggerConfig etc but it's not giving desired output.
> 
> Following snippet gives an basic idea what we tried but not successful. All 
> the logs are going in a single file.
> 
> /*
>     * This method gets the logger for a given exchange. If the logger file 
> already exists then it will just get it otherwise it will
>     * create a new logger for that exchange, add the appender for that, and 
> return it.
>     */
>    public static Logger getExchangeLogger( Class CLASS_NAME )
>    {
>        try
>        {
> 
>            if ( !enableExchangeLevelLogging )
>            {
>                return LogManager.getLogger( CLASS_NAME );
>            }
> 
>            if ( ThreadContext.getParameterMap() != null )
>            {
>                String uniqueID = (String) 
> ThreadContext.getParameterMap().get( CommonConstant.EXCHANGE_ID_FOR_LOGGER );
> 
>                if ( uniqueID != null && !uniqueID.isEmpty() )
>                {
>                    Logger exchangeLogger = null;
>                    String logDirName = System.getProperty( "user.dir" ) + 
> File.separator + "log";
>                    String fileNameWithoutExt = "application_" + uniqueID;
>                    String fileName = fileNameWithoutExt + ".log";
>                    String fullpath = logDirName + File.separator + fileName;
>                    File logFilePath = new File( fullpath );
> 
>                    if ( !logFilePath.exists() )
>                    {
>                        File logFileLoc = new File( logDirName );
>                        if ( !logFileLoc.exists() )
>                        {
>                            logFileLoc.mkdir();
>                        }
>                    }
> 
>                    exchangeLogger = getConfigExchangeLogger( CLASS_NAME, 
> fullpath, fileNameWithoutExt );
>                    return exchangeLogger;
> 
>                }
>                else
>                {
>                    return LogManager.getLogger( CLASS_NAME );
>                }
>            }
>            else
>            {
>                return LogManager.getLogger( CLASS_NAME );
>            }
>        }
>        catch ( Exception e )
>        {
>            log.info( "error occurred while getting exchange logger: " + 
> e.getMessage() );
>        }
>        return LogManager.getLogger( CLASS_NAME );
>    }
> 
>    /**
>     * Get the logger for specified class.
>     * @param cls
>     * @param fullpath
>     * @param fileName
>     * @return
>     */
>    private static Logger getConfigExchangeLogger( Class cls, String fullpath, 
> String fileName )
>    {
>        String className = cls.getName();
>        final Class<?> clazz = StackLocatorUtil.getCallerClass( cls );
>        LoggerContext context = null;
>        if ( clazz != null )
>        {
>            context = (org.apache.logging.log4j.core.LoggerContext) 
> LogManager.getContext( clazz.getClassLoader(), false );
>        }
>        else
>        {
>            context = (org.apache.logging.log4j.core.LoggerContext) 
> LogManager.getContext( false );
>        }
> 
>        Configuration conf = context.getConfiguration();
> 
>        Appender appender = conf.getAppender( EXCHANGE_LOGGER_APPENDER_NAME + 
> fileName );
> 
>        if ( appender == null )
>        {
>            appender = getFileAppender( fullpath, fileName, conf );
>            conf.addAppender( appender );
>        }
> 
>        LoggerConfig loggerConfig = conf.getLoggerConfig( className );
>        if ( loggerConfig == null )
>        {
>            System.out.println( "Creating loginConfig for class " + className 
> );
>            updateLoggers( className, conf, appender, context );
>        }
>        else
>        {
>            // if the appender is different then update the loggers with new 
> appender
>            if ( !loggerConfig.getAppenders().containsValue( appender ) )
>            {
>                // System.out.println( "Appenders are different for classname 
> " + className + " so updating loggers " + fileName );
>                updateLoggers( className, conf, appender, context );
>            }
>            if ( !loggerConfig.getName().equals( className ) )
>            {
>                updateLoggers( className, conf, appender, context );
>            }
>        }
> 
>        Logger log = LogManager.getLogger( cls );
> 
>        return log;
>    }
> 
>    /**
>     * Creates anew logger configuration and set this to logger's appender and 
> appender reference.
>     * @param classname
>     * @param conf
>     * @param appender
>     * @param context TODO
>     */
>    private static void updateLoggers( String classname, Configuration conf, 
> Appender appender, LoggerContext context )
>    {
>        Logger exchLogger = LogManager.getLogger( EventExchangeLogger.class );
>        Level exchangeLogLevel = exchLogger.getLevel();
>        AppenderRef ref = AppenderRef.createAppenderRef( "File", 
> exchangeLogLevel, null );
>        AppenderRef[] refs = new AppenderRef[] {ref};
>        LoggerConfig loggerConfig = LoggerConfig.createLogger( false, 
> exchangeLogLevel, exchLogger.getName(), "true", refs, null, conf,
>                null );
>        loggerConfig.addAppender( appender, exchangeLogLevel, null );
> 
>        conf.addLogger( classname, loggerConfig );
> 
>        context.updateLoggers();
> 
>    }
> 
>    /**
>     * Get the Rolling file appender specific to the exchange logger.
>     * @param fullpath
>     * @param fileName
>     * @param conf
>     * @return
>     */
>    private static RollingFileAppender getFileAppender( String fullpath, 
> String fileName, Configuration conf )
>    {
>        PatternLayout.Builder layoutBuilder = PatternLayout.newBuilder();
>        layoutBuilder.withConfiguration( conf );
>        layoutBuilder.withPattern( "%d{ISO8601} | %-5p | %c{1}:%L %m%ex%n" );
> 
>        RollingFileAppender.Builder rollingFileAppenderBuilder = 
> RollingFileAppender.newBuilder();
>        rollingFileAppenderBuilder.setLayout( layoutBuilder.build() );
>        rollingFileAppenderBuilder.withFileName( fullpath );
>        rollingFileAppenderBuilder.withFilePattern( fileName + "-%i.log" );
>        rollingFileAppenderBuilder.setName( EXCHANGE_LOGGER_APPENDER_NAME + 
> fileName );
>        rollingFileAppenderBuilder.setConfiguration( conf );
>        rollingFileAppenderBuilder.withImmediateFlush( true );
>        rollingFileAppenderBuilder.withAppend( true );
> 
>        SizeBasedTriggeringPolicy policy = 
> SizeBasedTriggeringPolicy.createPolicy( "10MB" );
>        rollingFileAppenderBuilder.withPolicy( policy );
> 
>        RollingFileAppender rollAppender = rollingFileAppenderBuilder.build();
> 
>        DefaultRolloverStrategy.Builder builder = 
> DefaultRolloverStrategy.newBuilder();
>        builder.withMax( "5" );
>        builder.withConfig( conf );
> 
>        DefaultRolloverStrategy strategy = builder.build();
> 
>        rollAppender.getManager().setRolloverStrategy( strategy );
> 
>        rollAppender.start();
>        return rollAppender;
>    }
> 
> 
> 
> Any pointer how to achieve this requirement?
> 
> Regards
> Praveen
> 

Reply via email to