I was trying to do the same thing, and am really surprised to find no examples anywhere for JDBCAppender properties configuration.

What I did discover, since I'm using PAX logging under OSGI, I can refer to an XML config file by setting org.ops4j.logging.log4j2.config.file. Having got that to work, I've now gone back and figured out the properties approach, so I think this is what you are looking for:

appender.file.type = File
appender.file.name = fileAppender
appender.file.fileName = verdi.log
appender.file.layout.type = PatternLayout
appender.file.layout.pattern = %d{YYYY-mm-dd HH:mm:ss.SSS} %-5p %c{1} - %m %n

appender.out.type = Console
appender.out.name = out
appender.out.layout.type = PatternLayout
appender.out.layout.pattern = %d{YYYY-mm-dd HH:mm:ss.SSS} %-5p %c{1} - %m %n

appender.db.type = Jdbc
appender.db.name = dbAppender
appender.db.tableName = LOGGING.APPLICATION_LOG
appender.db.cf.type = ConnectionFactory
appender.db.cf.class = log4j_tutorial.ConnectionFactory
appender.db.cf.method = getDatabaseConnection
appender.db.col1.type = Column
appender.db.col1.name = EVENT_DATE
appender.db.col1.isEventTimestamp = true
appender.db.col2.type = Column
appender.db.col2.name = LEVEL
appender.db.col2.pattern = %level
appender.db.col3.type = Column
appender.db.col3.name = LOGGER
appender.db.col3.pattern = %logger
appender.db.col4.type = Column
appender.db.col4.name = MESSAGE
appender.db.col4.pattern = %message
appender.db.col5.type = Column
appender.db.col5.name = THROWABLE
appender.db.col5.pattern = %ex{full}

rootLogger.level = INFO
rootLogger.appenderRef.file.ref = fileAppender
rootLogger.appenderRef.out.ref = out
rootLogger.appenderRef.db.ref = dbAppender

I haven't tried this exact config, since I'm using a DataSource rather than a ConnectionFactory, but I think that this should work in theory. I hope it helps.

EDIT: Add datasource definition lines as requested if datasource is required rather than connection factory:

appender.db.datasource.type = DataSource
appender.db.jndiName = osgi:service/dsName
Answer from Screwtape on Stack Overflow
🌐
Appspot
log4j-props2xml.appspot.com
Log4J Properties to XML Converter
Log4J Properties Converter Web Application v1.2.
🌐
GitHub
github.com › jroyals › log4j-properties-converter
GitHub - jroyals/log4j-properties-converter: Convert log4j.properties to log4j.xml.
By far the easiest way to is to use the Log4J to Properties web application at http://log4jprops2xml.royals.net.au. Paste your config into this web app, and it gives you back your file in XML format.
Starred by 37 users
Forked by 8 users
Languages   Java 72.2% | CSS 12.9% | HTML 12.3% | Shell 1.5% | Batchfile 1.1% | Java 72.2% | CSS 12.9% | HTML 12.3% | Shell 1.5% | Batchfile 1.1%
🌐
Logback
logback.qos.ch › translator
log4j.properties Translator - Logback
This service allows you to transform logback.xml files into canonical or standard form. The resulting logback.xml file targets logback version 1.3.0 or later. Note that both logback 1.3 and 1.4 support 1.2 configuration files without change. ... This service allows you to transform logback.xml ...
Top answer
1 of 2
4

I was trying to do the same thing, and am really surprised to find no examples anywhere for JDBCAppender properties configuration.

What I did discover, since I'm using PAX logging under OSGI, I can refer to an XML config file by setting org.ops4j.logging.log4j2.config.file. Having got that to work, I've now gone back and figured out the properties approach, so I think this is what you are looking for:

appender.file.type = File
appender.file.name = fileAppender
appender.file.fileName = verdi.log
appender.file.layout.type = PatternLayout
appender.file.layout.pattern = %d{YYYY-mm-dd HH:mm:ss.SSS} %-5p %c{1} - %m %n

appender.out.type = Console
appender.out.name = out
appender.out.layout.type = PatternLayout
appender.out.layout.pattern = %d{YYYY-mm-dd HH:mm:ss.SSS} %-5p %c{1} - %m %n

appender.db.type = Jdbc
appender.db.name = dbAppender
appender.db.tableName = LOGGING.APPLICATION_LOG
appender.db.cf.type = ConnectionFactory
appender.db.cf.class = log4j_tutorial.ConnectionFactory
appender.db.cf.method = getDatabaseConnection
appender.db.col1.type = Column
appender.db.col1.name = EVENT_DATE
appender.db.col1.isEventTimestamp = true
appender.db.col2.type = Column
appender.db.col2.name = LEVEL
appender.db.col2.pattern = %level
appender.db.col3.type = Column
appender.db.col3.name = LOGGER
appender.db.col3.pattern = %logger
appender.db.col4.type = Column
appender.db.col4.name = MESSAGE
appender.db.col4.pattern = %message
appender.db.col5.type = Column
appender.db.col5.name = THROWABLE
appender.db.col5.pattern = %ex{full}

