Skip to content
This repository was archived by the owner on Oct 18, 2024. It is now read-only.

Commit 9f40810

Browse files
committed
fix(logger): use custom log layout & encoder instead of PatternLayoutEncoder
1 parent b7e8464 commit 9f40810

File tree

4 files changed

+76
-36
lines changed

4 files changed

+76
-36
lines changed

app/src/main/java/com/itsaky/androidide/logging/LifecycleAwareAppender.kt

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,10 @@ package com.itsaky.androidide.logging
2020
import androidx.lifecycle.Lifecycle
2121
import androidx.lifecycle.LifecycleEventObserver
2222
import androidx.lifecycle.LifecycleOwner
23-
import ch.qos.logback.classic.encoder.PatternLayoutEncoder
2423
import ch.qos.logback.classic.spi.ILoggingEvent
2524
import ch.qos.logback.core.AppenderBase
2625
import ch.qos.logback.core.Context
26+
import com.itsaky.androidide.logging.encoder.IDELogFormatLayout
2727

2828
/**
2929
* An [AppenderBase] implementation to show the logs in the GUI.
@@ -36,13 +36,11 @@ class LifecycleAwareAppender @JvmOverloads constructor(
3636
) : AppenderBase<ILoggingEvent>(), LifecycleEventObserver {
3737

3838
private var currentState: Lifecycle.State? = null
39-
private val encoder = PatternLayoutEncoder()
39+
private val logLayout = IDELogFormatLayout()
4040

4141
init {
4242
setName("LifecycleAwareAppender")
43-
44-
encoder.pattern = "%date %-5level [%thread] %logger{0}:"
45-
encoder.isOutputPatternAsHeader = true
43+
logLayout.isOmitMessage = true
4644
}
4745

4846
fun attachTo(lifecycleOwner: LifecycleOwner) = attachTo(lifecycleOwner.lifecycle)
@@ -66,19 +64,19 @@ class LifecycleAwareAppender @JvmOverloads constructor(
6664
}
6765

6866
override fun start() {
69-
this.encoder.start()
67+
this.logLayout.start()
7068
super.start()
7169
}
7270

7371
override fun stop() {
7472
super.stop()
75-
this.encoder.stop()
73+
this.logLayout.stop()
7674
this.consumer = null
7775
}
7876

7977
override fun setContext(context: Context?) {
8078
super.setContext(context)
81-
this.encoder.context = context
79+
this.logLayout.context = context
8280
}
8381

8482
override fun append(eventObject: ILoggingEvent?) {
@@ -88,7 +86,7 @@ class LifecycleAwareAppender @JvmOverloads constructor(
8886

8987
// When rendering the logs in the GUI, we need to ensure that the message does not span multiple lines
9088
// if it does, we need to prefix the message with the layout header
91-
val prefix = encoder.layout.doLayout(eventObject)
89+
val prefix = logLayout.doLayout(eventObject)
9290
eventObject.formattedMessage.split('\n').forEach {
9391
consumer?.invoke("$prefix $it")
9492
}

logger/src/main/java/com/itsaky/androidide/logging/encoder/IDELogFormatEncoder.java

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,20 +17,13 @@
1717

1818
package com.itsaky.androidide.logging.encoder;
1919

20-
import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
20+
import ch.qos.logback.core.encoder.LayoutWrappingEncoder;
2121

2222
/**
2323
* Encoder to format the log events in AndroidIDE.
2424
*
2525
* @author Akash Yadav
2626
*/
27-
public class IDELogFormatEncoder extends PatternLayoutEncoder {
27+
public class IDELogFormatEncoder extends LayoutWrappingEncoder<IDELogFormatLayout> {
2828

29-
private static final String LOG_PATTERN = "%date %-5level [%thread] %logger{0}: %msg%n";
30-
31-
public IDELogFormatEncoder() {
32-
super();
33-
setPattern(LOG_PATTERN);
34-
setOutputPatternAsHeader(true);
35-
}
3629
}
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
/*
2+
* This file is part of AndroidIDE.
3+
*
4+
* AndroidIDE is free software: you can redistribute it and/or modify
5+
* it under the terms of the GNU General Public License as published by
6+
* the Free Software Foundation, either version 3 of the License, or
7+
* (at your option) any later version.
8+
*
9+
* AndroidIDE is distributed in the hope that it will be useful,
10+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
11+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12+
* GNU General Public License for more details.
13+
*
14+
* You should have received a copy of the GNU General Public License
15+
* along with AndroidIDE. If not, see <https://www.gnu.org/licenses/>.
16+
*/
17+
18+
package com.itsaky.androidide.logging.encoder;
19+
20+
import ch.qos.logback.classic.spi.ILoggingEvent;
21+
import ch.qos.logback.core.LayoutBase;
22+
import java.text.SimpleDateFormat;
23+
import java.util.Date;
24+
import java.util.Locale;
25+
26+
/**
27+
* Log layout for AndroidIDE.
28+
*
29+
* @author Akash Yadav
30+
*/
31+
public class IDELogFormatLayout extends LayoutBase<ILoggingEvent> {
32+
33+
private boolean omitMessage = false;
34+
35+
public void setOmitMessage(boolean omitMessage) {
36+
this.omitMessage = omitMessage;
37+
}
38+
39+
public boolean isOmitMessage() {
40+
return omitMessage;
41+
}
42+
43+
@Override
44+
public String doLayout(ILoggingEvent event) {
45+
final SimpleDateFormat format = new SimpleDateFormat("dd-MM HH:mm:ss.SSS", Locale.ROOT);
46+
final var date = format.format(new Date(event.getTimeStamp()));
47+
48+
final var builder = new StringBuilder();
49+
builder.append(date);
50+
builder.append(' ');
51+
builder.append(String.format(Locale.ROOT, "%5s", event.getLevel().levelStr));
52+
builder.append(' ');
53+
builder.append("[");
54+
builder.append(event.getThreadName());
55+
builder.append("]");
56+
builder.append(' ');
57+
builder.append(event.getLoggerName());
58+
builder.append(": ");
59+
60+
if (!isOmitMessage()) {
61+
builder.append(event.getFormattedMessage());
62+
builder.append(System.lineSeparator());
63+
}
64+
65+
return builder.toString();
66+
}
67+
}

subprojects/tooling-api-impl/src/test/java/com/itsaky/androidide/tooling/impl/common.kt

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,8 @@
1717

1818
package com.itsaky.androidide.tooling.impl
1919

20-
import ch.qos.logback.classic.spi.ILoggingEvent
21-
import ch.qos.logback.core.AppenderBase
2220
import com.android.builder.model.v2.ide.LibraryType
2321
import com.google.common.truth.Truth.assertThat
24-
import com.itsaky.androidide.logging.encoder.IDELogFormatEncoder
2522
import com.itsaky.androidide.tooling.api.IAndroidProject
2623
import com.itsaky.androidide.tooling.api.IJavaProject
2724
import com.itsaky.androidide.tooling.api.IProject
@@ -33,21 +30,6 @@ import com.itsaky.androidide.tooling.api.models.JavaModuleProjectDependency
3330
import com.itsaky.androidide.tooling.api.models.JavaProjectMetadata
3431
import com.itsaky.androidide.tooling.api.models.params.StringParameter
3532

36-
internal class CollectingAppender : AppenderBase<ILoggingEvent>() {
37-
38-
private val encoder = IDELogFormatEncoder()
39-
private val string = StringBuilder()
40-
41-
override fun append(eventObject: ILoggingEvent?) {
42-
string.append(encoder.layout.doLayout(eventObject))
43-
string.append(System.lineSeparator())
44-
}
45-
46-
override fun toString(): String {
47-
return string.toString()
48-
}
49-
}
50-
5133
internal fun performBasicProjectAssertions(project: IProject, server: IToolingApiServer) {
5234
assertThat(project).isNotNull()
5335

0 commit comments

Comments
 (0)