How to configure Database Appender for logging purposes to OpenNCP

In order to easily capture the needed transaction messages from epsos-client-connector, epsos-ws-server, openncp portal you can easily configure a database appender in these components. We describe how to in the following steps:

  1. Create a table (i.e. OpenNCP_LOGS) in one database (i.e. named LOGS) using the following script:

    CREATE TABLE IF NOT EXISTS `OpenNCP_LOGS` (
      `id` bigint(20) NOT NULL AUTO_INCREMENT,
      `component` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
      `logger` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
      `priority` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
      `message` longtext COLLATE utf8_unicode_ci NOT NULL,
      `stacktrace` text COLLATE utf8_unicode_ci,
      `creationTime` datetime NOT NULL,
      `ip` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
      PRIMARY KEY (`id`),
      KEY `priority` (`priority`),
      KEY `creationTime` (`creationTime`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;
  2. Configure epsos-client-connector log4j.properties (located under webapps/epsos-client-connector/WEB-INF/classes/log4j.properties). You can capture all XCPC, XCA, XDR messages

    # Set root category priority to INFO and its only appender to CONSOLE.
    log4j.rootLogger=INFO, Stdout
    # Roll-over the log once per day
    log4j.appender.Stdout=org.apache.log4j.ConsoleAppender
    log4j.appender.Stdout.layout=org.apache.log4j.PatternLayout
    # Print the date in ISO 8601 format
    log4j.appender.Stdout.layout.conversionPattern=%d [%t] %-5p %c - %m%n
    # Define the DB appender
    log4j.appender.DB.driver=com.mysql.jdbc.Driver
    log4j.appender.DB=eu.epsos.log4j.appender.DatabaseAppender
    log4j.appender.DB.URL=jdbc:mysql://localhost:3306/LOGS
    log4j.appender.DB.user=<username>
    log4j.appender.DB.password=<password>
    log4j.appender.DB.sql=INSERT INTO OpenNCP_LOGS (component, creationTime, logger, \
    priority, message, stacktrace, ip) VALUES ('NCP-B', \
    ?{d{yyyy-MM-dd HH:mm:ss}}, ?{c}, ?{p}, ?{m}, ?{stacktrace}, ?{ip})
    log4j.appender.DB.layout=org.apache.log4j.PatternLayout
    log4j.appender.DB.layout.ConversionPattern=%-5p [%d{yyyy-MM-dd HH:mm:ss}] %C{1}: %m (%F:%L, %t)%n
    
    
    # Specific log Levels
    log4j.logger.eu.epsos.pt.cc=DEBUG,DB
    log4j.logger.tr.com.srdc.epsos=DEBUG,DB
    log4j.logger.epsos.ccd.gnomon.configmanager=DEBUG
    log4j.logger.epsos.ccd.gnomon.auditmanager=DEBUG
    log4j.logger.epsos.ccd.posam=DEBUG
    log4j.logger.org.hibernate=ERROR
    log4j.logger.org.apache.axis2=ERROR
    log4j.logger.com.mchange=ERROR
    log4j.logger.com.spirit.epsos.cc.adc=ERROR
    log4j.logger.eu.epsos.pt.eadc=ERROR
    log4j.logger.epsos.ccd.posam=ERROR
    
    
  3. Configure epsos-ws-server log4j.xml (located under webapps/epsos-ws-server/WEB-INF/classes/log4j.xml). You can capture all XCPC, XCA, XDR messages

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
    
    <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="false">
        <appender name="LOGFILE" class="org.apache.log4j.DailyRollingFileAppender">
            <param name="File" value="${catalina.base}/logs/epsos-srdc.log" />
            <param name="DatePattern" value="'.'yyyy-MM-dd"/>
            <param name="Append" value="true"/>
            <param name="Threshold" value="DEBUG"/>
            <param name="Encoding" value="UTF-8"/>
            <layout class="org.apache.log4j.PatternLayout">
                <param name="ConversionPattern" value="%-5p %d %c %M.%L %x - %m\n"/>
            </layout>
        </appender>
    
    
        <appender name="DB" class="eu.epsos.log4j.appender.DatabaseAppender">
            <param name="URL" value="jdbc:mysql://localhost/LOGS" />
            <param name="driver" value="com.mysql.jdbc.Driver" />
            <param name="user" value="<username>" />
            <param name="password" value="<password>" />
            <param name="sql"
                value="INSERT INTO OpenNCP_LOGS (component, creationTime, logger, \
    priority, message, stacktrace, ip) VALUES ('NCP-A', \
    ?{d{yyyy-MM-dd HH:mm:ss}}, ?{c}, ?{p}, ?{m}, ?{stacktrace}, ?{ip})" />
        </appender>
    
    
       <appender name="console" class="org.apache.log4j.ConsoleAppender">
            <param name="Target" value="System.out"/>
            <layout class="org.apache.log4j.PatternLayout">
                <param name="ConversionPattern" value="%-4r %-5p %c %M.%L %x - %m\n"/>
            </layout>
        </appender>
        <logger name="org.apache.axis2">
            <level value="error"/>
        </logger>
        <logger name="org.apache.axiom">
            <level value="error"/>
        </logger>
        <logger name="org.apache.xml">
            <level value="error"/>
        </logger>
        <logger name="org.opensaml">
            <level value="error"/>
        </logger>
        <logger name="org.springframework">
            <level value="error"/>
        </logger>
        <logger name="org.hibernate">
            <level value="error"/>
        </logger>
        <logger name="net.sf.ehcache">
            <level value="error"/>
        </logger>
    
    
        <logger name="epsos.ccd.posam.tm">
            <level value="info"/>
        </logger>
        <logger name="epsos.ccd.posam.tsam">
            <level value="info"/>
        </logger>
        <logger name="de.hunsicker.jalopy.io">
            <level value="fatal"/>
        </logger>
        <logger name="httpclient.wire.header">
            <level value="fatal"/>
        </logger>
        <logger name="org.apache.commons.httpclient">
            <level value="fatal"/>
        </logger>
        <logger name="org.apache.commons.configuration">
            <level value="error"/>
        </logger>
        <logger name="com.mchange">
            <level value="warn"/>
        </logger>
        <logger name="_2009.xcpd.iti.ihe">
            <level value="debug"/>
            <appender-ref ref="DB"/>
        </logger>
       <logger name="_2007.xds_b.iti.ihe">
            <level value="debug"/>
            <appender-ref ref="DB"/>
        </logger>
    
    
       <logger name="eu.epsos.protocolterminators.ws.server.xca.impl">
            <level value="debug"/>
            <appender-ref ref="DB"/>
        </logger>
        <root>
            <priority value ="debug" />
            <appender-ref ref="LOGFILE"/>
        </root>
    </log4j:configuration>
    
    
  4. Configure openncp portal (located under webapss/epsosportal/WEB-INF/classes/log4j.xml). You can capture:
    1. HCPA
    2. TRCA
    3. Consent Documents (CDA Format)
    4. Dispensation Documents (CDA Format)
    5. ePrescription Documents (CDA Format)
    6. Patient Summary Documents (CDA Format)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">


<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="false">
    <appender name="LOGFILE" class="org.apache.log4j.DailyRollingFileAppender">
        <param name="File" value="${catalina.base}/logs/portal.log" />
        <param name="DatePattern" value="'.'yyyy-MM-dd"/>
        <param name="Append" value="true"/>
        <param name="Threshold" value="INFO"/>
        <param name="Encoding" value="UTF-8"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%-5p %d %c %M.%L %x - %m\n"/>
        </layout>
    </appender>

    <appender name="DB" class="eu.epsos.log4j.appender.DatabaseAppender">
        <param name="URL" value="jdbc:mysql://localhost/LOGS" />
        <param name="driver" value="com.mysql.jdbc.Driver" />
        <param name="user" value="<username>" />
        <param name="password" value="<password>" />
        <param name="sql"
            value="INSERT INTO OpenNCP_LOGS (component, creationTime, logger, \
priority, message, stacktrace, ip) VALUES ('Portal', \
?{d{yyyy-MM-dd HH:mm:ss}}, ?{c}, ?{p}, ?{m}, ?{stacktrace}, ?{ip})" />
    </appender>
    <appender name="console" class="org.apache.log4j.ConsoleAppender">
        <param name="Target" value="System.out"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%-4r %-5p %c %M.%L %x - %m\n"/>
        </layout>
    </appender>
     <logger name="com.gnomon.epsos.servlet">
        <level value="INFO"/>
        <appender-ref ref="DB"/>
    </logger>
   <logger name="com.gnomon.epsos.service">
        <level value="INFO"/>
        <appender-ref ref="DB"/>
    </logger>
    <root>
        <priority value ="debug" />
        <appender-ref ref="LOGFILE"/>
    </root>
</log4j:configuration>
                                                                                                                               70,9          Bot

You should use also different tables for each component to keep seperate the log messages. Also you can easily adapt this to any other epsos component needed.