rootLogger.level = INFO
rootLogger.appenderRef.file.ref = fileAppender
rootLogger.appenderRef.out.ref = out
rootLogger.appenderRef.db.ref = dbAppender

I haven't tried this exact config, since I'm using a DataSource rather than a ConnectionFactory, but I think that this should work in theory. I hope it helps.

EDIT: Add datasource definition lines as requested if datasource is required rather than connection factory:

appender.db.datasource.type = DataSource
appender.db.jndiName = osgi:service/dsName
2 of 2
3

I was trying to do the same and got this solution. 1. Create connectionFactory.java file

import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

import javax.sql.DataSource;

import org.apache.commons.dbcp.DriverManagerConnectionFactory;
import org.apache.commons.dbcp.PoolableConnectionFactory;
import org.apache.commons.dbcp.PoolingDataSource;
import org.apache.commons.pool.impl.GenericObjectPool;

public class ConnectionFactory {

    private static interface Singleton {
        final ConnectionFactory INSTANCE = new ConnectionFactory();
    }
    private final DataSource dataSource;

    private ConnectionFactory() {
        Properties properties = new Properties();
        properties.setProperty("user", "aabsUser");
        properties.setProperty("password", "aj12fk18");

        GenericObjectPool pool = new GenericObjectPool();
        DriverManagerConnectionFactory connectionFactory = new DriverManagerConnectionFactory(
                "jdbc:mysql://localhost:3306/aabs", properties);
        new PoolableConnectionFactory(connectionFactory, pool, null,
                "SELECT 1", 3, false, false,
                Connection.TRANSACTION_READ_COMMITTED);

        this.dataSource = new PoolingDataSource(pool);
    }

    public static Connection getDatabaseConnection() throws SQLException {
        return Singleton.INSTANCE.dataSource.getConnection();
    }
}

2. make Entries in Log4j2.properties

name=PropertiesConfig
appenders=db
appender.db.type = Jdbc
appender.db.name = MySQLDatabase

# replace databaseName.tableName
appender.db.tableName =databaseName.tableName
appender.db.cf.type = ConnectionFactory

# change class path and method name
appender.db.cf.class = com.log4j2demo.ConnectionFactory
appender.db.cf.method = getDatabaseConnection
# define column type, column name and value
appender.db.col2.type = Column
appender.db.col2.name = DATE
appender.db.col2.isEventTimestamp = true

appender.db.col3.type = Column
appender.db.col3.name = LOG_LEVEL
appender.db.col3.pattern = %p

appender.db.col4.type = Column
appender.db.col4.name = FILE
appender.db.col4.pattern = %F

#Initialize logger
loggers=db
logger.db.name=com.log4j2demo.Demo
logger.db.level = All
logger.db.appenderRefs.db.ref = MySQLDatabase

#Initialize rootLogger
rootLogger.level =info
rootLogger.appenderRefs = db
rootLogger.appenderRef.db.ref = MySQLDatabase

3. Implement Logger

import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class Demo {

    private static Logger log = LogManager.getLogger();

    public static void main(String[] args) throws InterruptedException {
        log.trace("Entering application.");
        log.trace("Trace.");
        for (int i = 0; i < 10; i++) {
            log.info("Testing Lof For DB");
        }
        log.debug("Debug.");
        log.fatal("Fatal.");
        log.log(Level.WARN, "Warn");
        int a, b, c;
        a = 1;
        b = 0;
        try {
            c = a / b;
            log.info("vale of c" + c);
        } catch (Exception e) {
            log.error("error occur>>" + e);
        }
    }

}
🌐
Experts Exchange
experts-exchange.com › questions › 21996980 › Convert-log4j-xml-to-log4j-properties.html
Solved: Convert log4j.xml to log4j.properties | Experts Exchange
September 20, 2006 - How to convert the follwing into a log4j.peoperties file <appender name="Simulator-JMS" class="com.MyAppenders.JMS
Top answer
1 of 5
21

I needed to do this as well, but couldn't find a tool. Migrating by hand dozens of log4j.properties was not a palatable option. So, I bashed together a tool that can do it and released it for others to use.

http://code.google.com/p/log4j-properties-converter/

It's a bit rough but did the trick for the log4j properties I gave it, so any problems log them on the issue tracker. Hope you find it useful.

2 of 5
4

Here is something that may help you. Ceki Gülcü, the creator of log4j, started another logger project named logback, and he provides an online translator for log4j.properties files to xml config files for logback. It looks like the configuration file schemas of log4j.xml and logback.xml are pretty close.

