| securis/etc/build/files/README | patch | view | blame | history | |
| securis/etc/build/files/config/log4j2.xml | patch | view | blame | history | |
| securis/etc/build/files/config/securis-server.properties | patch | view | blame | history | |
| securis/etc/build/files/securis-server.bat | patch | view | blame | history | |
| securis/etc/build/files/securis-server.sh | patch | view | blame | history | |
| securis/etc/build/pro/mvn_descriptor.xml | patch | view | blame | history | |
| securis/pom.xml | patch | view | blame | history | |
| securis/src/main/java/net/curisit/securis/MainApp.java | patch | view | blame | history | |
| securis/src/main/java/net/curisit/securis/SeCurisServer.java | patch | view | blame | history | |
| securis/src/main/resources/log4j2.xml | patch | view | blame | history |
securis/etc/build/files/README
.. .. @@ -0,0 +1,10 @@ 1 +SeCuris server2 +==============3 +4 +Updated doc: https://redmine.curistec.com/projects/securis/wiki/HowToSeCurisClient5 +6 +Creation of a request file7 +For a manual activation, a request file should be sent to SeCuris administrator, to create a request file we can execute:8 +9 + $ ./securis-server.sh start10 +securis/etc/build/files/config/log4j2.xml
.. .. @@ -0,0 +1,42 @@ 1 +<?xml version="1.0" encoding="UTF-8"?>2 +<Configuration>3 + <Appenders>4 +5 + <RollingFileAppender name="defaultFile" fileName="${sys:user.home}/.SeCuris/logs/securis-server.log" append="true"6 + filePattern="${sys:user.home}/.SeCuris/logs/securis-server-%d{yyyy-MM-dd-HH}.log.gz">7 + <PatternLayout pattern="%d %-5p [%t] %C{2} (%F:%L) - %m%n"/>8 + <Policies>9 + <TimeBasedTriggeringPolicy interval="1" modulate="true" />10 + </Policies>11 + <DefaultRolloverStrategy max="10"/>12 + </RollingFileAppender>13 + <Async name="defaultFileAsync" includeLocation="true">14 + <AppenderRef ref="defaultFile"/>15 + </Async>16 +17 + <Console name="stdout" target="SYSTEM_OUT">18 + <PatternLayout pattern="%d %-5p [%t] %C{2} (%F:%L) - %m%n"/>19 + </Console>20 +21 + <Console name="console" target="SYSTEM_OUT">22 + <PatternLayout pattern="%m%n"/>23 + </Console>24 +25 + </Appenders>26 + <Loggers>27 +28 + <Logger name="net.curisit" level="INFO" additivity="false">29 + <AppenderRef ref="defaultFileAsync"/>30 + <AppenderRef ref="stdout"/>31 + </Logger>32 +33 + <Logger name="console" level="INFO" additivity="false">34 + <AppenderRef ref="console"/>35 + </Logger>36 +37 + <Root level="INFO" >38 + <AppenderRef ref="stdout"/>39 + </Root>40 +41 + </Loggers>42 +</Configuration>securis/etc/build/files/config/securis-server.properties
.. .. @@ -0,0 +1,14 @@ 1 +#########################################################################2 +# #3 +# Modify the current file using the proper values for you environment #4 +# #5 +#########################################################################6 +7 +license.server.hostname = 0.0.0.08 +license.server.port = 90809 +license.server.ssl.port = 944310 +11 +ssl.keystore.path = /Users/rob/.ssh/keys/securis.pkcs1212 +ssl.keystore.type = PKCS1213 +ssl.keystore.password = curist3c14 +ssl.keystore.alias =securis/etc/build/files/securis-server.bat
.. .. @@ -0,0 +1,4 @@ 1 +@echo off2 +3 +set CLASSPATH="config;libs\*"4 +java -client -cp "%CLASSPATH%" net.curisit.securis.License %*securis/etc/build/files/securis-server.sh
.. .. @@ -0,0 +1,4 @@ 1 +#!/bin/bash2 +3 +export CLASSPATH="config:libs/*"4 +java -cp "$CLASSPATH" net.curisit.securis.SeCurisServer $@securis/etc/build/pro/mvn_descriptor.xml
.. .. @@ -0,0 +1,39 @@ 1 + <assembly2 +xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"3 +xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"4 +xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">5 + <id>packager</id>6 + <formats>7 + <format>zip</format>8 + <format>tar.gz</format>9 + </formats>10 + <includeBaseDirectory>false</includeBaseDirectory>11 + <fileSets>12 + <fileSet>13 + <directory>${basedir}/etc/build/files</directory>14 + <includes>15 + <include>**/*</include>16 + </includes>17 + <excludes>18 + <exclude>*.sh</exclude>19 + </excludes>20 + <outputDirectory>.</outputDirectory>21 + </fileSet>22 + <fileSet>23 + <directory>${basedir}/etc/build/files</directory>24 + <includes>25 + <include>*.sh</include>26 + </includes>27 + <fileMode>755</fileMode>28 + <outputDirectory>.</outputDirectory>29 + </fileSet>30 + </fileSets>31 + <dependencySets>32 + <dependencySet>33 + <outputDirectory>/libs</outputDirectory>34 + <useProjectArtifact>true</useProjectArtifact>35 + <unpack>false</unpack>36 + <scope>runtime</scope>37 + </dependencySet>38 + </dependencySets>39 +</assembly>securis/pom.xml
.. .. @@ -1,8 +1,8 @@ 1 1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 2 2 <modelVersion>4.0.0</modelVersion> 3 3 <groupId>net.curisit</groupId> 4 - <artifactId>securis</artifactId>5 - <version>0.0.1-SNAPSHOT</version>4 + <artifactId>securis-server</artifactId>5 + <version>0.0.2-SNAPSHOT</version>6 6 <name>SeCuris</name> 7 7 <description>CurisTEC Server Licenses</description> 8 8 <dependencies> .. .. @@ -62,7 +62,21 @@ 62 62 <target>1.7</target> 63 63 </configuration> 64 64 </plugin> 65 - </plugins>65 + <plugin>66 + <artifactId>maven-assembly-plugin</artifactId>67 + <version>2.4</version>68 + <configuration>69 + <formats>70 + <format>zip</format>71 + <format>tar.gz</format>72 + </formats>73 + <descriptors>74 + <descriptor>etc/build/pro/mvn_descriptor.xml</descriptor>75 + </descriptors>76 + <appendAssemblyId>false</appendAssemblyId>77 + </configuration>78 + </plugin>79 + </plugins>66 80 </build> 67 81 <repositories> 68 82 <repository> securis/src/main/java/net/curisit/securis/MainApp.javadeleted file mode 100644
.. .. @@ -1,143 +0,0 @@ 1 -package net.curisit.securis;2 -3 -import java.net.URI;4 -import java.security.KeyStore;5 -import java.util.Properties;6 -7 -import javax.inject.Inject;8 -import javax.inject.Named;9 -10 -import net.curisit.securis.ioc.RequestsModule;11 -import net.curisit.securis.ioc.SecurisModule;12 -13 -import org.apache.logging.log4j.LogManager;14 -import org.apache.logging.log4j.Logger;15 -import org.eclipse.jetty.http.HttpVersion;16 -import org.eclipse.jetty.server.Handler;17 -import org.eclipse.jetty.server.HttpConfiguration;18 -import org.eclipse.jetty.server.HttpConnectionFactory;19 -import org.eclipse.jetty.server.SecureRequestCustomizer;20 -import org.eclipse.jetty.server.Server;21 -import org.eclipse.jetty.server.ServerConnector;22 -import org.eclipse.jetty.server.SslConnectionFactory;23 -import org.eclipse.jetty.server.handler.ContextHandlerCollection;24 -import org.eclipse.jetty.server.handler.ResourceHandler;25 -import org.eclipse.jetty.servlet.ErrorPageErrorHandler;26 -import org.eclipse.jetty.servlet.FilterHolder;27 -import org.eclipse.jetty.servlet.ServletContextHandler;28 -import org.eclipse.jetty.servlet.ServletHolder;29 -import org.eclipse.jetty.util.resource.Resource;30 -import org.eclipse.jetty.util.ssl.SslContextFactory;31 -import org.eclipse.jetty.util.thread.QueuedThreadPool;32 -import org.jboss.resteasy.plugins.guice.GuiceResteasyBootstrapServletContextListener;33 -import org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher;34 -35 -import com.google.inject.Guice;36 -import com.google.inject.Injector;37 -import com.google.inject.Key;38 -import com.google.inject.name.Names;39 -import com.google.inject.persist.PersistFilter;40 -import com.google.inject.persist.jpa.JpaPersistModule;41 -import com.itextpdf.text.pdf.security.KeyStoreUtil;42 -43 -public class MainApp {44 -45 - private static final Logger LOG = LogManager.getLogger(MainApp.class);46 -47 - private static Server server;48 - private static Injector injector = null;49 -50 - @Inject51 - @Named("base-uri")52 - private URI uri;53 -54 - public static void main(String[] args) throws Exception {55 - LOG.info("SeCuris init...");56 -57 - SecurisModule securisModule = new SecurisModule();58 - JpaPersistModule jpaPersistModule = new JpaPersistModule("localdb");59 - Properties props = new Properties();60 - props.put("javax.persistence.jdbc.password", securisModule.getPassword());61 - props.put("javax.persistence.jdbc.url", securisModule.getUrl(securisModule.getAppDir()));62 - LOG.info("BD Url: {} {}", securisModule.getUrl(securisModule.getAppDir()), securisModule.getPassword());63 - jpaPersistModule.properties(props);64 -65 - injector = Guice.createInjector(securisModule, new RequestsModule(), jpaPersistModule);66 -67 - startServer(injector.getInstance(Key.get(URI.class, Names.named("base-uri"))));68 - while (true) {69 - Thread.currentThread().sleep(100);70 - }71 - }72 -73 - private static void startServer(URI uri) throws Exception {74 - System.out.println("Starting jetty...");75 -76 - QueuedThreadPool threadPool = new QueuedThreadPool();77 - threadPool.setMaxThreads(50);78 -79 - server = new Server(9997);80 - ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);81 - context.setContextPath("/");82 - context.addEventListener(injector.getInstance(GuiceResteasyBootstrapServletContextListener.class));83 -84 - context.setInitParameter("resteasy.role.based.security", "true");85 - context.setInitParameter("resteasy.providers", DefaultExceptionHandler.class.getName());86 - context.addFilter(new FilterHolder(injector.getInstance(PersistFilter.class)), "/*", null);87 - ServletHolder sh = new ServletHolder(HttpServletDispatcher.class);88 - sh.setName("resteasy");89 - context.addServlet(sh, "/*");90 -91 - ResourceHandler staticResources = new ResourceHandler();92 - staticResources.setBaseResource(Resource.newResource(MainApp.class.getResource("/static").toURI()));93 - staticResources.setWelcomeFiles(new String[] {94 - "/main.html"95 - });96 - context.setHandler(staticResources);97 -98 - ErrorPageErrorHandler errorHandler = new ErrorPageErrorHandler();99 - context.setErrorHandler(errorHandler);100 - LOG.info("Error Handlers: " + context.getErrorHandler());101 - ContextHandlerCollection contexts = new ContextHandlerCollection();102 -103 - contexts.setHandlers(new Handler[] {104 - staticResources, context105 - });106 -107 - HttpConfiguration http_config = new HttpConfiguration();108 - http_config.setSecureScheme("https");109 - http_config.setSecurePort(8443);110 - http_config.setOutputBufferSize(32768);111 - http_config.setSendServerVersion(true);112 - http_config.setSendDateHeader(false);113 -114 -115 - HttpConfiguration https_config = new HttpConfiguration(http_config);116 - https_config.addCustomizer(new SecureRequestCustomizer());117 -118 - SslContextFactory sslContextFactory = new SslContextFactory();119 - sslContextFactory.setKeyStorePath("/Users/rob/.ssh/keys/securis.pkcs12");120 - sslContextFactory.setKeyStoreType("PKCS12");121 - sslContextFactory.setKeyStorePassword("curist3c");122 - //sslContextFactory.setCertAlias("1");123 -// sslContextFactory.setKeyManagerPassword("curist3c");124 -// sslContextFactory.setTrustStorePath("/Users/rob/.ssh/keys/keystore");125 -// sslContextFactory.setTrustStorePassword("curist3c");126 - sslContextFactory.checkKeyStore();127 - sslContextFactory.setNeedClientAuth(false);128 - LOG.info("Protocol: {}", sslContextFactory.getProtocol());129 -130 - ServerConnector sslConnector = new ServerConnector(server, new SslConnectionFactory(sslContextFactory,HttpVersion.HTTP_1_1.asString()), new HttpConnectionFactory(https_config));131 - sslConnector.setPort(8443);132 - sslConnector.setHost("securis.curistec.com");133 - server.addConnector( sslConnector );134 -135 - server.setHandler(context);136 - server.setStopAtShutdown(true);137 - server.start();138 - server.join();139 -140 - LOG.info("Started server in: http://127.0.0.1:9997/");141 - }142 -143 -}securis/src/main/java/net/curisit/securis/SeCurisServer.java
.. .. @@ -0,0 +1,234 @@ 1 +package net.curisit.securis;2 +3 +import java.io.File;4 +import java.io.IOException;5 +import java.lang.management.ManagementFactory;6 +import java.net.URI;7 +import java.net.URISyntaxException;8 +import java.util.Properties;9 +10 +import javax.inject.Inject;11 +import javax.inject.Named;12 +13 +import net.curisit.securis.ioc.RequestsModule;14 +import net.curisit.securis.ioc.SecurisModule;15 +16 +import org.apache.commons.io.FileUtils;17 +import org.apache.logging.log4j.LogManager;18 +import org.apache.logging.log4j.Logger;19 +import org.eclipse.jetty.http.HttpVersion;20 +import org.eclipse.jetty.server.Handler;21 +import org.eclipse.jetty.server.HttpConfiguration;22 +import org.eclipse.jetty.server.HttpConnectionFactory;23 +import org.eclipse.jetty.server.SecureRequestCustomizer;24 +import org.eclipse.jetty.server.Server;25 +import org.eclipse.jetty.server.ServerConnector;26 +import org.eclipse.jetty.server.SslConnectionFactory;27 +import org.eclipse.jetty.server.handler.ContextHandlerCollection;28 +import org.eclipse.jetty.server.handler.ResourceHandler;29 +import org.eclipse.jetty.servlet.ErrorPageErrorHandler;30 +import org.eclipse.jetty.servlet.FilterHolder;31 +import org.eclipse.jetty.servlet.ServletContextHandler;32 +import org.eclipse.jetty.servlet.ServletHolder;33 +import org.eclipse.jetty.util.component.AbstractLifeCycle.AbstractLifeCycleListener;34 +import org.eclipse.jetty.util.component.LifeCycle;35 +import org.eclipse.jetty.util.resource.Resource;36 +import org.eclipse.jetty.util.ssl.SslContextFactory;37 +import org.eclipse.jetty.util.thread.QueuedThreadPool;38 +import org.jboss.resteasy.plugins.guice.GuiceResteasyBootstrapServletContextListener;39 +import org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher;40 +41 +import com.google.inject.Guice;42 +import com.google.inject.Injector;43 +import com.google.inject.Key;44 +import com.google.inject.name.Names;45 +import com.google.inject.persist.PersistFilter;46 +import com.google.inject.persist.jpa.JpaPersistModule;47 +48 +public class SeCurisServer {49 +50 + private static final Logger LOG = LogManager.getLogger(SeCurisServer.class);51 + private static final Logger CONSOLE = LogManager.getLogger("console");52 +53 + private static final String PID_FILE = System.getProperty("user.home") + "/.SeCuris/securis-server.pid";54 +55 + private static Server server;56 + private static Injector injector = null;57 +58 + @Inject59 + @Named("base-uri")60 + private URI uri;61 +62 + private static void showHelp() {63 + CONSOLE.info("Execute SeCuris server using:");64 + CONSOLE.info(" $ ./securis-server.sh {start|stop}");65 + }66 +67 + public static void main(String[] args) throws Exception {68 + String command;69 + if (args.length > 0) {70 + command = args[0].toLowerCase();71 + } else {72 + command = "start";73 + }74 +75 + switch (command) {76 + case "start":77 + startServer();78 + break;79 + case "stop":80 + stopServer();81 + break;82 +83 + default:84 + showHelp();85 + System.exit(-1);86 + }87 + }88 +89 + private static void stopServer() {90 + if (!new File(PID_FILE).exists()) {91 + CONSOLE.error("SeCuris server is NOT running or PID file is missing");92 + System.exit(-3);93 + }94 + try {95 + int pid = Integer.parseInt(FileUtils.readFileToString(new File(PID_FILE)));96 + Runtime.getRuntime().exec("kill -SIGINT " + pid);97 + new File(PID_FILE).delete();98 + CONSOLE.info("SeCuris server process stopped sucessfully (PID: {})", pid);99 + } catch (NumberFormatException | IOException e) {100 + LOG.error("Error getting SeCuris server process PID from file: {}", PID_FILE);101 + }102 + }103 +104 + private static void startServer() {105 +106 + if (new File(PID_FILE).exists()) {107 + try {108 + CONSOLE.error("SeCuris server is already running with PID: {}", FileUtils.readFileToString(new File(PID_FILE)));109 + } catch (IOException e) {110 + LOG.error("Unexpected error", e);111 + }112 + System.exit(-2);113 + }114 +115 + SecurisModule securisModule = new SecurisModule();116 + JpaPersistModule jpaPersistModule = new JpaPersistModule("localdb");117 + Properties props = new Properties();118 + props.put("javax.persistence.jdbc.password", securisModule.getPassword());119 + props.put("javax.persistence.jdbc.url", securisModule.getUrl(securisModule.getAppDir()));120 + LOG.info("BD Url: {} {}", securisModule.getUrl(securisModule.getAppDir()), securisModule.getPassword());121 + jpaPersistModule.properties(props);122 +123 + injector = Guice.createInjector(securisModule, new RequestsModule(), jpaPersistModule);124 +125 + try {126 + startServer(injector.getInstance(Key.get(URI.class, Names.named("base-uri"))));127 +128 + } catch (SeCurisException e) {129 + CONSOLE.error("Error launching the SeCuris server, {}", e);130 + }131 + }132 +133 + private static void savePID() throws SeCurisException {134 + String runtimeName = ManagementFactory.getRuntimeMXBean().getName();135 + // runtimeName contains something like: "12345@localhost"136 + String pid = runtimeName.substring(0, runtimeName.indexOf('@'));137 + try {138 + FileUtils.writeStringToFile(new File(PID_FILE), pid);139 + CONSOLE.info("SeCuris server process started sucessfully (PID: {})", pid);140 + } catch (IOException e) {141 + LOG.error("Error saving pid file", e);142 + throw new SeCurisException("Error saving pid file");143 + }144 + }145 +146 + private static void startServer(URI uri) throws SeCurisException {147 + System.out.println("Starting jetty...");148 +149 + QueuedThreadPool threadPool = new QueuedThreadPool();150 + threadPool.setMaxThreads(50);151 +152 + server = new Server(9997);153 + ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);154 + context.setContextPath("/");155 + context.addEventListener(injector.getInstance(GuiceResteasyBootstrapServletContextListener.class));156 +157 + context.setInitParameter("resteasy.role.based.security", "true");158 + context.setInitParameter("resteasy.providers", DefaultExceptionHandler.class.getName());159 + context.addFilter(new FilterHolder(injector.getInstance(PersistFilter.class)), "/*", null);160 + ServletHolder sh = new ServletHolder(HttpServletDispatcher.class);161 + sh.setName("resteasy");162 + context.addServlet(sh, "/*");163 +164 + ResourceHandler staticResources = new ResourceHandler();165 + try {166 + staticResources.setBaseResource(Resource.newResource(SeCurisServer.class.getResource("/static").toURI()));167 + } catch (IOException | URISyntaxException e) {168 + LOG.error("Error configuring static resources", e);169 + throw new SeCurisException("Error configuring static resources");170 + }171 + staticResources.setWelcomeFiles(new String[] {172 + "/main.html"173 + });174 + context.setHandler(staticResources);175 +176 + ErrorPageErrorHandler errorHandler = new ErrorPageErrorHandler();177 + context.setErrorHandler(errorHandler);178 + LOG.info("Error Handlers: " + context.getErrorHandler());179 + ContextHandlerCollection contexts = new ContextHandlerCollection();180 +181 + contexts.setHandlers(new Handler[] {182 + staticResources, context183 + });184 +185 + HttpConfiguration http_config = new HttpConfiguration();186 + http_config.setSecureScheme("https");187 + http_config.setSecurePort(8443);188 + http_config.setOutputBufferSize(32768);189 + http_config.setSendServerVersion(true);190 + http_config.setSendDateHeader(false);191 +192 +193 + HttpConfiguration https_config = new HttpConfiguration(http_config);194 + https_config.addCustomizer(new SecureRequestCustomizer());195 +196 + SslContextFactory sslContextFactory = new SslContextFactory();197 + sslContextFactory.setKeyStorePath("/Users/rob/.ssh/keys/securis.pkcs12");198 + sslContextFactory.setKeyStoreType("PKCS12");199 + sslContextFactory.setKeyStorePassword("curist3c");200 + //sslContextFactory.setCertAlias("1");201 +// sslContextFactory.setKeyManagerPassword("curist3c");202 +// sslContextFactory.setTrustStorePath("/Users/rob/.ssh/keys/keystore");203 +// sslContextFactory.setTrustStorePassword("curist3c");204 + sslContextFactory.checkKeyStore();205 + sslContextFactory.setNeedClientAuth(false);206 + LOG.info("Protocol: {}", sslContextFactory.getProtocol());207 +208 + ServerConnector sslConnector = new ServerConnector(server, new SslConnectionFactory(sslContextFactory,HttpVersion.HTTP_1_1.asString()), new HttpConnectionFactory(https_config));209 + sslConnector.setPort(8443);210 + sslConnector.setHost("securis.curistec.com");211 + server.addConnector( sslConnector );212 +213 + server.setHandler(context);214 + server.setStopAtShutdown(true);215 + server.addLifeCycleListener(new ServerStoppedListener());216 + try {217 + server.start();218 + savePID();219 + server.join();220 + } catch (Exception e) {221 + LOG.error("Error starting SeCurisServer", e);222 + throw new SeCurisException("Error starting SeCurisServer");223 + }224 +225 + }226 +227 + static class ServerStoppedListener extends AbstractLifeCycleListener {228 + @Override public void lifeCycleStopped(LifeCycle event) {229 + if (new File(PID_FILE).exists())230 + new File(PID_FILE).delete();231 + }232 + }233 +234 +}securis/src/main/resources/log4j2.xml
.. .. @@ -2,22 +2,39 @@ 2 2 <Configuration> 3 3 <Appenders> 4 4 5 - <File name="defaultFile" fileName="${sys:user.home}/.SeCuris/log/securis.log" append="false">5 + <RollingFile name="defaultFile" fileName="${sys:user.home}/.SeCuris/logs/securis-server.log" append="true"6 + filePattern="${sys:user.home}/.SeCuris/logs/securis-server-%d{yyyy-MM-dd-HH}.log.gz">6 7 <PatternLayout pattern="%d %-5p [%t] %C{2} (%F:%L) - %m%n"/> 7 - </File>8 -8 + <Policies>9 + <TimeBasedTriggeringPolicy interval="1" modulate="true" />10 + </Policies>11 + <DefaultRolloverStrategy max="10"/>12 + </RollingFile>13 + <Async name="defaultFileAsync" includeLocation="true">14 + <AppenderRef ref="defaultFile"/>15 + </Async>16 +9 17 <Console name="stdout" target="SYSTEM_OUT"> 10 18 <PatternLayout pattern="%d %-5p [%t] %C{2} (%F:%L) - %m%n"/> 19 + </Console>20 +21 + <Console name="console" target="SYSTEM_OUT">22 + <PatternLayout pattern="%m%n"/>11 23 </Console> 12 24 13 25 </Appenders> 14 26 <Loggers> 15 27 16 - <Logger name="net.curisit" level="INFO">17 - <AppenderRef ref="defaultFile"/>28 + <Logger name="net.curisit" level="INFO" additivity="false">29 + <AppenderRef ref="defaultFileAsync"/>30 + <AppenderRef ref="stdout"/>18 31 </Logger> 19 -20 - <Root level="OFF">32 +33 + <Logger name="console" level="INFO" additivity="false">34 + <AppenderRef ref="console"/>35 + </Logger>36 +37 + <Root level="INFO" >21 38 <AppenderRef ref="stdout"/> 22 39 </Root> 23 40