Skip to content

Commit 0307734

Browse files
authored
Merge pull request #1 from paulorb/logChanges
migrate logs to log4j
2 parents b54da17 + 3a77e59 commit 0307734

11 files changed

+89
-35
lines changed

build.gradle.kts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,15 @@ repositories {
1212
mavenCentral()
1313
}
1414

15+
val log4jVersion = "2.12.1"
16+
1517
dependencies {
1618
implementation(kotlin("stdlib-jdk8"))
1719
testImplementation(kotlin("test"))
1820
implementation("io.netty:netty-all:4.1.104.Final")
21+
implementation("org.apache.logging.log4j:log4j-core:$log4jVersion")
22+
implementation("org.apache.logging.log4j:log4j-api:$log4jVersion")
23+
implementation("org.apache.logging.log4j:log4j-slf4j-impl:$log4jVersion")
1924
}
2025

2126
tasks.test {

src/main/kotlin/ModbusPacket.kt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import ModbusPacket.FunctionCode.Companion.MBAP_HEADER_SIZE_IN_BYTES
22
import helpers.toHexString
3+
import org.slf4j.LoggerFactory
34
import java.nio.ByteBuffer
45

56
abstract class ModbusPacket(
@@ -11,7 +12,9 @@ abstract class ModbusPacket(
1112
var byteVector: ByteArray
1213
) : IPacket {
1314

14-
15+
companion object {
16+
val logger = LoggerFactory.getLogger("ModbusPacket")
17+
}
1518

1619
enum class FunctionCode(val value: Int) {
1720
READ_COIL_STATUS(0x01),
@@ -61,7 +64,7 @@ abstract class ModbusPacket(
6164
indexPayload += 1
6265
}
6366
var byteArray = byteBuffer.array()
64-
println("TX: ${byteArray.toHexString()}")
67+
logger.info("TX: ${byteArray.toHexString()}")
6568
return byteArray
6669
}
6770

src/main/kotlin/ModbusPacketDecoder.kt

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import io.netty.buffer.ByteBuf
22
import io.netty.channel.ChannelHandlerContext
33
import io.netty.handler.codec.ByteToMessageDecoder
4+
import org.slf4j.LoggerFactory
45

56
//./modpoll -t0 -r 100 -c 5 -1 -p 5002 127.0.0.1
67
//./modpoll -t1 -r 100 -c 5 -1 -p 5002 127.0.0.1
@@ -10,28 +11,33 @@ import io.netty.handler.codec.ByteToMessageDecoder
1011
// Don't release ByteBuf, ByteToMessageDecoder handles it internally
1112
//https://github.com/netty/netty/issues/12360
1213
class ModbusPacketDecoder : ByteToMessageDecoder() {
14+
15+
companion object {
16+
val logger = LoggerFactory.getLogger("ModbusPacketDecoder")
17+
}
18+
19+
1320
override fun decode(ctx: ChannelHandlerContext?, `in`: ByteBuf?, out: MutableList<Any>?) {
1421
val bufferSize = `in`!!.readableBytes()
1522
print("\nRX:")
1623
for(i in 0 until bufferSize){
1724
val st = String.format("%02X", `in`.getByte(i))
1825
print(st)
1926
}
20-
println()
2127

2228
if (`in`!!.readableBytes() < 6) {
23-
println("less than 6 bytes received, ignoring...")
29+
logger.debug("less than 6 bytes received, ignoring...")
2430
return
2531
}
26-
println("more than 6 bytes received...")
32+
logger.debug("more than 6 bytes received...")
2733
val lenght = `in`.getShort(4)
28-
println("readable bytes ${`in`!!.readableBytes()} lenght ${lenght}")
34+
logger.debug("readable bytes ${`in`!!.readableBytes()} lenght ${lenght}")
2935
if(`in`.readableBytes() < lenght - 4){
30-
println("waiting ${lenght - 4} bytes...")
36+
logger.debug("waiting ${lenght - 4} bytes...")
3137
return
3238
}
3339
val payloadSize = lenght - 2
34-
println("payload size: ${payloadSize}")
40+
logger.debug("payload size: ${payloadSize}")
3541
val modbusPacket = GenericModbusPacket(
3642
`in`.readShort(),
3743
`in`.readShort(),
@@ -41,10 +47,10 @@ class ModbusPacketDecoder : ByteToMessageDecoder() {
4147
`in`.toByteArraySafe(payloadSize)
4248
)
4349
if(!modbusPacket.isValid()) {
44-
println("Invalid modbus packet")
50+
logger.error("Invalid modbus packet")
4551
return
4652
}else{
47-
println("Valid modbus packet =)")
53+
logger.debug("Valid modbus packet =)")
4854
out!!.add(modbusPacket)
4955
}
5056

src/main/kotlin/ModbusReadCoilStatusResponse.kt

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import ModbusPacket.FunctionCode.Companion.DEFAULT_PROTOCOL_IDENTIFIER
2+
import org.slf4j.LoggerFactory
23
import kotlin.experimental.or
34
import kotlin.math.max
45

@@ -14,6 +15,7 @@ class ModbusReadCoilStatusResponse: ModbusPacket {
1415

1516
companion object {
1617
const val LEN_BYTES_METADATA_SIZE = 1
18+
val logger = LoggerFactory.getLogger("ModbusReadCoilStatusResponse")
1719
}
1820

1921
private var listIndexToCoilValue = mutableListOf<Pair<Int,Boolean>>()
@@ -28,7 +30,7 @@ class ModbusReadCoilStatusResponse: ModbusPacket {
2830
}
2931

3032
fun setCoil(bitIndex: Int, value: Boolean){
31-
println("setCoil index=$bitIndex value=$value")
33+
logger.debug("setCoil index=$bitIndex value=$value")
3234
listIndexToCoilValue.add(Pair<Int, Boolean>(bitIndex, value))
3335
}
3436

@@ -59,15 +61,15 @@ class ModbusReadCoilStatusResponse: ModbusPacket {
5961
minIndex = element.first
6062
}
6163
}
62-
println("min $minIndex max $maxIndex")
64+
logger.debug("min $minIndex max $maxIndex")
6365
val numberOfBytes = ((maxIndex.toInt() - minIndex.toInt() + 1)/8) + extraByte((maxIndex.toInt() - minIndex.toInt() + 1))
6466
val length = max(numberOfBytes, 1).toUByte()
65-
println("modbus length $length")
67+
logger.debug("modbus length $length")
6668
byteVector = ByteArray(LEN_BYTES_METADATA_SIZE + length.toInt() )
6769
byteVector[0] = length.toByte()
6870
for(element in listIndexToCoilValue){
6971
if(element.second) {
70-
println("byte index ${((element.first - minIndex)/8)+ 1} bit index ${(element.first - minIndex) % 8}")
72+
logger.debug("byte index ${((element.first - minIndex)/8)+ 1} bit index ${(element.first - minIndex) % 8}")
7173
byteVector[((element.first - minIndex)/8)+ 1] =
7274
setBit(byteVector[((element.first - minIndex)/8)+ 1], (element.first - minIndex)% 8)
7375
}

src/main/kotlin/ModbusReadHoldingRegisterResponse.kt

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import ModbusPacket.FunctionCode.Companion.DEFAULT_PROTOCOL_IDENTIFIER
22
import helpers.DataConverter
3+
import org.slf4j.LoggerFactory
34
import java.net.Inet4Address
45
import kotlin.math.max
56

@@ -15,8 +16,10 @@ class ModbusReadHoldingRegisterResponse: ModbusPacket{
1516

1617
companion object {
1718
const val LEN_BYTES_METADATA_SIZE = 1
19+
val logger = LoggerFactory.getLogger("ModbusReadHoldingRegisterResponse")
1820
}
1921

22+
2023
private var listIndexToRegisterValue = mutableListOf<Pair<Int,Short>>()
2124

2225
fun setRegister(address: Int, value: Short){
@@ -40,14 +43,14 @@ class ModbusReadHoldingRegisterResponse: ModbusPacket{
4043

4144
val numberOfBytes = (maxIndex.toInt() - minIndex.toInt() + 1) * 2
4245
val length = max(numberOfBytes, 1).toUByte()
43-
println("modbus length $length")
46+
logger.debug("modbus length $length")
4447
byteVector = ByteArray(LEN_BYTES_METADATA_SIZE + length.toInt() )
4548
byteVector[0] = length.toByte()
4649
var i = 1
4750
for(element in listIndexToRegisterValue){
48-
println("byte[${i}]=${DataConverter.toBytes(element.second)[1]}")
51+
logger.debug("byte[${i}]=${DataConverter.toBytes(element.second)[1]}")
4952
byteVector[i++] = DataConverter.toBytes(element.second)[1]
50-
println("byte[${i}]=${DataConverter.toBytes(element.second)[0]}")
53+
logger.debug("byte[${i}]=${DataConverter.toBytes(element.second)[0]}")
5154
byteVector[i++] = DataConverter.toBytes(element.second)[0]
5255
}
5356
}

src/main/kotlin/ModbusReadInputRegisterResponse.kt

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import helpers.DataConverter
22
import kotlin.math.max
33
import ModbusPacket.FunctionCode.Companion.DEFAULT_PROTOCOL_IDENTIFIER
4+
import org.slf4j.LoggerFactory
45

56
class ModbusReadInputRegisterResponse: ModbusPacket {
67
constructor(transactionIdentifier: Short,
@@ -14,6 +15,7 @@ class ModbusReadInputRegisterResponse: ModbusPacket {
1415

1516
companion object {
1617
const val LEN_BYTES_METADATA_SIZE = 1
18+
val logger = LoggerFactory.getLogger("ModbusReadInputRegisterResponse")
1719
}
1820

1921
private var listIndexToRegisterValue = mutableListOf<Pair<Int,Short>>()
@@ -39,14 +41,14 @@ class ModbusReadInputRegisterResponse: ModbusPacket {
3941

4042
val numberOfBytes = (maxIndex.toInt() - minIndex.toInt() + 1) * 2
4143
val length = max(numberOfBytes, 1).toByte()
42-
println("modbus length $length")
44+
logger.debug("modbus length $length")
4345
byteVector = ByteArray(LEN_BYTES_METADATA_SIZE + length )
4446
byteVector[0] = length
4547
var i = 1
4648
for(element in listIndexToRegisterValue){
47-
println("byte[${i}]=${DataConverter.toBytes(element.second)[1]}")
49+
logger.debug("byte[${i}]=${DataConverter.toBytes(element.second)[1]}")
4850
byteVector[i++] = DataConverter.toBytes(element.second)[1]
49-
println("byte[${i}]=${DataConverter.toBytes(element.second)[0]}")
51+
logger.debug("byte[${i}]=${DataConverter.toBytes(element.second)[0]}")
5052
byteVector[i++] = DataConverter.toBytes(element.second)[0]
5153
}
5254
}

src/main/kotlin/ModbusReadInputStatusResponse.kt

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import ModbusPacket.FunctionCode.Companion.DEFAULT_PROTOCOL_IDENTIFIER
2+
import org.slf4j.LoggerFactory
23
import kotlin.experimental.or
34
import kotlin.math.max
45

@@ -14,6 +15,7 @@ class ModbusReadInputStatusResponse : ModbusPacket {
1415

1516
companion object {
1617
const val LEN_BYTES_METADATA_SIZE = 1
18+
val logger = LoggerFactory.getLogger("ModbusReadInputStatusResponse")
1719
}
1820

1921
private var listIndexToCoilValue = mutableListOf<Pair<Int,Boolean>>()
@@ -58,15 +60,15 @@ class ModbusReadInputStatusResponse : ModbusPacket {
5860
minIndex = element.first
5961
}
6062
}
61-
println("min $minIndex max $maxIndex")
63+
logger.debug("min $minIndex max $maxIndex")
6264
val numberOfBytes = ((maxIndex.toInt() - minIndex.toInt() + 1)/8) + extraByte((maxIndex.toInt() - minIndex.toInt() + 1))
6365
val length = max(numberOfBytes, 1).toByte()
64-
println("modbus length $length")
66+
logger.debug("modbus length $length")
6567
byteVector = ByteArray(LEN_BYTES_METADATA_SIZE + length )
6668
byteVector[0] = length
6769
for(element in listIndexToCoilValue){
6870
if(element.second) {
69-
println("index ${(element.first / 8) + 1 - minIndex} bit index ${element.first % 8}")
71+
logger.debug("index ${(element.first / 8) + 1 - minIndex} bit index ${element.first % 8}")
7072
byteVector[((element.first - minIndex)/8)+ 1] =
7173
setBit(byteVector[((element.first - minIndex)/8)+ 1], element.first % 8)
7274
}

src/main/kotlin/ModbusServer.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import io.netty.channel.nio.NioEventLoopGroup
66
import io.netty.channel.socket.nio.NioServerSocketChannel
77
import io.netty.handler.logging.LogLevel
88
import io.netty.handler.logging.LoggingHandler
9+
import org.apache.logging.log4j.core.config.Configurator
910

1011
class ModbusServer(modbusServerEventListener: IModbusServerEventListener) {
1112

@@ -16,6 +17,7 @@ class ModbusServer(modbusServerEventListener: IModbusServerEventListener) {
1617
lateinit private var channel : ChannelFuture
1718
fun start(){
1819
try {
20+
Configurator.initialize(null, "log4j2.xml")
1921
val b = ServerBootstrap()
2022
b.group(bossGroup, workerGroup)
2123
.channel(NioServerSocketChannel::class.java)

src/main/kotlin/ModbusServerEventListenerReplyRandomNumbers.kt

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,25 @@
1+
import org.slf4j.LoggerFactory
12
import kotlin.random.Random
23

34
class ModbusServerEventListenerReplyRandomNumbers : IModbusServerEventListener {
45

6+
companion object {
7+
val logger = LoggerFactory.getLogger("ModbusServerEventListenerReplyRandomNumbers")
8+
}
9+
510
private fun generateRandomLogicList(numberOfRegisters: Int): List<Boolean> {
611
val mutableList = mutableListOf<Boolean>()
712
for(i in 0..numberOfRegisters)
813
mutableList.add(Random.nextBoolean())
9-
println(mutableList.toString())
14+
logger.debug(mutableList.toString())
1015
return mutableList
1116
}
1217

1318
private fun generateRandomNumericList(numberOfRegisters: Int): List<Short> {
1419
val mutableList = mutableListOf<Short>()
1520
for(i in 0..numberOfRegisters)
1621
mutableList.add(Random.nextInt(Short.MAX_VALUE.toInt()).toShort())
17-
println(mutableList.toString())
22+
logger.debug(mutableList.toString())
1823
return mutableList
1924
}
2025

src/main/kotlin/ModbusServerHandler.kt

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,24 @@
11
import io.netty.channel.ChannelHandler.Sharable;
22
import io.netty.channel.ChannelHandlerContext;
33
import io.netty.channel.ChannelInboundHandlerAdapter;
4+
import org.slf4j.LoggerFactory
45

56
/**
67
* Handler implementation for the echo server.
78
*/
89
@Sharable
910
class ModbusServerHandler(private val modbusServerEventListener: IModbusServerEventListener) : ChannelInboundHandlerAdapter() {
11+
12+
companion object {
13+
val logger = LoggerFactory.getLogger("ModbusServerHandler")
14+
}
15+
1016
override fun channelRead(ctx: ChannelHandlerContext, msg: Any?) {
1117
val modbusPacket: ModbusPacket = msg as ModbusPacket
1218
when(ModbusPacket.FunctionCode.fromInt(modbusPacket.functionCode.toInt())){
1319
ModbusPacket.FunctionCode.READ_COIL_STATUS -> {
1420
val modbusRequest = ModbusReadRequest(modbusPacket)
15-
println("address ${modbusRequest.address} number of registers ${modbusRequest.numberOfRegisters}")
21+
logger.debug("address ${modbusRequest.address} number of registers ${modbusRequest.numberOfRegisters}")
1622
val modbusReadCoilStatusResponse = ModbusReadCoilStatusResponse()
1723
modbusReadCoilStatusResponse.unitID = modbusRequest.unitID
1824
modbusReadCoilStatusResponse.transactionIdentifier = modbusRequest.transactionIdentifier
@@ -24,7 +30,7 @@ class ModbusServerHandler(private val modbusServerEventListener: IModbusServerEv
2430
}
2531
ModbusPacket.FunctionCode.READ_INPUT_STATUS -> {
2632
val modbusRequest = ModbusReadRequest(modbusPacket)
27-
println("address ${modbusRequest.address} number of registers ${modbusRequest.numberOfRegisters}")
33+
logger.debug("address ${modbusRequest.address} number of registers ${modbusRequest.numberOfRegisters}")
2834
val modbusReadInputStatusResponse = ModbusReadInputStatusResponse()
2935
modbusReadInputStatusResponse.unitID = modbusRequest.unitID
3036
modbusReadInputStatusResponse.transactionIdentifier = modbusRequest.transactionIdentifier
@@ -36,7 +42,7 @@ class ModbusServerHandler(private val modbusServerEventListener: IModbusServerEv
3642
}
3743
ModbusPacket.FunctionCode.READ_HOLDING_REGISTER -> {
3844
val modbusRequest = ModbusReadRequest(modbusPacket)
39-
println("address ${modbusRequest.address} number of registers ${modbusRequest.numberOfRegisters}")
45+
logger.debug("address ${modbusRequest.address} number of registers ${modbusRequest.numberOfRegisters}")
4046
val modbusReadHoldingRegisterResponse = ModbusReadHoldingRegisterResponse()
4147
modbusReadHoldingRegisterResponse.unitID = modbusRequest.unitID
4248
modbusReadHoldingRegisterResponse.transactionIdentifier = modbusRequest.transactionIdentifier
@@ -52,7 +58,7 @@ class ModbusServerHandler(private val modbusServerEventListener: IModbusServerEv
5258
}
5359
ModbusPacket.FunctionCode.READ_INPUT_REGISTER -> {
5460
val modbusRequest = ModbusReadRequest(modbusPacket)
55-
println("address ${modbusRequest.address} number of registers ${modbusRequest.numberOfRegisters}")
61+
logger.debug("address ${modbusRequest.address} number of registers ${modbusRequest.numberOfRegisters}")
5662
val modbusReadInputRegisterResponse = ModbusReadInputRegisterResponse()
5763
modbusReadInputRegisterResponse.unitID = modbusRequest.unitID
5864
modbusReadInputRegisterResponse.transactionIdentifier = modbusRequest.transactionIdentifier
@@ -68,9 +74,9 @@ class ModbusServerHandler(private val modbusServerEventListener: IModbusServerEv
6874
ModbusPacket.FunctionCode.FORCE_SINGLE_COIL -> {
6975
val modbusWriteRequest = ModbusForceSingleCoilRequest(modbusPacket)
7076
if(modbusWriteRequest.coilStatus) {
71-
println("address ${modbusWriteRequest.address} status ON")
77+
logger.debug("address ${modbusWriteRequest.address} status ON")
7278
}else{
73-
println("address ${modbusWriteRequest.address} status OFF")
79+
logger.debug("address ${modbusWriteRequest.address} status OFF")
7480
}
7581
val modusForceSingleCoilResponse = ModbusForceSingleCoilResponse()
7682
modusForceSingleCoilResponse.unitID = modbusWriteRequest.unitID
@@ -95,9 +101,9 @@ class ModbusServerHandler(private val modbusServerEventListener: IModbusServerEv
95101
val modbusForceMultipleCoilsResponse = ModbusForceMultipleCoilsResponse()
96102
modbusForceMultipleCoilsResponse.unitID = modbusWriteRequest.unitID
97103
modbusServerEventListener.forceMultipleCoils(modbusWriteRequest.getCoilList())
98-
println("received FORCE_MULTIPLE_COILS")
104+
logger.debug("received FORCE_MULTIPLE_COILS")
99105
for(coil in modbusWriteRequest.getCoilList()){
100-
println("address: ${coil.first} value: ${coil.second}")
106+
logger.debug("address: ${coil.first} value: ${coil.second}")
101107
}
102108
modbusForceMultipleCoilsResponse.transactionIdentifier = modbusWriteRequest.transactionIdentifier
103109
modbusForceMultipleCoilsResponse.setAddress(modbusWriteRequest.address.toShort())
@@ -109,9 +115,9 @@ class ModbusServerHandler(private val modbusServerEventListener: IModbusServerEv
109115
val modbusPresetMultipleRegistersResponse = ModbusPresetMultipleRegistersResponse()
110116
modbusPresetMultipleRegistersResponse.unitID = modbusWriteRequest.unitID
111117
modbusServerEventListener.presetMultipleRegisters(modbusWriteRequest.getRegisterList())
112-
println("received PRESET_MULTIPLE_REGISTER")
118+
logger.debug("received PRESET_MULTIPLE_REGISTER")
113119
for(register in modbusWriteRequest.getRegisterList()){
114-
println("address: ${register.first} value: ${register.second}")
120+
logger.debug("address: ${register.first} value: ${register.second}")
115121
}
116122
modbusPresetMultipleRegistersResponse.transactionIdentifier = modbusWriteRequest.transactionIdentifier
117123
modbusPresetMultipleRegistersResponse.setAddress(modbusWriteRequest.address.toShort())

0 commit comments

Comments
 (0)