At least it should produce something that can easily be converted to the log4j.xml format.

For your convenience: here's a sample log4j.properties file from the log4j documentation. Just paste it into the translator and check the output:

log4j.rootLogger=debug, stdout, R

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

# Pattern to output the caller's file name and line number.
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n

log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=example.log

log4j.appender.R.MaxFileSize=100KB
# Keep one backup file
log4j.appender.R.MaxBackupIndex=1

log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n
🌐
GitHub
github.com › balent › Log4j-Convert-Configuration
GitHub - balent/Log4j-Convert-Configuration: Convert Log4j configuration from properties to xml and vice versa
Convert Log4j configuration from properties to xml and vice versa - balent/Log4j-Convert-Configuration
Starred by 6 users
Forked by 2 users
Languages   Java 99.8% | Shell 0.2% | Java 99.8% | Shell 0.2%
Find elsewhere
🌐
Keithkim
blog.keithkim.com › 2012 › 08 › log4j-properties-file-to-xml-converter.html
Keith Kim : log4j properties file to XML converter
I had to convert log4j.properties file to log4j.xml -- and found this tool (saves time): http://code.google.com/p/log4j-properties-converter/ For logback, use this tool: http://logback.qos.ch/translator/ Email ThisBlogThis!Share to XShare to FacebookShare to Pinterest ·
Top answer
1 of 1
6

I didn't find tool that would translate log4j.properties file into log4j2.xml but manual translation ended up being quite simple.

Example for loggers:

log4j.additivity.com.exm.tst.audit.config.auditors.TransactionAuditor=false
log4j.logger.com.exm.tst.audit.config.auditors.TransactionAuditor=ERROR, FILE

Will become:

<Logger name="com.exm.tst.audit.config.auditors.TransactionAuditor" 
   additivity="false" level="ERROR">
   <appender-ref ref="FILE"/>
</Logger>

Example for appenders:

log4j.appender.FILE=org.apache.log4j.RollingFileAppender
log4j.appender.FILE.File=${catalina.base}/logs/application.log
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%t] %-5p - %m%n
log4j.appender.FILE.MaxFileSize=100000KB
log4j.appender.FILE.MaxBackupIndex=5

Will become:

<RollingFile name="FILE" fileName="${sys:catalina.home}/logs/application.log"
    filePattern="${sys:catalina.home}/logs/application.%i.log.gz" >
    <PatternLayout pattern="${LOG_PATTERN}"/>
    <Policies>
        <SizeBasedTriggeringPolicy size="10000KB" />
    </Policies>
    <DefaultRolloverStrategy max="5"/>
</RollingFile>

So entire log4j2.xml file based on this example should look like this:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" monitorInterval="30">
 
    <!-- Logging Properties -->
    <Properties>
        <Property name="LOG_PATTERN">%d{yyyy-MM-dd HH:mm:ss} [%t] %-5p - %m%n</Property>
    </Properties>
     
    <Appenders>
         
        <RollingFile name="FILE" fileName="${sys:catalina.home}/logs/application.log"
            filePattern="${sys:catalina.home}/logs/application.%i.log.gz" >
            <PatternLayout pattern="${LOG_PATTERN}"/>
            <Policies>
                <SizeBasedTriggeringPolicy size="10000KB" />
            </Policies>
            <DefaultRolloverStrategy max="5"/>
        </RollingFile>
         
    </Appenders>
 
    <Loggers>
     
        <Logger name="com.exm.tst.audit.config.auditors.TransactionAuditor" 
           additivity="false" level="ERROR">
           <appender-ref ref="FILE"/>
        </Logger>
 
    </Loggers>
 
</Configuration>
🌐
YouTube
youtube.com › watch
How to set up log4j configuration with XML and properties - YouTube
We look into how to set up log4j configuration with XML and properties. XML is pretty simple to configure, and properties are similar in structure but might ...
Published   July 18, 2021
🌐
DigitalOcean
digitalocean.com › community › tutorials › log4j-properties-file-example
log4j.properties File Example | DigitalOcean
August 4, 2022 - Additivity usage is shown in above logger xml configuration, it’s the attribute of logger element. Below is the way to use it in log4j properties file configuration as log4j.additivity.{logger_name}.
Top answer
1 of 2
5

I recommend read official docs. But in your case:

# Root logger option
log4j.rootLogger=INFO, file, stdout

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n%c{1}:%L - %m%n

log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.rollingPolicy=org.apache.log4j.rolling.TimeBasedRollingPolicy
log4j.appender.file.rollingPolicy.FileNamePattern=/logs/logging-%d{yyyy-MM-dd}.log
log4j.appender.file.ImmediateFlush=true
log4j.appender.file.Append=true
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n%c{1}:%L - %m%n
2 of 2
0

