• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

devonfw / IDEasy / 22203456564

19 Feb 2026 10:51PM UTC coverage: 70.112% (-0.4%) from 70.474%
22203456564

Pull #1710

github

web-flow
Merge 97cf467e5 into 379acdc9d
Pull Request #1710: #404: allow logging via SLF4J

4065 of 6386 branches covered (63.65%)

Branch coverage included in aggregate %.

10580 of 14502 relevant lines covered (72.96%)

3.16 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

89.06
cli/src/main/java/com/devonfw/tools/ide/log/IdeLoggerImpl.java
1
package com.devonfw.tools.ide.log;
2

3
import java.util.Objects;
4
import java.util.function.Function;
5

6
/**
7
 * Implementation of {@link IdeLogger}.
8
 */
9
public class IdeLoggerImpl implements IdeLogger {
10

11
  private final AbstractIdeSubLogger[] loggers;
12

13
  protected final IdeLogListener listener;
14

15
  private static IdeLogger instance;
16

17
  /**
18
   * @param minLogLevel the minimum enabled {@link IdeLogLevel}.
19
   * @param factory the factory to create active {@link IdeSubLogger} instances.
20
   */
21
  public IdeLoggerImpl(IdeLogLevel minLogLevel, Function<IdeLogLevel, AbstractIdeSubLogger> factory) {
22

23
    super();
2✔
24
    IdeLogLevel[] levels = IdeLogLevel.values();
2✔
25
    this.loggers = new AbstractIdeSubLogger[levels.length];
5✔
26
    IdeLogListener listener = null;
2✔
27
    for (IdeLogLevel level : levels) {
16✔
28
      this.loggers[level.ordinal()] = factory.apply(level);
9✔
29
      if (listener == null) {
2✔
30
        listener = this.loggers[level.ordinal()].listener;
7✔
31
      }
32
    }
33
    this.listener = listener;
3✔
34
    setLogLevel(minLogLevel);
4✔
35
    IdeLoggerImpl.instance = this;
2✔
36
  }
1✔
37

38
  @Override
39
  public IdeSubLogger level(IdeLogLevel level) {
40

41
    IdeSubLogger logger = this.loggers[level.ordinal()];
6✔
42
    Objects.requireNonNull(logger);
3✔
43
    return logger;
2✔
44
  }
45

46
  /**
47
   * Sets the log level.
48
   *
49
   * @param logLevel {@link IdeLogLevel}
50
   * @return the previous set logLevel {@link IdeLogLevel}
51
   */
52
  public IdeLogLevel setLogLevel(IdeLogLevel logLevel) {
53

54
    IdeLogLevel previousLogLevel = null;
2✔
55
    for (IdeLogLevel level : IdeLogLevel.values()) {
16✔
56
      boolean enabled = level.ordinal() >= logLevel.ordinal();
9✔
57
      if ((previousLogLevel == null) && this.loggers[level.ordinal()].isEnabled()) {
9!
58
        previousLogLevel = level;
2✔
59
      }
60
      setLogLevel(level, enabled);
4✔
61
    }
62
    if ((previousLogLevel == null) || (previousLogLevel.ordinal() > IdeLogLevel.INFO.ordinal())) {
7!
63
      previousLogLevel = IdeLogLevel.INFO;
×
64
    }
65
    return previousLogLevel;
2✔
66
  }
67

68
  /**
69
   * @param colored the new {@link AbstractIdeSubLogger#isColored() colored flag}.
70
   */
71
  protected void setLogColors(boolean colored) {
72

73
    for (IdeLogLevel level : IdeLogLevel.values()) {
16✔
74
      this.loggers[level.ordinal()].setColored(colored);
7✔
75
    }
76
  }
1✔
77

78
  /**
79
   * @param logLevel the {@link IdeLogLevel} to modify.
80
   * @param enabled - {@code true} to enable, {@code false} to disable.
81
   */
82
  public void setLogLevel(IdeLogLevel logLevel, boolean enabled) {
83

84
    this.loggers[logLevel.ordinal()].setEnabled(enabled);
7✔
85
  }
1✔
86

87
  /**
88
   * Ensure the logging system is initialized.
89
   */
90
  public void activateLogging() {
91

92
    if (this.listener instanceof IdeLogListenerBuffer buffer) {
9!
93
      // https://github.com/devonfw/IDEasy/issues/754
94
      buffer.flushAndEndBuffering(this);
3✔
95
    }
96
  }
1✔
97

98
  /**
99
   * Disables the logging system (temporary).
100
   *
101
   * @param threshold the {@link IdeLogLevel} acting as threshold.
102
   * @see com.devonfw.tools.ide.context.IdeContext#runWithoutLogging(Runnable, IdeLogLevel)
103
   */
104
  public void deactivateLogging(IdeLogLevel threshold) {
105

106
    if (this.listener instanceof IdeLogListenerBuffer buffer) {
9!
107
      buffer.startBuffering(threshold);
4✔
108
    } else {
109
      throw new IllegalStateException();
×
110
    }
111
  }
1✔
112

113
  /**
114
   * Internal method to set the {@link IdeLogArgFormatter}.
115
   *
116
   * @param argFormatter the {@link IdeLogArgFormatter}.
117
   */
118
  public void setArgFormatter(IdeLogArgFormatter argFormatter) {
119

120
    for (AbstractIdeSubLogger logger : this.loggers) {
17✔
121
      logger.setArgFormatter(argFormatter);
3✔
122
    }
123
  }
1✔
124

125
  /**
126
   * @return the current {@link IdeLogger} instance.
127
   */
128
  static IdeLogger getInstance() {
129

130
    return instance;
2✔
131
  }
132

133
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc