| 
					
				 | 
			
			
				@@ -25,6 +25,7 @@ import java.io.Serializable 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import java.time.LocalDateTime 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import java.time.format.DateTimeFormatter 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import java.util.* 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import kotlin.system.exitProcess 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import kotlin.system.measureTimeMillis 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -35,50 +36,22 @@ class IpPhoneBridgeApplication 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 fun main(args: Array<String>) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     TimeZone.setDefault(TimeZone.getTimeZone("Asia/Jakarta")) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     val properties = Properties() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    val ini = Wini(File("conf/general.ini")) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    properties["server.port"] = ini.get("server", "port") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    val confFile = File("conf/general.ini") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (confFile.exists()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        val ini = Wini(File("conf/general.ini")) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        properties["server.port"] = ini.get("server", "port") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        properties["server.port"] = System.getenv("PORT") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (properties["server.port"] == null) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        println("undefined port") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        exitProcess(1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     val sApp = SpringApplication(IpPhoneBridgeApplication::class.java) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     sApp.setDefaultProperties(properties) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     sApp.run(*args) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    val builder = ConfigurationBuilderFactory.newConfigurationBuilder() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    val console = builder.newAppender("stdout", "Console") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    val appLog = builder.newAppender("appLog", "RollingFile") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    appLog.addAttribute("fileName", "log/app/app.log") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    appLog.addAttribute("filePattern", "log/app/\$\${date:yyyy - MM}/app-%d{yyyy-MM-dd}-%i.log.zip") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    val flow: FilterComponentBuilder = builder.newFilter( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            "MarkerFilter", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            Filter.Result.ACCEPT, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            Filter.Result.DENY) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    flow.addAttribute("marker", "FLOW") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    console.add(flow) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    val standard = builder.newLayout("PatternLayout") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    standard.addAttribute("pattern", "%d %p [%c{1}] %m%n") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    val policies = builder.newLayout("Policies") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    val timeBasedTriggeringPolicy = builder.newLayout("TimeBasedTriggeringPolicy") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    val sizeBasedTriggeringPolicy = builder.newLayout("SizeBasedTriggeringPolicy") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    sizeBasedTriggeringPolicy.addAttribute("size", "10 MB") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    policies.addComponent(timeBasedTriggeringPolicy) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    policies.addComponent(sizeBasedTriggeringPolicy) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    appLog.addComponent(policies) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    console.add(standard) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    appLog.add(standard) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    builder.add(console) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    builder.add(appLog) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    val rootLogger: RootLoggerComponentBuilder = builder.newRootLogger(Level.INFO) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    rootLogger.add(builder.newAppenderRef("stdout")) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    builder.add(rootLogger) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    val logger: LoggerComponentBuilder = builder.newLogger("co.id.datacomsolusindo.ipphonebridge", Level.DEBUG) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    logger.add(builder.newAppenderRef("appLog")) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    logger.addAttribute("additivity", false) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    builder.add(logger) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    Configurator.reconfigure(builder.build()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     LogManager.getLogger("co.id.datacomsolusindo.ipphonebridge.IpPhoneBridgeApplication").info("Bridge Start") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -98,9 +71,9 @@ object ClientHolder { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     private suspend fun massiveRun(action: suspend () -> Unit) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         measureTimeMillis { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             coroutineScope { // sc 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    launch { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            action() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                launch { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    action() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -148,13 +121,71 @@ object ClientHolder { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 @Component 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 class WebSocketEventListener { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    fun logBuilder(clNum: String) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        val builder = ConfigurationBuilderFactory.newConfigurationBuilder() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        val console = builder.newAppender("stdout", "Console") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        val appLog = builder.newAppender("appLog", "RollingFile") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        appLog.addAttribute("fileName", "log/app/app.log") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        appLog.addAttribute("filePattern", "log/app/\$\${date:yyyy - MM}/app-%d{yyyy-MM-dd}-%i.log.zip") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        val flow: FilterComponentBuilder = builder.newFilter( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                "MarkerFilter", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Filter.Result.ACCEPT, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Filter.Result.DENY) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        flow.addAttribute("marker", "FLOW") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        console.add(flow) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        val standard = builder.newLayout("PatternLayout") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        standard.addAttribute("pattern", "%d %p [%c{1}] %m%n") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        val policies = builder.newLayout("Policies") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        val timeBasedTriggeringPolicy = builder.newLayout("TimeBasedTriggeringPolicy") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        val sizeBasedTriggeringPolicy = builder.newLayout("SizeBasedTriggeringPolicy") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        sizeBasedTriggeringPolicy.addAttribute("size", "10 MB") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        policies.addComponent(timeBasedTriggeringPolicy) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        policies.addComponent(sizeBasedTriggeringPolicy) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        console.add(standard) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        builder.add(console) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        appLog.add(standard) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        appLog.addComponent(policies) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        builder.add(appLog) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        val rootLogger: RootLoggerComponentBuilder = builder.newRootLogger(Level.INFO) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        rootLogger.add(builder.newAppenderRef("stdout")) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        builder.add(rootLogger) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        val logger: LoggerComponentBuilder = builder.newLogger("co.id.datacomsolusindo.ipphonebridge", Level.DEBUG) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        logger.add(builder.newAppenderRef("appLog")) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        logger.addAttribute("additivity", false) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        builder.add(logger) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        rootLogger.add(builder.newAppenderRef("appLog")) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ClientHolder.get().entries.forEach { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            val clientLog = builder.newAppender("client-${it.key}", "RollingFile") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            clientLog.addAttribute("fileName", "log/${it.key}/client-${it.key}.log") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            clientLog.addAttribute("filePattern", "log/${it.key}/\$\${date:yyyy - MM}/app-%d{yyyy-MM-dd}-%i.client-${it.key}.zip") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            clientLog.add(standard) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            clientLog.addComponent(policies) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            builder.add(clientLog) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            val loggerClient: LoggerComponentBuilder = builder.newLogger("client.${it.key}", Level.DEBUG) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            loggerClient.add(builder.newAppenderRef("client-${it.key}")) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            loggerClient.addAttribute("additivity", false) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            builder.add(loggerClient) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            rootLogger.add(builder.newAppenderRef("client-${it.key}")) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Configurator.reconfigure(builder.build()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     @EventListener(SessionSubscribeEvent::class) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     fun handleSessionSubscribeEvent(event: SessionSubscribeEvent) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         val message = event.message as GenericMessage<*> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         val simDestination = message.headers["simpDestination"] as String? 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if (!simDestination!!.startsWith("/topic/healthCheck")) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (!(simDestination!!.startsWith("/topic/healthCheck") || simDestination.startsWith("/topic/notification"))) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             // do stuff 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            val clNum = simDestination.split("/")[2] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            val clNum = simDestination.split("/")[3] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             ClientHolder.put(clNum, Client( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     clNum, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS")), 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -162,62 +193,7 @@ class WebSocketEventListener { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             )) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             LogManager.getLogger(this.javaClass).info("clientConnected $simDestination") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            val builder = ConfigurationBuilderFactory.newConfigurationBuilder() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            val console = builder.newAppender("stdout", "Console") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            val appLog = builder.newAppender("appLog", "RollingFile") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            appLog.addAttribute("fileName", "log/app/app.log") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            appLog.addAttribute("filePattern", "log/app/\$\${date:yyyy - MM}/app-%d{yyyy-MM-dd}-%i.log.zip") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            val flow: FilterComponentBuilder = builder.newFilter( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    "MarkerFilter", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    Filter.Result.ACCEPT, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    Filter.Result.DENY) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            flow.addAttribute("marker", "FLOW") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            console.add(flow) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            val standard = builder.newLayout("PatternLayout") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            standard.addAttribute("pattern", "%d %p [%c{1}] %m%n") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            val policies = builder.newLayout("Policies") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            val timeBasedTriggeringPolicy = builder.newLayout("TimeBasedTriggeringPolicy") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            val sizeBasedTriggeringPolicy = builder.newLayout("SizeBasedTriggeringPolicy") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            sizeBasedTriggeringPolicy.addAttribute("size", "10 MB") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            policies.addComponent(timeBasedTriggeringPolicy) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            policies.addComponent(sizeBasedTriggeringPolicy) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            console.add(standard) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            builder.add(console) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            appLog.add(standard) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            appLog.addComponent(policies) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            builder.add(appLog) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            val rootLogger: RootLoggerComponentBuilder = builder.newRootLogger(Level.INFO) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            rootLogger.add(builder.newAppenderRef("stdout")) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//            val logger: LoggerComponentBuilder = builder.newLogger("co.id.datacomsolusindo.ipphonebridge", Level.DEBUG) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//            logger.add(builder.newAppenderRef("appLog")) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//            logger.addAttribute("additivity", false) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//            builder.add(logger) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            ClientHolder.get().entries.forEach { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                val clientLog = builder.newAppender("client-${it.key}", "RollingFile") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                clientLog.addAttribute("fileName", "log/${it.key}/client-${it.key}.log") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                clientLog.addAttribute("filePattern", "log/${it.key}/\$\${date:yyyy - MM}/app-%d{yyyy-MM-dd}-%i.client-${it.key}.zip") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                clientLog.add(standard) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                clientLog.addComponent(policies) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                builder.add(clientLog) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                val loggerClient: LoggerComponentBuilder = builder.newLogger("client.${it.key}", Level.DEBUG) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                loggerClient.add(builder.newAppenderRef("client-${it.key}")) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                loggerClient.addAttribute("additivity", false) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                builder.add(loggerClient) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                rootLogger.add(builder.newAppenderRef("client-${it.key}")) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            builder.add(rootLogger) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            Configurator.reconfigure(builder.build()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            logBuilder(clNum) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             LogManager.getLogger("client.$clNum").info("Client $clNum Connected") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 |