how would I convert?

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

<configuration>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <filter class="ch.qos.logback.core.filter.EvaluatorFilter">
            <evaluator>
                <expression>return message.contains("LLDC");    </expression>
            </evaluator>
            <OnMatch>DENY</OnMatch>
        </filter>
    </appender>

    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <file>/etc/ccp/lldc/applogs/lldc.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>lldc-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <maxFileSize>10MB</maxFileSize>
            <maxHistory>30</maxHistory>
            <totalSizeCap>400MB</totalSizeCap>
        </rollingPolicy>
        <filter class="ch.qos.logback.core.filter.EvaluatorFilter">
            <evaluator> <!-- Default is ch.qos.logback.classic.boolex.JaninoEventEvaluator -->
                <expression>return message.contains("LLDC");    </expression>
            </evaluator>
            <OnMatch>ACCEPT</OnMatch>
            <OnMismatch>DENY</OnMismatch>
        </filter>
        <encoder>
            <pattern>%msg%n</pattern>
        </encoder>
    </appender>

    <logger name="lldc" level="INFO" additivity="false">
        <appender-ref ref="FILE"/>
    </logger>

    <root level="INFO">
        <appender-ref ref="FILE" />
        <appender-ref ref="STDOUT" />
    </root>
</configuration>
🌐
Stack Overflow
stackoverflow.com › questions › 34938868 › how-to-convert-my-xml-code-to-log4j-properties
java - How to convert my XML code to Log4j.properties? - Stack Overflow
<appender name="ErrorEmailAppender" class="org.apache.log4j.net.SMTPAppender"> <param name="SMTPHost" value="mail.mydomain.com" /> <param name="SMTPUsername" value="myuser@mydomain.com" /> <param name="SMTPPassword" value="password" /> <param name="From" value="myuser@mydomain.com" /> <param name="To" value="myuser@mydomain.com" /> <param name="Subject" value="Log of messages" /> <param name="BufferSize" value="1" /> <param name="EvaluatorClass" value="TriggerLogEvent" /> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%t %m%n"/> </layout> </appender> <logger name="com.foo.mailer"> <level value="INFO" /> <appender-ref ref="ErrorEmailAppender"/> </logger>
Top answer
1 of 1
3

For Log4j2, you can use this dependency :

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>

Also in the properties section of your pom.xml, you must specify the latest log4j2 version in which the vulnerability is fixed, i.e.

<properties>
    <log4j2.version>2.17.0</log4j2.version>
</properties>

And this is my log4j2.xml :

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
    <Properties>
        <Property name="LOG_PATTERN">%d{yyyy-MM-dd HH:mm:ss.SSS} %-5p %c:%L - %m%n
        </Property>
        <Property name="LOG_DIR">@log.dir@/@app.name@</Property>
        <Property name="APP_NAME">@app.name@</Property>
    </Properties>
    <Appenders>
        <Console name="Console">
            <PatternLayout pattern="${LOG_PATTERN}" />
        </Console>
        <RollingFile name="rollingFileLogger"
            fileName="${LOG_DIR}/${APP_NAME}.log"
            filePattern="${LOG_DIR}/${APP_NAME}-%d{yyyy-MM-dd}.log">
            <PatternLayout pattern="${LOG_PATTERN}" />
            <Policies>
                <TimeBasedTriggeringPolicy />
            </Policies>
        </RollingFile>
    </Appenders>
    <Loggers>
        <Logger name="com.myorg" level="info">
            <AppenderRef ref="rollingFileLogger" />
        </Logger>
        <Root level="info">
            <AppenderRef ref="Console" />
        </Root>
    </Loggers>
</Configuration>

The @log.dir@ and @app.name@ are the placeholders for actual values from my application.properties file.

To use log4j2.properties instead of log4j2.xml, sample :

status = warn
name= com.myorg

# Log files location
property.basePath = @log.dir@/@app.name@

# RollingFileAppender name, pattern, path and rollover policy
appender.rolling.type = RollingFile
appender.rolling.name = fileLogger
appender.rolling.fileName= "${basePath}/${APP_NAME}.log"
appender.rolling.filePattern= ${basePath}/app_%d{yyyyMMdd}.log
appender.rolling.layout.type = PatternLayout
appender.rolling.layout.pattern = %d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
appender.rolling.policies.type = Policies
appender.rolling.policies.time.type = TimeBasedTriggeringPolicy

# Console appender configuration
appender.console.type = Console
appender.console.name = consoleLogger
appender.console.layout.type = PatternLayout
appender.console.layout.pattern = %d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

# Configure root logger
rootLogger.level = info
rootLogger.appenderRef.rolling.ref = fileLogger